1

我想映射一个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 个线程,但顺序如图所示,线程总是映射到 3 的倍数。

我可以使用什么公式让每个线程都可以运行来找出它应该查看的数组位置?

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

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

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

我使用了代码

rintf(float(tid)/96.0)*3
4

2 回答 2

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假定为整数,因此除法将向下舍入。

于 2010-02-11T15:57:22.097 回答
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;
    }
}
于 2010-02-11T16:04:04.793 回答