0

我尝试将一些数据从共享内存传输到全局内存。一些连续的线程将访问一个银行(但不是相同的 32 位)。所以存在一些银行冲突。(我使用 Visual Profiler 进行检查)但是,这些数据也被合并,然后被传输到全局内存。(我用Visual Profiler来检查)为什么数据是以合并的方式写入全局内存的?在我看来,流式多处理器会一个一个地弹出 32 位字(基于银行的带宽)。所以内存事务不能在全局内存中合并。我在这里可能会犯一些错误。请帮忙找出错误或给我一个合理的解释。谢谢你。

4

1 回答 1

2

这里有两件不同的事情:读取,会导致银行冲突,写入,可能不会合并。由于共享内存比全局内存快得多,因此您通常需要首先担心合并访问。

合并意味着线程正在写入小范围的内存地址。例如,如果线程 1 写入地址 1,线程 2 写入地址 2,这很好。如果分别写入地址* 1 和 4,情况会更糟。不太重要的是,如果线程写入从 32 的倍数开始的递增地址,例如地址 32 和 33。 *(我在这里松散地使用“地址”,表示 4 字节偏移量)是最佳选择。

当多个线程访问具有相同低位的共享内存地址时会发生存储库冲突(特别是等效的 mod 16)。如果两个线程使用同一个bank,那么它们将被序列化,这意味着一个线程将一个接一个地执行,而不是同时访问内存。

于 2011-05-25T08:57:12.007 回答