Cuda OpenCL中的popcnt?
较新的NVIDIA GPU支持对32位寄存器中设置的位数进行计数的_popc(x)指令 我很抱歉,OpenCL不支持内联汇编程序,除非它是供应商的内核扩展 1) AMD硬件支持这个吗?(我不知道) < P > 2)对于OS X和Linux,如何拦截编译的英伟达中间语言,以便插入这个? 我知道了如何在PyOpenCL中转储PTX“binary”,现在我只需要知道如何通过修改重新插入它Cuda OpenCL中的popcnt?,cuda,opencl,gpu,Cuda,Opencl,Gpu,较新的NVIDIA GPU支持对32位寄存器中设置的位数进行计数的_popc(x)指令 我很抱歉,OpenCL不支持内联汇编程序,除非它是供应商的内核扩展 1) AMD硬件支持这个吗?(我不知道) < P > 2)对于OS X和Linux,如何拦截编译的英伟达中间语言,以便插入这个? 我知道了如何在PyOpenCL中转储PTX“binary”,现在我只需要知道如何通过修改重新插入它 #create the program self.program = cl.Program(self.ctx, f
#create the program
self.program = cl.Program(self.ctx, fstr).build()
print self.program.BINARIES[0]
据我所知,在任何当前的OpenCL实现中都没有内联程序集,在OS X或Linux上的JIT编译周期中也没有任何方法可以拦截PTX(或CAL)
popc
是NVIDIA compute 2.x硬件中的一条硬件指令,但在compute 1.x硬件中它是仿真的。您可以在CUDA工具包的device_functions.h中找到它的代码。您可以在OpenCL中以牺牲一些速度的方式将其作为函数来实现。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指令