较新的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]
答案 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中将其实现为函数,但会牺牲一些速度。