1

我对内核的 opencl 实现感兴趣,它计算 unsigned int 中的 set(1) 位我知道 opencl 有这样的扩展,我不想使用它,但我自己实现

4

2 回答 2

2

这不是您正在寻找的确切功能。但是由于没有人发布 OpenCL 代码,我将添加它。它是 256 位整数的 OpenCL 位计数代码,而不是您要求的 32 位。代码来自这里。它使用 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;
    }
于 2013-11-10T02:17:46.390 回答
0

大多数老式的基于 CPU 的技巧也适用于此,尽管任何循环在 GPU 上都不会很好。可能(非全局内存)表效果最好。

看:

如何计算 32 位整数中设置的位数?

http://www.geeksforgeeks.org/count-set-bits-in-an-integer/

http://gurmeet.net/puzzles/fast-bit-counting-routines/

于 2013-11-10T00:22:17.587 回答