经线中的线程是不是同步执行指令?块中的线程呢?
Posted
技术标签:
【中文标题】经线中的线程是不是同步执行指令?块中的线程呢?【英文标题】:Do threads in a warp execute instructions in sync? What about threads in a block?经线中的线程是否同步执行指令?块中的线程呢? 【发布时间】:2014-01-11 03:05:21 【问题描述】:我有一个 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;
【问题讨论】:
我想this回答你的问题 【参考方案1】:warp 中的线程是否同步执行指令?
是:Warp 同步执行指令。
块中的线程呢?
否:一个块由一个或多个经线组成。块中的扭曲不一定是同步的,而且通常不会。
合并是指与单个指令相关的内存事务,由单个 warp 执行。 (没有适用于多个 warp 的合并概念。)如果所有这些内存事务都位于全局内存的一个自然对齐的 128 字节段内,那么这些事务将在内存控制器内“合并”,并满足单个事务到内存。这种行为有许多细微差别,但该声明通常对 cc2.0 和更新的设备具有指导意义。对于 cc2.0 之前的设备,可能还有一些额外的注意事项需要考虑。
查看您的代码并确定生成的事务是否会合并是不可能的。有必要知道i
和j
的定义,尤其是当它们与内置线程ID 变量(例如threadIdx.x
)相关时同时需要查看比您现在显示的更多的代码。
【讨论】:
以上是关于经线中的线程是不是同步执行指令?块中的线程呢?的主要内容,如果未能解决你的问题,请参考以下文章