繁体   English   中英

CUDA 中 __reduce_max_sync() 的 8.x 之前版本

[英]Pre 8.x equivalent of __reduce_max_sync() in CUDA

cuda-memcheck在执行以下操作的代码中检测到竞争条件:

condition = /*different in each thread*/;
shared int owner[nWarps];
/* ... owner[i] is initialized to blockDim.x+1 */
if(condition) {
    owner[threadIdx.x/32] = threadIdx.x;
}

所以基本上这段代码根据某些条件计算每个扭曲的所有者线程。 对于某些扭曲,可能没有所有者,但对于某些扭曲,所有者的数量可能超过 1,然后会发生竞争条件,因为多个线程将值分配给同一个共享内存区域。

在尝试了文档后,我认为可以通过以下方式完成我需要的操作:

const uint32_t mask = __ballot_sync(0xffffffff, condition);
if(mask != 0) {
    const unsigned max_owner = __reduce_max_sync(mask, threadIdx.x);
    if(threadIdx.x == max_owner) {
        // at most 1 thread assigns here per warp
        owner[threadIdx.x/32] = max_owner;
    }
}

但是,我的尝试有两个问题:

  1. 我真的不需要找到最大线程 - 如果存在condition==true线程,则为每个经线选择任意 1 个线程就足够了
  2. 它需要CUDA计算能力8.x,而我需要支持5.2计算能力的设备

你能帮我解决上面的问题吗?

下面的函数似乎解决了这个问题:

void SetOwnerThread(int* dest, const bool condition) {
  const uint32_t mask = __ballot_sync(0xffffffff, condition);
  if(!mask) {
    return;
  }
  const uint32_t lowest_bit = mask & -mask;
  const uint32_t my_bit = (1 << (threadIdx.x & 31));
  if(lowest_bit == my_bit) {
    dest = threadIdx.x;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM