Indexing Cuda线程线性索引

Indexing Cuda线程线性索引,indexing,cuda,Indexing,Cuda,我需要对我的线程进行线性索引,以确保前32个线程属于同一个扭曲,也就是说,线性索引遵循内部创建扭曲的方式。换句话说,是用于创建类c或类fortran的扭曲的线性索引。为了解释这一点,考虑一个大小为2x5的线程块。我可以创建一个遵循fortran或c约定的线性索引: 0, 1, 2, 3, 4 5, 6, 7, 8, 9 vs 对于大型阵列,我希望确保前32个线程都在同一个扭曲中。如何正确地生成线性索引?您的线程以32个为一组进行调度。线程0到31落在第一个经纱中,32到63落在第二个经纱中,依

我需要对我的线程进行线性索引,以确保前32个线程属于同一个扭曲,也就是说,线性索引遵循内部创建扭曲的方式。换句话说,是用于创建类c或类fortran的扭曲的线性索引。为了解释这一点,考虑一个大小为2x5的线程块。我可以创建一个遵循fortran或c约定的线性索引:

0, 1, 2, 3, 4
5, 6, 7, 8, 9
vs


对于大型阵列,我希望确保前32个线程都在同一个扭曲中。如何正确地生成线性索引?

您的线程以32个为一组进行调度。线程0到31落在第一个经纱中,32到63落在第二个经纱中,依此类推。如果
线程%32!=0时,最后一个扭曲被“影子”线程填充(因此您必须创建一种机制来防止该线程访问错误的内存位置,通常是
if
语句)

您无法更改此顺序,因此前32个线程将始终处于同一扭曲中。尽管处于第一个扭曲中,但这并不保证该扭曲将首先执行,SM会在方便的时候安排扭曲

答复如下:

螺纹按x、y、z的顺序分组为翘曲。因此,16x16螺纹块在前32个螺纹扭曲中的螺纹顺序如下:

扭曲:线程ID(x、y、z)


所以我的问题有点不同;我想问的是如何从索引threadIdx.x和threadIdx.y中找到“前32个线程”好的,那么你的问题是,线程的多维排列是如何映射到warps上的?我认为这个示例有点混乱。线程
(0-31,--,-)
处于同一扭曲中。请看另一个答案。称为“扭曲”的列应为“扭曲车道”。否则,你说的是x维中的前32个线程处于不同的扭曲中。当然,你是对的。今晚我会尽力澄清的,谢谢!
0, 2, 4, 6, 8
1, 3, 5, 7, 9
0: 0,0,0
1: 1,0,0
2: 2,0,0
3: 3,0,0
...
15: 15,0,0
16: 0,1,0
17: 1,1,0
18: 2,1,0
19: 3,1,0
...
31: 15,1,0