我有一个CUDA内核,其中每个线程将全局数组的每个地址写入4次。似乎warp中的两个线程可能同时写入同一个地址,导致进程未合并。块中的线程怎么样?
d_next_front[i*width + j+1] = 1;
d_next[i*width + j-1] = 1;
d_next[(i+1)*width + j] = 1;
d_next[(i-1)*width + j] = 1;
答案 0 :(得分:2)
warp中的线程是否同步执行指令?
是:Warps执行同步指令。
块中的线程怎么样?
否:块由一个或多个warp组成。块中的warp不一定是同步的,通常不会同步。
Coalescing 是指与单个指令相关联的内存事务,由单个warp执行。 (没有适用于多个warp的合并概念。)如果所有这些内存事务都位于一个自然对齐的128字节全局内存段中,那么事务将在内存控制器中“合并”,并通过单个事务到内存。这种行为有许多细微差别,但该声明对于cc2.0和更新的设备通常具有指导意义。对于cc2.0之前的设备,可能需要考虑一些额外的注意事项。
无法查看您的代码并确定生成的事务是否会合并。有必要了解i
和j
的定义,尤其是它们与内置线程ID变量(如threadIdx.x
相关)同样,了解warp中的两个线程是否可以同时写入同一位置需要查看比现在显示的代码更多的代码。