我需要以这样的方式线性索引我的线程,即我确定它们中的前32个属于同一个warp,即线性索引遵循warp在内部创建的方式。换句话说,是用于创建类似于经线的线性索引。为了解释这一点,考虑一个大小为2x5的线程块。我可以创建一个遵循fortran或c约定的线性索引:
0, 1, 2, 3, 4
5, 6, 7, 8, 9
VS
0, 2, 4, 6, 8
1, 3, 5, 7, 9
对于大型数组,我想确保我的前32个线程都在同一个warp中。如何生成线性索引的正确方法?
答案 0 :(得分:2)
您的线程以32个为一组进行安排。线程0到31落在第一个warp中,32-63落在第二个warp中,依此类推。如果是threads%32 != 0
,那么最后一个经线会被" shadow"填充。线程(因此您必须创建一种机制来阻止此线程访问错误的内存位置,通常是if
语句)。
您无法更改此顺序,因此前32个线程将始终处于相同的warp中。尽管处于第一次扭曲中,但这并不保证这种扭曲将首先执行,SM会在方便时安排扭曲。
来自this回答:
线程按x,y,z的顺序分组为warp。因此,在第一个32线程warp中,16x16线程块将按以下顺序包含线程:
warp:线程ID(x,y,z)
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