popCL中的popcnt?

时间:2011-05-06 22:49:29

标签: cuda opencl gpu

较新的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 个答案:

答案 0 :(得分:2)

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指令。

答案 1 :(得分:1)

据我所知,在任何当前的OpenCL实现中都没有内联汇编,也没有任何方法可以在OS X或Linux上的JIT编译周期中拦截PTX(或CAL)。

popc是NVIDIA计算2.x硬件中的硬件指令,但在计算1.x硬件中,它是模拟的。您可以在CUDA工具包的device_functions.h中找到它的代码。您总是可以在OpenCL中将其实现为函数,但会牺牲一些速度。