如果warp中的许多线程想要读取全局内存中的地址,那么这个数据是广播的,是吗?
如果warp中的许多线程想要写入全局内存中的地址,那么就会有序列化,但是无法预测顺序,是吗?
但是,第一个问题:如果不同的warp中的许多线程在不同的块中想要写入全局内存中的地址? GPU会做什么?序列化对此地址的所有访问权限?是否保证数据一致性?
使用Hyper-Q可以启动大量包含内核的流。如果我在内存中有一个位置,并且不同内核中的许多线程想要写入或读取该地址,那么GPU会做什么?序列化来自不同内核的所有线程的访问,或者GPU什么也不做,并且会发生一些不一致的事情?当多个内核正在读/写到同一个地址时,是否保证数据一致性?
答案 0 :(得分:10)
您最好每个问题提出一个问题。
如果warp中的许多线程想要读取全局内存中的地址,则会广播此数据,是吗?
是的,这对费米(CC2.0)及以后都是如此。
如果warp中的许多线程想要写入全局内存中的地址,则会有序列化,但无法预测顺序,是吗?
正确。订单未定义。
如果不同的多个线程在不同的块中扭曲,想要写入全局内存中的地址? GPU会做什么?序列化对此地址的所有访问权限?
如果访问是同时进行的,则序列化。同样,订单未定义。
是否保证数据一致性?
不确定数据一致性是什么意思。无论如何,除了序列化同步写入之外,GPU还能做什么呢?我很惊讶这是一个如此困难的概念,因为在我看来似乎没有明显的选择。
如果我在内存中有一个可能,并且不同内核中的许多线程想要写或读这个地址,那么GPU会做什么?序列化来自不同内核的所有线程的访问,或者GPU什么也不做,一些不一致会发生?当多个内核正在读/写到同一个地址时,是否保证数据一致性?
同步写入全局内存的起源无关紧要,无论是来自相同的warp,还是不同的warp,不同的块,不同的内核。同步写入以未定义的顺序被序列化。同样,对于“数据一致性”,我想知道你的意思。同时读取和写入也会产生未定义的行为。读取可以返回一个值,包括内存位置的初始值或任何已写入的值。
同步写入任何GPU内存位置的最终结果是未定义的。如果所有同时写入都写入相同的值,则该位置的最终值将反映该值。否则,最终值将反映其中一个值。哪个值未定义。除此之外,你的大部分问题和陈述都没有意义。 (你的数据一致性是什么意思?)你不应该期望这种编程行为有任何理性。 GPU应该被编程为分布式独立工作机器,而不是全局同步机器。请注意,“undefined”也意味着即使输入数据相同,结果也可能因内核的一次运行而异,即使输入数据相同。
同时或几乎同时从不同的块(无论是来自相同或不同的内核)读取和写入全局内存对Fermi(cc2.x)设备特别危险,因为插入在它们之间的独立非相干L1高速缓存SM(线程块执行的位置)和L2缓存(在设备范围内,因此是连贯的)。尝试使用全局存储器作为载体在线程块之间创建同步行为是最困难的,并且是不鼓励的。建议考虑重构算法以独立构建工作的方法。