如何获得设置位的相对位置

时间:2018-02-04 02:04:03

标签: c++ c cuda bit-manipulation

为简单起见,我假设warp大小为8。 我有掩码10110110,由__ballot函数返回,如上所述:

int cond = xxxx ? 1 : 0;
mask = __ballot(cond);

现在,我需要线程集合中的相对位置,哪个线程满足条件。

在上面的例子中,lan​​e id = {1,2,4,5,7}满足条件。 但是,如何用面具计算相对位置。例如,我有一个函数如下:

mask = 10110110
function(mask, 1) -> 0
function(mask, 2) -> 1
function(mask, 4) -> 2
function(mask, 5) -> 3
function(mask, 7) -> 4

如何通过按位运算实现此功能?

1 个答案:

答案 0 :(得分:3)

为了得到相对位置,我只是掩饰你的选票掩码的特定部分并计算这些掩码位。使用CUDA的__popc来计算位数,这就像

一样简单
int function(int mask, int pos)
{
    int m = (1 << pos) - 1;
    return __popc(mask & m);
}

这样,您可以计算从最右边的位到给定位置的位的设置位数,这是您描述的设置位的相对位置。请注意,此代码实际上不会计算给定位置的位,而只计算该位之前的所有设置位。 如果您不能或不想使用__popc,您可以看到仅为bitoperation(以及便携式)代码计算Hamming Weight的实现。