OpenCL中的popcnt?
Posted
技术标签:
【中文标题】OpenCL中的popcnt?【英文标题】:popcnt in OpenCL? 【发布时间】:2011-05-06 22:49:28 【问题描述】:较新的 NVIDIA GPU 支持 __popc(x) 指令,该指令计算 32 位寄存器中设置的位数。
我是 99% OpenCL 不支持内联汇编器,除非它是供应商内核扩展。
1) AMD 硬件是否支持此功能? (我不知道)。
2) 对于 OS X 和 Linux,如何截取编译成的 NVIDIA 中间语言以便插入?
我想出了如何在 PyOpenCL 中转储 PTX“二进制”,现在我只需要弄清楚如何通过修改重新插入它。
#create the program
self.program = cl.Program(self.ctx, fstr).build()
print self.program.BINARIES[0]
【问题讨论】:
【参考方案1】:NVIDIA 的 nvcc 支持使用“asm”关键字在 OpenCL 代码中进行内联 PTX 汇编。该符号类似于 GCC 内联汇编。我目前使用这个:
inline uint popcnt(const uint i)
uint n;
asm("popc.b32 %0, %1;" : "=r"(n) : "r" (i));
return n;
在 Ubuntu Linux 上测试并运行。
如果您想了解更多信息,请查看 NVIDIA 的 oclInlinePTX 代码示例和 PTX ISA 文档。
如果您使用的是 AMD 或 Intel 卡,则无关紧要,因为您可以使用 OpenCL 1.2 中的内置 popcount 指令。
【讨论】:
【参考方案2】:据我所知,当前的任何 OpenCL 实现中都没有内联汇编,在 OS X 或 Linux 上的 JIT 编译周期中也没有任何方法可以拦截 PTX(或 CAL)。
popc
是 NVIDIA 计算 2.x 硬件中的硬件指令,但在计算 1.x 硬件中它是模拟的。您可以在 CUDA 工具包的 device_functions.h 中找到它的代码。您总是可以在 OpenCL 中将其实现为函数,但会牺牲一些速度。
【讨论】:
以上是关于OpenCL中的popcnt?的主要内容,如果未能解决你的问题,请参考以下文章
使用带有向量优化的 C++20 的 std::popcount 是不是等同于 popcnt 内在函数?