CUDA C++编程指南(7.19&20)——C++语言扩展之Warp投票函数和Warp匹配函数

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的位,以确保在硬件执行内置函数之前它们能正确汇聚。每个调用线程必须在掩码中设置自己的位,且掩码中指定的所有未退出线程必须使用相同的掩码执行相同的内置函数,否则结果将是未定义的。

这些内部函数不隐含内存屏障。它们不保证任何内存排序。

相关推荐
遇码几秒前
Rust 桌面应用自托管自动更新:latest.json 清单 + minisign 签名校验的完整做法
人工智能·ai·rust·大模型·agent
嘻嘻的AI日记1 分钟前
涉外涉密文件怎么译?本地化 AI 翻译,原文不出内网
人工智能
科创致远6 分钟前
第一代 e+SOP 盒子配显示器实测:物美价廉的产线可视化方案
大数据·网络·人工智能·信息可视化·计算机外设·制造·精益工程
志尊宝10 分钟前
AI原生前端开发(010):AI时代的开发者工作流重构
人工智能·重构·ai-native
努力变大白13 分钟前
用 ReAct 搭一个简单 Agent:零基础操作指南
人工智能·agent·react框架
像风一样自由202013 分钟前
59.实战为RAG系统加入评估监控权限和审计
人工智能·智能体
QYR-分析15 分钟前
汽车可开启全景天窗:座舱舒适核心配置,智能化升级打开产品溢价空间
大数据·人工智能·汽车
king135987455016 分钟前
LiteRT Tensor API:C++ 编写端侧模型图,XNNPACK、GPU 与 NPU 怎么选?
开发语言·c++·人工智能·chatgpt·架构·aigc
企业数字化笔记16 分钟前
AI视频怎么做超分辨率增强?逐帧处理、画幅控制与音画验收
网络·人工智能·音视频
解决问题no解决代码问题19 分钟前
Java 金融后端转 LLM 应用开发 Day3:LLM 写作 / 阅读 / 聊天能力拆解与核心边界(附金融场景落地方法)
人工智能