CUDA编程指南介绍了warp vote函数的概念,“_ all”,“ _any”和“__ballot”。
我的问题是:哪些应用程序将使用这3个功能?
答案 0 :(得分:4)
__ballot
来快速生成位掩码,并将其与__popc
内部函数相结合,以便非常有效地实现布尔缩减。
__all
之前, __any
和__ballot
用于缩减,但我无法想到它们的任何其他用途。
答案 1 :(得分:3)
__ballot
的原型如下
unsigned int __ballot(int predicate);
如果predicate
非零,__ballot
返回设置了N
位的值,其中N
是线程索引。
结合atomicOr
和__popc
,它可用于累积具有真实谓词的每个warp中的线程数。
确实,atomicOr
的原型是
int atomicOr(int* address, int val);
和atomicOr
读取address
指向的值,使用OR
执行按位val
操作,并将值写回address
并返回它的旧值作为返回参数。
另一方面,__popc
返回使用32
- 位参数设置的位数。
因此,说明
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]));
可用于计算谓词为真的线程数。
有关详细信息,请参阅Shane Cook,CUDA编程,Morgan Kaufmann
答案 2 :(得分:1)
作为使用__ballot
API的算法示例,我会提到DM Hughes et Al的 In-Kernel Stream Compaction。它用于前缀流压缩的总和部分计算传递谓词的元素数(每个warp)。
答案 3 :(得分:0)
CUDA提供了几种全局广播和减少操作,NVIDIA的架构可以有效地支持这些操作。例如,__ ballot(谓词)指令为warp的所有活动线程计算谓词,并返回一个整数,其N th 位设置为当且仅当谓词为N 的计算结果为非零时经线和 线程的线程处于活动状态[参考:GPU架构的灵活软件配置文件]。