原型__ballot
如下
unsigned int __ballot(int predicate);
Run Code Online (Sandbox Code Playgroud)
如果predicate
非零,则__ballot
返回一个N
设置了第 th 位的值,其中N
是线程索引。
结合atomicOr
and __popc
,它可用于累积每个经线中具有真谓词的线程数。
确实,原型atomicOr
是
int atomicOr(int* address, int val);
Run Code Online (Sandbox Code Playgroud)
并atomicOr
读取 指向的值address
,使用 执行按位OR
运算val
,然后将值写回address
并将其旧值作为返回参数返回。
另一方面,__popc
返回使用32
-bit 参数设置的位数。
因此,指令
volatile __shared__ u32 warp_shared_ballot[MAX_WARPS_PER_BLOCK];
const u32 warp_sum = threadIdx.x >> 5;
atomicOr(&warp_shared_ballot[warp_num],__ballot(data[tid]>threshold));
atomicAdd(&block_shared_accumulate,__popc(warp_shared_ballot[warp_num]));
Run Code Online (Sandbox Code Playgroud)
可用于计算谓词为真的线程数。
有关更多详细信息,请参阅 Shane Cook、CUDA 编程、Morgan Kaufmann
__ballot
用于CUDA-histogram和 CUDA NPP 库中,用于快速生成位掩码,并将其与__popc
内在函数相结合,以非常有效地实现布尔归约。
__all
并且__any
在引入 之前被用于reduce __ballot
,虽然我想不出它们的任何其他用途。
归档时间: |
|
查看次数: |
5251 次 |
最近记录: |