访问共享内存的延迟

时间:2012-12-08 13:52:04

标签: cuda shared-memory latency

以下两种情况之间的潜伏期更长,

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

2 个答案:

答案 0 :(得分:3)

如果您计划仅访问每个值一次,那么您将无法从使用共享内存中获得任何收益。

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

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

延迟是一个固定值,取决于您访问的内存。它没有改变。共享内存的延迟总是低于全局内存。

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

案例(1)可能会或可能不会导致银行冲突,但无论对于已存储在共享内存中的值,都会提供更好的吞吐量。

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

答案 1 :(得分:1)

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

如果您的硬件架构允许,第二个会更快。例如,在具有并行寄存器的多核机器上。还要注意,在第二种情况下,即使从纯软件的角度来看,由于交错,数据也不需要因为种族条件的恐惧而成为线程安全的。

这样想:

案例2:

你有一张五人晚餐的大桌子,你有五个孩子可以吃它们:不需要同步。

案例1:

你有三张桌子,有三顿晚餐;因此,两个孩子可能不得不从同一个盘子吃东西,因此可能需要同步他们的动作,这样他们就不会互相撞击。同步意味着延迟。