7.19. Warp投票函数
int __all_sync(unsigned mask, int predicate);
int __any_sync(unsigned mask, int predicate);
unsigned __ballot_sync(unsigned mask, int predicate);
unsigned __activemask();
弃用通知:__any、__all和__ballot已在CUDA 9.0中对所有设备弃用。
移除通知:当目标设备的计算能力为7.x或更高时,__any、__all和__ballot将不再可用,应改用它们的同步变体。
warp投票函数允许给定warp中的线程执行归约-广播操作。这些函数接收warp中每个线程的整数predicate作为输入,并将这些值与零进行比较。比较结果通过以下方式之一在warp的active线程间进行组合(归约),并将单个返回值广播给每个参与的线程:
__all_sync(unsigned mask, predicate):
对mask中所有未退出的线程评估predicate,当且仅当所有线程的predicate评估结果均为非零时返回非零值。
__any_sync(unsigned mask, predicate):
对mask中所有未退出的线程评估predicate,当且仅当任意线程的predicate评估结果非零时返回非零值。
__ballot_sync(unsigned mask, predicate):
对mask中所有未退出的线程评估predicate,并返回一个整数值。当且仅当warp中第N个线程的predicate评估结果非零且该线程处于活动状态时,该整数值的第N位将被置位。
__activemask():
返回调用线程束中当前所有活动线程的32位整数掩码。当调用__activemask()时,如果线程束中的第N条通道处于活动状态,则设置第N位。非活跃线程在返回的掩码中用0表示。已退出程序的线程始终标记为非活动状态。请注意,在__activemask()调用处收敛的线程不能保证在后续指令中保持收敛,除非这些指令是同步的线程束内置函数。
对于__all_sync、__any_sync和__ballot_sync,必须传入一个指定参与调用的线程掩码。每个参与线程必须设置代表其通道ID的位,以确保在硬件执行该内置函数前这些线程能正确汇聚。每个调用线程必须在掩码中设置自己的位,且掩码中指定的所有未退出线程必须使用相同的掩码执行相同的内置函数,否则结果将是未定义的。
这些内部函数不隐含内存屏障。它们不保证任何内存排序。
7.20. Warp匹配函数
__match_any_sync 和 __match_all_sync 在warp内的线程之间执行变量的广播-比较操作。
支持计算能力7.x或更高的设备。
7.20.1. 概述
unsigned int __match_any_sync(unsigned mask, T value);
unsigned int __match_all_sync(unsigned mask, T value, int *pred);
T 可以是 int、unsigned int、long、unsigned long、long long、unsigned long long、float 或 double。
7.20.2. 描述
__match_sync() 内部函数允许在对 mask 中指定的线程进行同步后,在线程束(warp)中的线程之间广播并比较值 value。
__match_any_sync
返回mask中与value值相同的线程掩码
__match_all_sync
如果mask中所有线程的value值相同,则返回mask;否则返回0。如果mask中所有线程的value值相同,则谓词pred设为true;否则谓词设为false。
新的*_sync匹配内置函数接收一个掩码,指示参与调用的线程。每个参与线程必须设置一个代表其通道ID的位,以确保在硬件执行内置函数之前它们能正确汇聚。每个调用线程必须在掩码中设置自己的位,且掩码中指定的所有未退出线程必须使用相同的掩码执行相同的内置函数,否则结果将是未定义的。
这些内部函数不隐含内存屏障。它们不保证任何内存排序。