我想编写一个GPU程序(最好是OpenCL),大部分计算包括计算位数组中的1的数量(打包为long或int)。
因此,在现代CPU上,我显然只使用本机__popcnt指令。我在互联网上的几个地方读到了现代GPU,这个指令也存在于硬件中,对我来说这将是一个巨大的加速。 (至少32位,不确定64位)
但是,我发现这条指令无处可寻。所以:
1)我应该如何找出具有此指令的GPU? (我仍然需要购买我的GPU,因此它将是一款现代高端产品......可能是Radeon HD7000系列或nVidia Kepler)
2)如何从OpenCL(或类似的GPU语言)调用此指令?
答案 0 :(得分:5)
这可以作为扩展名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