【问题标题】:popcnt in OpenCL?OpenCL中的popcnt?
【发布时间】:2011-05-06 22:49:28
【问题描述】:

较新的 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]

【问题讨论】:

    标签: cuda opencl gpu


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-16
        • 2012-05-12
        相关资源
        最近更新 更多