CUDA中银行冲突与合并访问之间的关系

时间:2011-05-25 08:28:56

标签: cuda coalesce bank-conflict

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

1 个答案:

答案 0 :(得分:2)

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

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

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