关于warp投票功能

时间:2012-05-11 19:10:04

标签: cuda gpu gpgpu

CUDA编程指南介绍了warp vote函数的概念,“_ all”,“ _any”和“__ballot”。

我的问题是:哪些应用程序将使用这3个功能?

4 个答案:

答案 0 :(得分:4)

CUDA-histogram和CUDA NPP库中使用

__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)。

Here it is a link to the paper: In-k Stream Compaction

答案 3 :(得分:0)

CUDA提供了几种全局广播和减少操作,NVIDIA的架构可以有效地支持这些操作。例如,__ ballot(谓词)指令为warp的所有活动线程计算谓词,并返回一个整数,其N th 位设置为当且仅当谓词为N 的计算结果为非零时经线和 线程的线程处于活动状态[参考:GPU架构的灵活软件配置文件]。