如何正确使用__shfl_up_sync实现少量线程束通道间的数据传输
CUDA通道传输的掩码选择问题
假设我需要将数据从通道29传输到30,同时从通道30传输到31,应该使用什么掩码?
当然掩码需要覆盖通道30、31以及29(CUDA指南指出源通道也需要参与);但该指令需要在通道29上调用——那么我需要不断扩展掩码(最终使用全掩码),还是直接使用0xE0000000,让通道29返回未定义结果即可(反正它不需要该结果)?
直接用0xE0000000就足够,没必要扩展成全掩码,原因如下:
- CUDA shuffle类指令的掩码只需覆盖所有参与数据传输的源和目标通道,
0xE0000000对应二进制位29、30、31置1,刚好包含了本次传输涉及的所有通道,满足要求。 - 发起指令的通道29即便返回未定义结果也不影响,因为你本来就不需要它的结果,只要掩码覆盖了它,它作为源通道的传输逻辑就能正常执行。
- 用全掩码会让所有通道都参与操作,平白增加性能开销,完全没必要。
内容的提问来源于stack exchange,提问作者Y.F.
相关产品推荐
相关产品推荐

