【问题标题】:bitcount implementation in openclopencl中的bitcount实现
【发布时间】:2013-11-09 12:37:43
【问题描述】:

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

【问题讨论】:

    标签: opencl bit


    【解决方案1】:

    这不是您正在寻找的确切功能。但由于没有人发布 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;
        }
    

    【讨论】:

      【解决方案2】:

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

      见:

      How to count the number of set bits in a 32-bit integer?

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        相关资源
        最近更新 更多