OpenCL中的popcnt?

Posted

技术标签:

【中文标题】OpenCL中的popcnt?【英文标题】:popcnt in OpenCL? 【发布时间】: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]

【问题讨论】:

【参考方案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 中将其实现为函数,但会牺牲一些速度。

【讨论】:

以上是关于OpenCL中的popcnt?的主要内容,如果未能解决你的问题,请参考以下文章

如何生成sse4.2 popcnt机器指令

使用带有向量优化的 C++20 的 std::popcount 是不是等同于 popcnt 内在函数?

用 64 位替换 32 位循环计数器会在 Intel CPU 上使用 _mm_popcnt_u64 引入疯狂的性能偏差

[WC2018]州区划分 [DP+FWT]

随机数生成器

SPOJ - LCS2