CUDA __syncthreads()在warp中的用法

时间:2012-04-18 07:56:55

标签: parallel-processing cuda synchronization

如果块中的所有线程绝对需要在代码中的同一点,如果正在启动的线程数等于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];

2 个答案:

答案 0 :(得分:8)

更新了有关使用易失性

的更多信息

大概你希望所有线程都处于同一点,因为它们正在读取其他线程写入共享内存的数据,如果你正在启动单个warp(在每个块中),那么你知道所有线程都在一起执行。从表面上看,这意味着你可以省略__syncthreads(),这种做法被称为“扭曲同步编程”。但是,有一些事情需要注意。

  • 请记住,编译器会假设它可以优化,提供内部线程语义保持正确,包括将存储延迟到可以将数据保存在寄存器中的内存。 __syncthreads()充当了屏障,因此确保在其他线程读取数据之前将数据写入共享内存。使用volatile会导致编译器执行内存写入而不是保留在寄存器中,但是这有一些风险并且更像是一个hack(意味着我不知道将来会如何影响它)
    • 从技术上讲,您应始终使用__syncthreads()来符合CUDA编程模型
  • 经线尺寸一直是32,但您可以:
    • 在编译时,在设备代码中使用特殊变量warpSize(在CUDA Programming Guide中记录,在“内置变量”下,4.1版本中的B.4节)
    • 在运行时使用cudaDeviceProp结构的warpSize字段(记录在CUDA Reference Manual

请注意,某些SDK示例(特别是缩小和扫描)使用此扭曲同步技术。

答案 1 :(得分:1)

即使并行执行warp,您仍然需要__syncthreads()。硬件中的实际执行可能不是并行的,因为SM(流多处理器)中的核心数量可能小于32.例如,GT200体系结构在每个SM中有8个核心,因此您永远无法确定所有线程都在代码中的相同点。