将线程编号映射到数组中的(非顺序)位置

时间:2010-02-11 15:43:27

标签: c++ cuda formula

我想映射一个thread_id。这在C / CUDA中,但它更像是我试图解决的代数问题。

所以我想要实现的映射就是这样:

  • 线程0-15:读取值数组[0]
  • 主题16-31:读取值[3]
  • 线程32-47:读取值[0]
  • 线程48-63:读取值[3]
  • 线程64-79:读取值数组[6]
  • 线程80-95:读取值数组[9]
  • 线程96-111:读取值数组[6]
  • 线程112-127:读取值数组[9]

依旧......

注意这是映射的简化,实际上有超过128个线程,但序列如图所示,线程总是映射到三的倍数。

我可以使用哪个公式来运行每个线程以找出它应该看到的数组位置?

我想在下面的示例中使用某种公式,而不是显式映射或任何if语句。

为了说明我如何解决这个需要不同映射的不同情况,即:

  • 线程0-31:读取值数组[0]
  • 线程32-63:读取值[3]

我使用了代码

rintf(float(tid)/96.0)*3

2 个答案:

答案 0 :(得分:6)

这适用于C:

3 * ((n>>4 & 1) + (n>>5 & ~1))

其中n是主题号。

我在这里假设模式继续超过128,如:0,3,0,3,6,9,6,9,12,15,12,15等。

修改

此表单没有按位操作,可能更容易理解:

6 * (n/64) + 3 * ((n/16) % 2)

它会给出相同的结果。假设n是一个整数,因此该除法将向下舍入。

答案 1 :(得分:0)

int f(int thread_id)
{
    int tmp = thread_id % 64;
    int tmp2 = thread_id / 64;
    if (tmp =< 15 || (tmp >= 32 && tmp <= 47))  {
         return tmp2 * 6;
    } else {
         return tmp2 * 6 + 3;
    }
}