【问题标题】:Cuda: async-copy vs coalesced global memory read atomicityCuda:异步复制与合并全局内存读取原子性
【发布时间】:2020-10-31 15:11:45
【问题描述】:

我正在阅读有关 Cuda 中的内存模型的内容。特别是在将数据从全局复制到共享内存时,我对shared_mem_data[i] = global_mem_data[i] 的理解是它是以合并的原子 方式完成的,即warp 中的每个线程都以一个不可分割的方式读取global_data[i]交易。对吗?

【问题讨论】:

  • cuda 没有说明线程执行的顺序。因此,您不应该假设一个线程读取的内容和另一个线程读取的内容之间存在任何顺序,即使它们在同一个线程中。关于读取的单个线程的原子性,例如,正确对齐的多字节数量,这些字节应该是连贯的,即使它们是由另一个线程写入的。请参阅here,其中包含指向支持此声明的硬件内存模型文档中特定点的链接
  • general中,CUDA 没有声明线程执行的顺序。可能有一些例外,例如在指定同步掩码的 warp 集体内在函数的情况下。而且我还没有尝试从我在这些 cmets 中链接的其他答案中捕捉到每一个想法。请阅读它以获得更完整的描述。

标签: cuda


【解决方案1】:

tl;dr:没有。

AFAIK 不保证在单个事务中读取所有值。事实上,GPU 的内存总线甚至不能保证足够宽,以供单个事务检索完整 warp 的数据宽度(每个 4 字节的完整 warp 读取为 1024 位)。理论上,在读取过程中,内存中读取位置中的某些值会发生变化。

【讨论】:

  • 关于这个:“也就是说,warp 中的线程将不会恢复执行,直到所有其他线程所有 warp 线程都有它们的输出。”在那里解析英语有点困难,但根据我对它可能试图传达的内容的解释,我不同意这种说法。我还认为,如果您将最后一条语句应用于单个线程的上下文,则它可能是值得怀疑的,但如果所引用的位置是由不同线程作用的位置,则可能是相当正确的。
猜你喜欢
  • 2012-01-04
  • 2020-08-17
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多