12.7_基于断定的归约

12.7 基于断定的归约

断定(predicate)或真值(真/假)可以紧凑地表示,因为每个断定只占1位。在SM 2.0中,英伟达增加了一些指令,使断定操作更有效率。_ballot()和__popc()内置函数可用于线程束级归约,而__syncthreads_count()内置函数可用于线程块级归约。

int ballot(int p);

__ballot()对线程束内所有线程评估一个条件并返回一个32位的字,其中每个位表示线程束相应线程的条件满足情况。由于 __ballot()可以把这一结果广播给线程束的每个线程,它是针对线程束的有效归约。如果想要对线程束能够满足某个条件的线程进行计数,可以调用__popc()内置函数。

int __popc(int i);

它会返回输入字中置1的位数。SM 2.0还引入了__syncthreads_count()。

int __syncthreads_count(int p);

这一内置函数一直等待,直到线程块的所有线程束都到达了,然后把输入条件为真的线程数广播给线程块的所有线程。

由于经过一次线程束级或线程块级归约后,1位断定立刻变成5位和9或10位。这些内置函数仅用在最低级评估和归约中,意在减少所需共享内存消耗量。同时,它们极大地扩大了可以由单个线程块考虑的元素的个数。