【发布时间】:2013-11-09 12:37:43
【问题描述】:
我对在 unsigned int 中计算 set(1) 位的内核的 opencl 实现感兴趣 我知道opencl有这样的扩展,我不想使用它,但我自己实现了
【问题讨论】:
我对在 unsigned int 中计算 set(1) 位的内核的 opencl 实现感兴趣 我知道opencl有这样的扩展,我不想使用它,但我自己实现了
【问题讨论】:
这不是您正在寻找的确切功能。但由于没有人发布 OpenCL 代码,我将添加它。它是 256 位整数的 OpenCL 位计数代码,而不是您要求的 32 位。代码来自here。它使用 Dithermaster 指出的一种众所周知的算法。转换为 32 位应该不难。
//
// popcnt256 - return population count for 256-bit value
//
uint popcnt256 (ulong4 vreg)
{
const ulong4 m1 = (ulong4)(0x5555555555555555,0x5555555555555555,0x5555555555555555,0x5555555555555555);
const ulong4 m2 = (ulong4)(0x3333333333333333,0x3333333333333333,0x3333333333333333,0x3333333333333333);
const ulong4 m4 = (ulong4)(0x0f0f0f0f0f0f0f0f,0x0f0f0f0f0f0f0f0f,0x0f0f0f0f0f0f0f0f,0x0f0f0f0f0f0f0f0f);
const ulong4 h01 = (ulong4)(0x0101010101010101,0x0101010101010101,0x0101010101010101,0x0101010101010101);
vreg -= (vreg >> 1) & m1;
vreg = (vreg & m2) + ((vreg >> 2) & m2);
vreg = (vreg + (vreg >> 4)) & m4;
vreg = (vreg * h01) >> 56;
return vreg.s0 + vreg.s1 + vreg.s2 + vreg.s3;
}
【讨论】:
大多数老式的基于 CPU 的技巧也适用于此,尽管任何循环在 GPU 上都不会很好。可能一个(非全局内存)表会工作得最好。
见:
How to count the number of set bits in a 32-bit integer?
【讨论】: