1

假设我们有 16 个线程在块 1 上运行,另外 16 个线程在块 2 上运行。

每个线程从内存中读取 1 个 double:块 1 上的 16 个线程需要从内存地址 0-127 读取 16 个 double,块 2 上的 16 个线程需要从地址 128-255 读取。

我知道,由于合并访问,块 1 上的 16 个线程的内存读取可以在一个内存事务中完成。

我的问题是,当我们考虑这两个块时,我们需要多少内存事务,一个还是两个?换句话说,不同块的内存访问可以同时发生吗?

4

2 回答 2

2

块是完全独立的——硬件可能会选择(并且可能会)在不同的多处理器上启动它们。

来自不同块的线程将在不同的 warp 中运行。因此,不可能合并它们之间的内存访问。

于 2013-02-27T21:34:57.560 回答
1

您至少需要两个内存事务。确保每个块的线程将在不同的扭曲中处理。

此外,即使线程已形成一个 warp 或占用相同的多处理器并共享 L1 缓存,来自 warp 的地址也会转换为 128B 或 32B 行(取决于缓存/非缓存模式),因此在缓存模式的情况下,您会至少需要 2 个事务,在非缓存模式的情况下需要 8 个事务。查看这个非常有用的演示文稿,以更好地理解全局内存访问。

于 2013-02-27T23:26:47.297 回答