我有一个字节数组,其中每个字节是0或1.现在我想打包这些值的位,使8个原始字节占据1个目标字节,原始字节0进入位0,字节1进入位1,等 到目前为止,我在内核中的以下内容:如何在CUDA中高效地打包比特?
const uint16_t tid = threadIdx.x;
__shared__ uint8_t packing[cBlockSize];
// ... Computation of the original bytes in packing[tid]
__syncthreads();
if ((tid & 4) == 0)
{
packing[tid] |= packing[tid | 4] << 4;
}
if ((tid & 6) == 0)
{
packing[tid] |= packing[tid | 2] << 2;
}
if ((tid & 7) == 0)
{
pOutput[(tid + blockDim.x*blockIdx.x)>>3] = packing[tid] | (packing[tid | 1] << 1);
}
这是正确和有效的?
这不能工作。这是一场记忆赛。在CUDA – talonmies
@talonmies中没有并行比特大小的事务,我认为没有竞争,因为处理同一字节的线程属于同一个warp。 –
在同一个warp中不能保证安全性,没有两个线程可以同时修改同一个字节而不会导致竞争 – talonmies