优化线程同时检查

时间:2012-07-01 15:10:48

标签: parallel-processing cuda gpgpu

我有一个使用线程检查字节数组的设备函数,每个线程检查数组中不同的字节是否有某个值,并返回bool true或false。

如何有效地确定所有支票是否都返回true或其他?

1 个答案:

答案 0 :(得分:2)

// returns true if predicate is true for all threads in a block
__device__ bool unanimous(bool predicate) { ... }

__device__ bool all_the_same(unsigned char* bytes, unsigned char value, int n) {
    return unanimous(bytes[threadIdx.x] == value);
}

unanimous()的实现取决于硬件的计算能力。对于计算能力2.0或更高的设备,它是微不足道的:

__device__ bool unanimous(bool predicate) { return __syncthreads_and(predicate); }

对于计算能力1.0和1.1设备,您需要实现AND减少(读者练习,因为它有详细记录)。对于计算能力1.3的特殊情况,您可以使用warp投票指令优化AND减少,使用CUDA标头中提供的__all()内在函数。

修改

好的,因为gamerx在评论中提问。在sm_13硬件上,您可以这样做。

// returns true if predicate is true for all threads in a block
// note: supports maximum of 1024 threads in block as written
__device__ bool unanimous(bool predicate) {
    __shared__ bool warp_votes[32];
    if (threadIdx.x < warpSize) warp_votes[threadIdx.x] = true;
    warp_votes[threadIdx.x / warpSize] = __all(pred);
    __syncthreads();
    if (threadIdx.x < warpSize) warp_votes[0] = __all(warp_votes[threadIdx.x];
    __syncthreads();
    return warp_votes[0];
}