如果一个线程束中的许多线程想要读取全局内存中的某个地址,那么该数据就会被广播,对吗?
如果 warp 中的许多线程想要写入全局内存中的某个地址,则存在序列化,但无法预测顺序,对吗?
但是,第一个问题:如果不同扭曲、不同块中的许多线程想要写入全局内存中的地址? GPU会做什么?序列化所有对该地址的访问?数据一致性有保障吗?
通过 Hyper-Q,可以启动许多包含内核的流。如果我在内存中有一个位置,并且不同内核中的多个线程想要写入或读取这个地址,那么GPU会做什么?序列化来自不同内核的所有线程的访问,还是 GPU 不执行任何操作并且会发生一些不一致?当多个内核读/写同一地址时,是否能保证数据的一致性?
最好每个问题只问一个问题。
如果一个线程束中的许多线程想要读取全局内存中的某个地址,那么该数据就会被广播,对吗?
是的,对于 Fermi (CC2.0) 及更高版本来说确实如此。
如果 warp 中的许多线程想要写入全局内存中的某个地址,则存在序列化,但无法预测顺序,对吗?
正确的。顺序未定义。
如果不同扭曲、不同块中的许多线程想要写入全局内存中的地址? GPU会做什么?序列化所有对该地址的访问?
如果访问是同时进行的,则它们是串行的。同样,顺序是未定义的。
数据一致性有保障吗?
不确定你所说的数据一致性是什么意思。不管怎样,除了串行化同时写入之外,GPU 还能做什么?我很惊讶这是一个如此困难的概念,因为在我看来没有明显的替代方案。
如果我在内存中有一个位置,并且不同内核中的多个线程想要写入或读取该地址,那么 GPU 会做什么?串行化来自不同内核的所有线程的访问,或者 GPU 不执行任何操作并且会发生一些不一致?当多个内核读/写同一地址时,是否能保证数据的一致性?
同时写入全局内存的来源是什么并不重要,无论是来自相同的扭曲,还是不同的扭曲,在不同的块中,在不同的内核中。同时写入以未定义的顺序进行序列化。再次,对于“数据一致性”,我想知道你的意思。同时读取and写入也会产生未定义的行为。读取可能返回一个值,包括存储位置的初始值或任何已写入的值。
同时写入任何 GPU 内存位置的最终结果是未定义的。如果所有同时写入都写入相同的值,则该位置的最终值将反映这一点。否则,最终值将反映写入的值之一。哪个值未定义。除此之外,你的大多数问题和陈述对我来说毫无意义。 (数据一致性是什么意思?)您不应该期望从这种编程行为中得到任何合理的东西。 GPU应该被编程为分布式独立工作机器,而不是全局同步机器。请注意,“未定义”还意味着即使输入数据相同,每次运行内核的结果也可能会有所不同。
在 Fermi (cc2.x) 设备上,由于 SM 之间插入了独立的非一致 L1 缓存(其中线程块执行)和 L2 缓存(这是设备范围的,因此是一致的)。尝试使用全局内存作为工具在线程块之间创建同步行为是很困难的,而且不鼓励。建议考虑重新设计算法以独立构建工作的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)