popcnt in OpenCL?

4
新款的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]
2个回答

2
NVIDIA的nvcc支持使用“asm”关键字在OpenCL代码中嵌入inline PTX汇编。这种表示法类似于GCC inline汇编。我目前使用的是:
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指令。


1
据我所知,目前任何OpenCL实现中都没有内联汇编的支持,并且在OS X或Linux上也没有拦截JIT编译期间PTX(或CAL)的方法。 popc是NVIDIA计算2.x硬件中的一种硬件指令,但在计算1.x硬件中是通过仿真实现的。您可以在CUDA工具包中的device_functions.h中找到它的代码。您始终可以将其作为OpenCL函数实现,但速度会受到一些影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接