Ich habe ein Array von Bytes, wobei jedes Byte entweder 0 oder 1 ist. Jetzt möchte ich diese Werte in Bits packen, so dass 8 Original-Bytes 1 Ziel-Byte belegen, wobei Original-Byte 0 in Bit 0, Byte 1 in Bit geht 1 usw. Bisher habe ich folgendes im Kernel:Wie packt man Bits (effizient) in 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);
}
Ist das richtig und effizient?
Dies kann nicht funktionieren. Das ist ein Erinnerungsrennen. Es gibt keine Transaktionen mit parallelen Bitgrößen in CUDA – talonmies
@talonmies, ich dachte, es gäbe keine Konkurrenz, weil Threads, die dasselbe Byte verarbeiten, zum selben Warp gehören. –
Im selben Warp zu sein ist keine Garantie für Sicherheit. Keine zwei Threads können dasselbe Byte gleichzeitig ändern, ohne ein Rennen zu verursachen. – talonmies