如果块中的所有线程绝对需要在代码中的同一点,如果正在启动的线程数等于warp中的线程数,我们是否需要__syncthreads函数? / p>
注意:没有额外的线程或块,只需要内核的单个warp。
示例代码:
shared _voltatile_ sdata[16];
int index = some_number_between_0_and_15;
sdata[tid] = some_number;
output[tid] = x ^ y ^ z ^ sdata[index];
答案 0 :(得分:8)
更新了有关使用易失性
的更多信息大概你希望所有线程都处于同一点,因为它们正在读取其他线程写入共享内存的数据,如果你正在启动单个warp(在每个块中),那么你知道所有线程都在一起执行。从表面上看,这意味着你可以省略__syncthreads()
,这种做法被称为“扭曲同步编程”。但是,有一些事情需要注意。
__syncthreads()
充当了屏障,因此确保在其他线程读取数据之前将数据写入共享内存。使用volatile
会导致编译器执行内存写入而不是保留在寄存器中,但是这有一些风险并且更像是一个hack(意味着我不知道将来会如何影响它)
__syncthreads()
来符合CUDA编程模型warpSize
(在CUDA Programming Guide中记录,在“内置变量”下,4.1版本中的B.4节)请注意,某些SDK示例(特别是缩小和扫描)使用此扭曲同步技术。
答案 1 :(得分:1)
即使并行执行warp,您仍然需要__syncthreads()
。硬件中的实际执行可能不是并行的,因为SM(流多处理器)中的核心数量可能小于32.例如,GT200体系结构在每个SM中有8个核心,因此您永远无法确定所有线程都在代码中的相同点。