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

zen*_*nna 1 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
Run Code Online (Sandbox Code Playgroud)

int*_*jay 6

这将在C中起作用:

3 * ((n>>4 & 1) + (n>>5 & ~1))
Run Code Online (Sandbox Code Playgroud)

n线程号在哪里.

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

编辑:

这种形式,没有按位操作,可能更容易理解:

6 * (n/64) + 3 * ((n/16) % 2)
Run Code Online (Sandbox Code Playgroud)

它会给出相同的结果.n假定为整数,因此除法将向下舍入.