【发布时间】:2016-02-29 08:51:01
【问题描述】:
在 CUDA 中,有 __ballot()、__any()、__all()、__popc() 和一组 lanemask 函数,用于在 warp 内的所有通道(通常大小为 32)上执行 warp 投票操作。我想知道 OpenCL 中是否有任何此类功能可以在一个波前执行相同的操作。如果没有这样的函数,我可能需要自己将它们实现为内联函数,以便在我的项目中使用。
【问题讨论】:
在 CUDA 中,有 __ballot()、__any()、__all()、__popc() 和一组 lanemask 函数,用于在 warp 内的所有通道(通常大小为 32)上执行 warp 投票操作。我想知道 OpenCL 中是否有任何此类功能可以在一个波前执行相同的操作。如果没有这样的函数,我可能需要自己将它们实现为内联函数,以便在我的项目中使用。
【问题讨论】:
根据OpenCL v. 1.1 specification,第6.11节“内置函数”,我相信答案是否定的。
但是在 NVIDIA GPU 上,您可能可以使用内联 PTX 来实现这些东西(或至少 this blogger was able to use inline PTX)。
【讨论】:
实际上请查看 OpenCL subgroups。他们定义了一些交叉车道功能,例如sub_group_all() 和sub_group_any() 以及其他一些有趣的东西。
子群是一个相对较新的生物,我不确定谁都支持它。 Intel GPU 实现(实际上是扩展)有一些更有趣的shuffling functions 来置换通道(在寄存器文件中)以及进行显式块写入和读取。我敢打赌 AMD 也支持子组,但我不确定 NVidia。
【讨论】: