Cuda 来自不同内核的线程如何访问相同的全局内存地址?

Cuda 来自不同内核的线程如何访问相同的全局内存地址?,cuda,Cuda,如果一个扭曲中的多个线程想要读取全局内存中的地址,那么该数据将被广播,对吗 如果一个warp中的多个线程想要写入全局内存中的一个地址,有一个序列化,但无法预测顺序,对吗 但是,第一个问题是:如果多个线程处于不同的扭曲、不同的块中,想要写入全局内存中的地址?GPU会怎么做?序列化对此地址的所有访问?是否有数据一致性的保证 使用Hyper-Q,可以启动许多包含内核的流。如果我在内存中有一个位置,并且不同内核中的多个线程想要写入或读取这个地址,那么GPU将做什么?序列化来自不同内核的所有线程的访问,或

如果一个扭曲中的多个线程想要读取全局内存中的地址,那么该数据将被广播,对吗


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

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


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

最好每个问题问一个问题


如果一个warp中有许多线程想要读取全局内存中的地址,那么这些数据将被广播,对吗

是的,这对费米(CC2.0)和更高版本都是正确的


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

对。顺序未定义

如果多个线程处于不同的扭曲、不同的块中,想要写入全局内存中的一个地址?GPU会怎么做?序列化对此地址的所有访问

如果访问是同时进行的,则会对其进行序列化。同样,顺序是未定义的

是否有数据一致性的保证

不确定数据一致性是什么意思。不管怎样,除了序列化同步写入,GPU还能做什么?我很惊讶这是一个如此困难的概念,因为在我看来似乎没有明显的选择

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

同时写入全局内存的原因是什么并不重要,无论是来自同一个扭曲,还是来自不同块、不同内核中的不同扭曲。同步写入以未定义的顺序序列化。再说一次,“数据一致性”我想知道你的意思。同时读写也会产生未定义的行为。读取可能返回一个值,包括内存位置的初始值或写入的任何值

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


由于在SMs(线程块执行的位置)和二级缓存之间插入了独立的非相干一级缓存,因此从不同的块(无论是从相同的还是不同的内核)同时或几乎同时读取和写入全局内存对费米(cc2.x)设备来说尤其危险(这是设备范围的,因此是一致的)试图用全局内存作为线程来创建线程块之间的同步行为是最困难的,并且劝阻。建议考虑重写算法以独立地构造工作。< / P>您对第二点的回答并不正确,对多个全局内存写入多个S。只有通过原子原语进行访问时,ame warp才会序列化。否则,一个(未定义的)线程将获胜并获得写入权限,其他线程将丢失。@Talonmes具体行为是(有意的)没有很好地指定。你可能对引擎盖下发生的事情是正确的。但是,我认为我们会同意,净效果是相同的未定义行为。无论所有写入是否发生,如果“获胜”线程(如果所有写入都没有发生)或“最终”线程(如果所有写入都序列化并且确实发生)如果未定义,则从程序员的角度来看,行为是相同的。在任何同时写入的情况下,在处理同时写入后,其中一个写入的值将最终位于该位置。“如果一个warp中有许多线程想要写入全局内存中的地址,那么有一个序列化,但无法预测顺序,对吗?“Robert的回答:正确。顺序未定义。**我有一个新问题:是否可以保证所有线程都将写入,并且最终结果是最后一个线程写入的值?**最终结果始终是最后一个线程写入的值(由最后一个线程或“获胜”线程)。但是无法预测哪个线程将是“最后一个”.它没有定义。