1

以下两种情况之间的延迟时间较长,

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

2 回答 2

3

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

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

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

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

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

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

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

于 2012-12-08T15:10:54.903 回答
1

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

如果您的硬件架构允许,第二个会更快。例如,在具有并行寄存器的多核机器上。另请注意,在第二种情况下,即使从纯软件的角度来看,也不需要将数据设置为线程安全的,因为交错会导致竞争条件。

可以这样想:

案例二:

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

情况1:

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

于 2012-12-08T14:06:43.457 回答