Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda OpenCL中的popcnt?_Cuda_Opencl_Gpu - Fatal编程技术网

Cuda OpenCL中的popcnt?

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

较新的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, 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指令