经线中的线程是不是同步执行指令?块中的线程呢?

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 之前的设备,可能还有一些额外的注意事项需要考虑。

查看您的代码并确定生成的事务是否会合并是不可能的。有必要知道ij 的定义,尤其是当它们与内置线程ID 变量(例如threadIdx.x)相关时同时需要查看比您现在显示的更多的代码。

【讨论】:

以上是关于经线中的线程是不是同步执行指令?块中的线程呢?的主要内容,如果未能解决你的问题,请参考以下文章

线程同步的目的

Java线程安全问题代码实现

Java中的线程同步与异步如何理解?

cuda基础---cuda通信机制

cuda基础---cuda通信机制

看完这篇还不懂高并发中的线程与线程池你来打我(内含20张图)