【问题标题】:Coalesced access vs broadcast access to a global memory location on GPU合并访问与广播访问 GPU 上的全局内存位置
【发布时间】:2016-02-25 20:40:29
【问题描述】:

我有一个应用程序,我需要将全局内存中的单个(非常量,只是普通的旧数据)值广播到所有线程。线程只需要读取该值,而不是写入它。我无法明确告诉应用程序使用常量缓存(例如 cudaMemcpyToSymbol),因为我使用的内存包装库没有给我显式的低级控制。

我想知道这个广播是如何在幕后发生的,以及它与每个线程访问唯一全局内存位置的通常访问模式有何不同(为简单起见,假设这种“通常”访问模式是合并的)。我对广播案例中可能发生的任何隐式序列化以及这可能如何受到不同架构的影响特别感兴趣。

例如,对于 Fermi,大概第一个访问该值的线程会将其拉到 L2 缓存,然后再拉到其 SM 的 L1 缓存,此时驻留在 SM 上的每个线程都会尝试从 L1 缓存中获取它.当所有线程都尝试访问相同的 L1 缓存值时,是否有任何序列化惩罚?

对于 Kepler,大概第一个访问该值的线程会将其拉入 L2 缓存(然后可能会或可能不会将其拉入 L1 缓存,具体取决于是否启用了 L1 缓存)。当所有线程都尝试访问 L2 中的相同值时,是否有任何序列化惩罚?

另外,分区露营是否值得关注?

我在questions 中找到了另一个couple,它处理了类似的主题,但详细程度不足以满足我的好奇心。

提前致谢!

【问题讨论】:

    标签: caching cuda gpu kepler


    【解决方案1】:

    我有一个应用程序,我需要将全局内存中的单个(非常量,只是普通的旧数据)值广播到所有线程。线程只需要读取值,不需要写入。

    顺便说一句,这几乎是常量数据的定义,因为它与 CUDA 内核使用有关。您可能无法利用它,但这种访问被称为“统一”访问,如果有这种类型的重复访问,对于线程 only 读取并执行的值不写,那么__constant__内存是可以考虑的可能优化。

    我想知道这个广播是如何在幕后发生的

    需要明确的是,广播和/或序列化应该只在同一个warp中的线程访问特定数据项时才可行。当不同经线中的线程访问同一位置时,这些术语不适用;这些将由单独的 warp 读取请求提供服务。

    当所有线程尝试访问相同的 L1 缓存值时,是否有任何序列化惩罚?

    没有序列化惩罚。同一个warp中的线程可以read the same location without additional cost;从同一位置读取的所有线程将在同一周期(“广播”)中得到服务。读取 Fermi 上相同位置的单独 warp 中的线程将由单独的读取请求提供服务,就像您期望由单独的 warp 执行的任何指令一样。在这种情况下也没有额外或不寻常的费用。

    当所有线程尝试访问 L2 中的相同值时,是否有任何序列化惩罚?

    上面L1的same statements在这种情况下适用于L2。

    另外,分区露营是否值得关注?

    分区驻留与从 L1 或 L2 缓存中检索的值无关。分区预占通常是指一种数据访问模式,该模式导致 DRAM 请求不成比例地由具有多个内存分区的 GPU 上的一个分区处理。对于多个线程/warp 正在读取的单个位置,缓存将为此提供服务。最多需要一个 DRAM 事务来及时服务彼此足够近的所有请求(即忽略缓存抖动的可能性),针对单个位置。

    【讨论】:

    • 您好罗伯特,非常感谢您的回复。如果可以的话,我会使用 constant 内存,但不幸的是,在这种情况下它超出了我的控制范围。
    • 这确实引起了我的另一个好奇心,如果你愿意的话:假设每个 SM 具有相同的值存储在 L1 缓存中。假设一个 SM 上的线程现在写入该值。根据this talk slide 39,这将使L1中的相关缓存行无效,并写入L2中的相关缓存行。我的问题是:这是否也会使其他 SM 保存在 L1 缓存中的值无效?
    • 它没有。因此应避免此类编程范例,或者如果必须使用它们,则使用缓解策略,例如 1.) 使用 volatile qualifier 或 2.) 使用原子或 3.) 禁用 L1 缓存,无论是本地的还是全球的。当然还有其他方法。
    猜你喜欢
    • 2013-06-11
    • 2012-05-06
    • 1970-01-01
    • 2020-05-16
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多