访问共享内存的延迟



以下两种情况之间的延迟更长

  1. 数据从全局内存填充到共享内存中,所有线程同时访问共享内存。对于访问数据的多个线程来说,数据可能是相同的
  2. 所有线程都访问全局内存,但数据是邻居

如果您计划只访问每个值一次,那么您将不会从使用共享内存中获得任何好处。

共享内存中的值仅在块内有效,因此每个块中的一个或多个线程必须从全局内存加载这些值。因此,您无法避免全局内存访问。

如果你有一个计算能力>=2.0(费米)的设备,从全局内存读取的值会自动缓存在L1和L2缓存中。L1具有与共享内存相同的延迟。

延迟是一个固定值,它取决于您正在访问的内存。它不会改变。共享内存的延迟总是比全局内存低得多。

我想您可能真正想问的是,哪种类型的访问可以为您提供最佳的内存吞吐量。如果每个值只使用一次,则情况(2)将提供最佳吞吐量。如果您将重用值并且CC>=2.0,那么让L1处理缓存可能会提供最佳吞吐量。如果您在CC<2.0,使用共享内存将提供最佳吞吐量。

对于已经存储在共享内存中的值,情况(1)可能会也可能不会导致库冲突,但无论如何都会提供更好的吞吐量。

案例(2)描述了全局内存的最佳访问模式。

也许我不明白这两种情况之间的区别。但如果我这样做:

如果硬件体系结构允许,第二种速度更快。例如,在具有并行寄存器的多核机器上。还要注意的是,在第二种情况下,即使从纯软件的角度来看,也不需要使数据成为线程安全的,以避免由于交织而导致的竞争条件等问题。

这样想:

病例2:

你有一张大桌子,里面有五顿饭,你有五个孩子要吃:不需要同步。

病例1:

比如说,你有三张桌子,三顿饭;这样两个孩子可能不得不用同一个盘子吃饭,因此可能需要同步他们的动作,这样他们就不会撞到对方。同步意味着延迟。

最新更新