2013-11-09 66 views
1

我對opencl執行內核感興趣,它在unsigned int中計數設置(1)位 我知道opencl有這樣的擴展名,我不想使用它,但自己實現opencl中的bitcount實現

回答

2

這是不是你正在尋找的確切功能。但由於沒有人發佈OpenCL代碼,我會添加它。按照您的要求,它是OpenCL位計數代碼,用於256位整數而不是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; 
    }