3

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

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

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

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

4

1 回答 1

10

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

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

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

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

正确的。订单未定义。

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

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

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

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

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

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

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

Simultaneous or nearly simultaneous reading and writing of global memory from different blocks (whether from the same or different kernels) is especially hazardous on Fermi (cc2.x) devices due to the independent non-coherent L1 caches that are interposed between the SMs (where the threadblocks execute) and the L2 cache (which is device-wide, and therefore coherent). Attempting to create synchronized behavior between threadblocks using global memory as a vehicle is difficult at best, and discouraged. It is suggested to consider ways to recast your algorithm to structure the work independently.

于 2013-01-22T04:50:06.383 回答