OpenCL 中的 popcnt?
较新的 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]
Newer NVIDIA GPUs support a __popc(x) instruction that counts the number of bits set in a 32 bit register.
I am 99% OpenCL does not support inline assembler unless it is a vendor kernel extension.
1) Does AMD hardware support this yet? (I am not aware of it).
2) For OS X and Linux, how do you intercept the NVIDIA intermediate language that it is compiled to so you could insert this?
I figured out how to dump the PTX "binary" in PyOpenCL, now I just need to figure out how to re-insert it with modifications.
#create the program
self.program = cl.Program(self.ctx, fstr).build()
print self.program.BINARIES[0]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
NVIDIA 的 nvcc 支持使用“asm”关键字在 OpenCL 代码内进行内联 PTX 汇编。该表示法类似于 GCC 内联汇编。我目前使用这个:
在 Ubuntu Linux 上测试和工作。
如果您想了解更多信息,请查看 NVIDIA 的 oclInlinePTX 代码示例和 PTX ISA 文档。
如果您使用的是 AMD 或 Intel 卡,则无关紧要,因为您可以仅使用 OpenCL 1.2 中的内置 popcount 指令。
NVIDIA's nvcc supports inline PTX assembly inside OpenCL code using the 'asm' keyword. The notation is similar to GCC inline assembly. I currently use this:
Tested and working on Ubuntu Linux.
If you want more information check NVIDIA's oclInlinePTX code sample and the PTX ISA documentation.
If you are using an AMD or Intel card it is irrelevant as you can just use the built-in popcount instruction in OpenCL 1.2.
据我所知,当前任何 OpenCL 实现中都没有内联汇编,也没有任何方法可以在 OS X 或 Linux 上的 JIT 编译周期期间拦截 PTX(或 CAL)。
popc 是 NVIDIA 计算 2.x 硬件中的硬件指令,但在计算 1.x 硬件中它是被模拟的。您可以在 CUDA 工具包的 device_functions.h 中找到它的代码。您始终可以将其实现为 OpenCL 中的函数,但会牺牲一些速度。
To the best of my knowledge, there is no inline assembly in any current OpenCL implementation, nor it there any way to intercept PTX (or CAL) during the JIT compilation cycle on OS X or Linux.
popc
is a hardware instruction in NVIDIA compute 2.x hardware, but in compute 1.x hardware it is emulated. You can find the code for it in device_functions.h in the CUDA toolkit. You could always implement it as function in OpenCL, at the expense of some speed.