【问题标题】:How the access of the same global memory address is performed by threads from different kernels?不同内核的线程如何访问同一个全局内存地址?
【发布时间】:2013-01-22 04:05:50
【问题描述】:

如果一个warp中的多个线程想要读取全局内存中的一个地址,这个数据就会被广播,对吗?

如果一个warp中的许多线程要写入全局内存中的一个地址,有一个序列化,但无法预测顺序,对吗?

但是,第一个问题:如果不同warp、不同块中的许多线程想要写入全局内存中的地址? GPU会做什么?序列化所有对该地址的访问?有没有数据一致性的保证?

使用 Hyper-Q 可以启动大量包含内核的流。如果我在内存中有一个位置,并且不同内核中的多个线程想要写入或读取这个地址,那么 GPU 会做什么?序列化来自不同内核的所有线程的访问,还是 GPU 什么都不做而会发生一些不一致?当多个内核读/写同一个地址时,是否有任何数据一致性保证?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    最好每个问题都问一个问题。

    如果一个warp中的多个线程想要读取全局内存中的一个地址,这个数据就会被广播,对吗?

    是的,这适用于 Fermi (CC2.0) 及更高版本。

    如果一个warp中的许多线程要写入全局内存中的一个地址,有一个序列化,但无法预测顺序,对吗?

    正确。订单未定义。

    如果不同warp、不同块中的许多线程想要写入全局内存中的地址? GPU会做什么?序列化所有对该地址的访问?

    如果访问是同时进行的,它们将被序列化。同样,订单未定义。

    是否有数据一致性的保证?

    不确定您所说的数据一致性是什么意思。无论如何,除了序列化同时写入之外,GPU 还能做什么?我很惊讶这是一个如此困难的概念,因为在我看来没有明显的替代方案。

    如果我在内存中有一个位置,并且不同内核中的多个线程想要写入或读取这个地址,GPU 会做什么?序列化来自不同内核的所有线程的访问,或者 GPU 什么都不做,并且会发生一些不一致?当多个内核读/写同一个地址时,是否有任何数据一致性保证?

    同时写入全局内存的来源是什么无关紧要,无论是来自同一个warp还是不同的warp,在不同的块中,在不同的内核中。同时写入以未定义的顺序序列化。同样,对于“数据一致性”,我想知道您的意思。同时读取写入也会产生未定义的行为。读取可能会返回一个值,包括内存位置的初始值或写入的任何值。

    同时写入任何 GPU 内存位置的最终结果是未定义的。如果所有同时写入都在写入相同的值,那么该位置的最终值将反映这一点。否则,最终值将反映写入的值之一。哪个值未定义。除此之外,您的大多数问题和陈述对我来说都没有意义。 (你所说的数据一致性是什么意思?)你不应该期望这种编程行为有任何合理性。 GPU 应该被编程为分布式独立工作机器,而不是全局同步机器。请注意,“未定义”还意味着即使输入数据相同,每次运行内核的结果也可能会有所不同。

    同时或几乎同时读取和写入来自不同块(无论来自相同或不同内核)的全局内存在 Fermi (cc2.x) 设备上尤其危险,因为它们之间插入了独立的非相干 L1 缓存。 SM(线程块执行的地方)和 L2 缓存(设备范围的,因此是连贯的)。尝试使用全局内存作为载体在线程块之间创建同步行为充其量是困难的,并且不鼓励。建议考虑重新构建算法以独立构建工作的方法。

    【讨论】:

    • 您对第二点的回答并不正确,是吗?只有当访问是由原子原语完成时,从同一个 warp 对单个全局内存的多次写入才会被序列化。否则一个(未定义的)线程将获胜并通过写入,其他线程将松动。
    • @talonmies (故意)没有很好地指定具体行为。对于幕后发生的事情,您可能是正确的。但是,我认为我们会同意最终效果是相同的未定义行为。无论是否发生所有写入,如果“获胜”线程(如果所有写入都没有发生)或“最终”线程(如果所有写入都被序列化并且确实发生)未定义,那么从程序员的角度来看,行为是相同的.在任何同时写入的情况下,在处理完同时写入后,一个写入的值将在该位置结束。
    • "如果一个 warp 中的多个线程要写入全局内存中的一个地址,有一个序列化,但无法预测顺序,对吗?" 罗伯特的回答:正确。顺序未定义。 **我有一个新问题:是否保证所有线程都会写入并且最终结果是最后一个线程写入的值?**
    • 最终结果始终是最后写入的值(由最后一个线程或“获胜”线程)。但是,无法预测哪个线程将是“最后一个”。它是未定义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2015-01-28
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多