【问题标题】:The relationship between bank conflict and coalesced access in CUDACUDA 中银行冲突与合并访问之间的关系
【发布时间】:2011-09-01 13:40:56
【问题描述】:

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

【问题讨论】:

    标签: cuda coalesce bank-conflict


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的帮助。对不起,我不知道如何在这里提交代码。 Visual Profiler 告诉我程序有很多bank 冲突,但是没有uncoalesced store(All are coalesced store)。我想知道银行(带宽?)和合并访问之间的关系。银行的带宽是否会用于将数据从共享内存传输到全局内存?
    • 不,每个线程首先从共享内存读取,然后写入全局内存。因此,如果所有商店都合并了,那么您无需担心太多。如果在共享内存中进行计算密集型工作时发生银行冲突,那么它们就会成为问题。如果它只是在您写入 global 之前读取的,那可能不是问题。不过,获得其他意见也许很好。
    猜你喜欢
    • 2011-03-31
    • 2014-03-15
    • 2013-02-07
    • 1970-01-01
    • 2014-04-05
    • 2015-04-07
    • 2011-01-18
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多