我想映射一个thread_id。这在C / CUDA中,但它更像是我试图解决的代数问题。
所以我想要实现的映射就是这样:
依旧......
注意这是映射的简化,实际上有超过128个线程,但序列如图所示,线程总是映射到三的倍数。
我可以使用哪个公式来运行每个线程以找出它应该看到的数组位置?
我想在下面的示例中使用某种公式,而不是显式映射或任何if语句。
为了说明我如何解决这个需要不同映射的不同情况,即:
我使用了代码
rintf(float(tid)/96.0)*3
答案 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;
}
}