2

我想首先确认以下几点:到共享内存的基本全局内存事务是 32 字节、64 或 128 字节,但前提是内存访问可以合并。先前交易的延迟都是相等的。那正确吗?

第二个问题:如果内存读取不能合并,每个线程只读取 4 个字节(对吗?)所有线程的内存访问都是顺序的吗?

4

1 回答 1

1

这取决于您正在处理的架构。然而,在费米和开普勒上,你有:

  • 内存事务总是 32 字节或 128 字节称为段
  • 仅使用 L2 缓存时使用 32 字节段,L2+L1 时使用 128 字节段。
  • 如果同一 warp 的两个线程落入同一段,则数据在单个事务中传递
  • 另一方面,如果您获取的数据段中没有请求线程 - 无论如何它正在被读取并且您(可能)浪费带宽
  • 整个段都属于 L1 和 L2 缓存,当您的相邻 warp 需要相同的段时,可能会减少您的带宽压力
  • 与它们通常交付的线程数量相比,L1 和 L2 相当小。这就是为什么你不应该期望一段数据在缓存中停留很长时间(与 CPU 编程相反)
  • 您可以禁用 L1 缓存,如果您在随机内存访问模式中过度获取,这可能会有所帮助。

如您所见,有几个变量决定了您的内存访问将花费多少时间。一般的经验法则是:访问模式越密集 - 越好!步幅或错位现在不像过去那样昂贵,所以不要太担心,除非你正在做一些后期优化。

于 2013-02-10T02:04:15.643 回答