我想为 GPU(最好是 OpenCL)编写一个程序,并且很大一部分计算包括计算位数组(打包为 long 或 int)中 1 的数量。
因此,在现代 CPU 上我显然只会使用 native __popcnt 指令。我在互联网上的几个地方读到现代 GPU,该指令也存在于硬件中,这对我来说将是一个巨大的加速。 (至少对于 32 位,不确定 64 位)
但是,我找不到如何使用此指令的地方。所以:
1) 我应该如何找出哪些 GPU 有此指令? (我仍然需要购买我的 GPU,所以它将是一个现代的高端 GPU...可能是 Radeon HD7000 系列或 nVidia Kepler)
2)如何从OpenCL(或类似的GPU语言)调用该指令?
最佳答案
这可以作为扩展 cl_amd_popcnt 使用。我有一个 Radeon 6870 卡和 opteron 6128 cpu,都支持扩展。
对您来说更好的消息是,从 OpenCL 1.2 开始,它不再是扩展。请参阅引用卡和规范中的 popcount 说明。 AMD 7xxx 系列硬件兼容 OCL 1.2,我想新的 Nvidia 东西也是如此。
“T 的类型为 char、charn、uchar、ucharn、short、shortn、ushort, ushortn、int、intn、uint、uintn、long、longn、ulong 或 ulongn, 其中 n 为 2、3、4、8 或 16"
T popcount(T x) 返回 x 中填充的(非零)位数。
http://www.khronos.org/registry/cl/sdk/1.2/docs/OpenCL-1.2-refcard.pdf
关于OpenCL:GPU 上的 32 位和 64 位 popcnt 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9140923/