【问题标题】:How to get the relative position in set bit如何获取设置位中的相对位置
【发布时间】:2018-02-04 10:30:49
【问题描述】:

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

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

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

在上面的示例中,车道 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

如何按位运算来实现这个功能?

【问题讨论】:

  • 请注意,一般情况下,您不应编写以下划线开头的函数或变量名称。 C11 §7.1.3 Reserved identifiers 表示以两个下划线或一个下划线和一个大写字母开头的名称无条件保留用于实现,因此__ballot() 最好由您的系统提供,而不是您编写的内容。
  • @JonathanLeffler 我假设您指的是__ballot。这是特定于 CUDA 的语法,不是由 OP 创建的,请参阅 here ,其中显示了 __ballot_sync;以前的 CUDA 版本定义了一个函数 __ballot 作为实现的一部分。
  • @RobertCrovella:很好——我的评论很好地涵盖了这个案例。是系统提供的东西,所以使用是OK的,我的评论也是这么说的。

标签: c++ c cuda bit-manipulation


【解决方案1】:

为了获得相对位置,我只需屏蔽选票掩码的特定部分并计算这些掩码位。使用 CUDA 的 __popc 来计算位数,就这么简单

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

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

【讨论】:

  • 天哪,这行得通。太感谢了。试了几次,结合按位运算,挣扎了半个小时。你的代码很神奇!!!
  • @gengliang 总是乐于提供帮助 :) 如果您喜欢,请不要忘记标记已回答 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多