我有一个使用线程检查字节数组的设备函数,每个线程检查数组中不同的字节是否有某个值,并返回bool true或false。
如何有效地确定所有支票是否都返回true或其他?
答案 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];
}