各バイトが 0 または 1 のバイト配列があります。これらの値をビットにパックして、元の 8 バイトが 1 つのターゲット バイトを占め、元のバイト 0 がビット 0、バイト 1 がビット 1 になるようにします。など。これまでのところ、カーネルには次のものがあります。
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);
}
これは正しく効率的ですか?