【发布时间】:2020-01-02 16:02:25
【问题描述】:
假设我们有以下代码:
while (condition) {
...
for (uint32_t gap = x >> 1; gap > 0; gap >>= 1) {
val += __shfl_down_sync(mask, val, gap);
}
if (warpLane == 0)
atomicAdd(&global_memory[threadIdx.x], val);
...
}
在这种情况下,如果warp中的线程按以下顺序进入while循环:
全部 32 个线程,全部 32 个线程,只有 16 个线程。
如何获得参与 while 循环语句的线程掩码?
根据https://devblogs.nvidia.com/using-cuda-warp-level-primitives 中描述的指南,以下代码可能会导致未定义的行为:
while (condition) {
uint32_t active = __activemask();
for (uint32_t gap = x >> 1; gap > 0; gap >>= 1) {
val += __shfl_down_sync(active, val, gap);
}
if (warpLane == 0)
atomicAdd(&global_memory[threadIdx.x], val);
...
}
根据指南,__activemask() 可能不会像我预期的那样生成掩码。
根据上述指南,以下也会导致未定义的行为:
while (condition) {
uint32_t active = __activemask();
for (uint32_t gap = x >> 1; gap > 0; gap >>= 1) {
val += __shfl_down_sync(active, val, gap);
}
if (warpLane == 0)
atomicAdd(&global_memory[threadIdx.x], val);
...
__warpsync(active);
}
那么,如何正确获取口罩呢?
【问题讨论】:
标签: cuda