为简单起见,我假设warp大小为8。 我有掩码10110110,由__ballot函数返回,如上所述:
int cond = xxxx ? 1 : 0;
mask = __ballot(cond);
现在,我需要线程集合中的相对位置,哪个线程满足条件。
在上面的例子中,lane 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
如何通过按位运算实现此功能?
答案 0 :(得分:3)
为了得到相对位置,我只是掩饰你的选票掩码的特定部分并计算这些掩码位。使用CUDA的__popc
来计算位数,这就像
int function(int mask, int pos)
{
int m = (1 << pos) - 1;
return __popc(mask & m);
}
这样,您可以计算从最右边的位到给定位置的位的设置位数,这是您描述的设置位的相对位置。请注意,此代码实际上不会计算给定位置的位,而只计算该位之前的所有设置位。
如果您不能或不想使用__popc
,您可以看到仅为bitoperation(以及便携式)代码计算Hamming Weight的实现。