我试图将一些数据从共享内存传输到全局内存。一些连续的线程将访问一个组(但不是相同的32位)。因此存在一些银行冲突。(我使用Visual Profiler对此进行检查)然而,这些数据也被合并,然后被传输到全局内存。(我使用Visual Profiler对此进行检查)为什么数据会以合并的方式写入全局内存?在我看来,流式多处理器逐个弹出32位单词(基于银行的带宽)。因此,内存事务不能在全局内存中合并。我可能会在这里犯一些错误。请帮我找出错误或者给我一个合理的解释。非常感谢。
这里有两件不同的事情:读取和写入,前者会引发银行冲突,后者可能无法合并。由于共享内存比全局内存快得多,所以您通常需要首先担心联合访问。
合并意味着线程正在写入小范围的内存地址。例如,如果线程1写入地址1,线程2写入地址2,这是好的。如果分别写入地址*1和4,情况会更糟。不太重要的是,如果线程写入从32的倍数开始的递增地址,例如地址32和33,这是最佳的*(我在这里松散地使用"address",意思是4字节的偏移量)。
当多个线程访问具有相同低位的共享内存地址(具体地说,是等效的mod 16)时,会发生库冲突。如果两个线程使用同一个库,那么它们将被序列化,这意味着其中一个线程将在另一个线程之后执行,而不是同时访问内存。