Cuda并行执行

Cuda并行执行,cuda,Cuda,有人能告诉我:在CUDA中块是并行/并发执行的吗? 换句话说,如果两个不同的块试图写入相同的全局地址,即globalPtr[12],是否存在更新丢失问题 (我问这个问题是因为我读到CUDA中的并行执行单元是warp=32个线程。)是的,多个块并行执行,因此如果多个线程需要访问同一地址,则对全局内存的访问需要是原子的。这适用于同一块中的两个线程还是不同块中的两个线程。是的,多个块并行执行,因此如果多个线程需要访问同一地址,则对全局内存的访问需要是原子的。这适用于同一块中的两个线程还是不同块中的两个

有人能告诉我:在CUDA中块是并行/并发执行的吗? 换句话说,如果两个不同的块试图写入相同的全局地址,即globalPtr[12],是否存在更新丢失问题


(我问这个问题是因为我读到CUDA中的并行执行单元是warp=32个线程。)

是的,多个块并行执行,因此如果多个线程需要访问同一地址,则对全局内存的访问需要是原子的。这适用于同一块中的两个线程还是不同块中的两个线程。

是的,多个块并行执行,因此如果多个线程需要访问同一地址,则对全局内存的访问需要是原子的。这适用于同一块中的两个线程还是不同块中的两个线程。

是的,如果CUDA设备具有多个warp调度程序,则可以在多个块之间并行执行

计算能力为2.1的CUDA设备有两个warp调度程序,因此来自两个不同warp(来自同一块或不同块,无所谓)的指令可以同时执行

计算能力为3.0的CUDA设备有四个warp调度程序,可以为每个准备好执行的warp发出两条独立的指令

请注意,即使在扭曲之间没有并发执行,调度程序也可以使用多个块,以便在扭曲被阻塞等待内存操作完成时,调度程序可以切换到另一个扭曲执行,这样内核就不会处于空闲状态

可驻留在核心上、准备由调度器切换到的扭曲的数量因计算能力而异

如果只定义与调度器数量相同的块,则无法实现设备的全部计算潜力。如果您的代码有大量内存I/O,这一点尤其正确-一种“隐藏”内存延迟的方法是确保有足够的块/扭曲可用,以便当其中一个扭曲空闲等待内存I/O时,调度程序始终有一个准备好的扭曲可切换


每当有多个warp读取和写入同一内存地址时,无论当前硬件是否可以同时执行多个warp,都应该使用原子I/O或锁定。写后再写工件(“丢失的更新”)甚至可以在任务切换单核执行中出现

是的,如果CUDA设备有多个warp调度程序,则可以在多个块之间并行执行

计算能力为2.1的CUDA设备有两个warp调度程序,因此来自两个不同warp(来自同一块或不同块,无所谓)的指令可以同时执行

计算能力为3.0的CUDA设备有四个warp调度程序,可以为每个准备好执行的warp发出两条独立的指令

请注意,即使在扭曲之间没有并发执行,调度程序也可以使用多个块,以便在扭曲被阻塞等待内存操作完成时,调度程序可以切换到另一个扭曲执行,这样内核就不会处于空闲状态

可驻留在核心上、准备由调度器切换到的扭曲的数量因计算能力而异

如果只定义与调度器数量相同的块,则无法实现设备的全部计算潜力。如果您的代码有大量内存I/O,这一点尤其正确-一种“隐藏”内存延迟的方法是确保有足够的块/扭曲可用,以便当其中一个扭曲空闲等待内存I/O时,调度程序始终有一个准备好的扭曲可切换


每当有多个warp读取和写入同一内存地址时,无论当前硬件是否可以同时执行多个warp,都应该使用原子I/O或锁定。写后再写工件(“丢失的更新”)甚至可以在任务切换单核执行中出现

谢谢Paul,不过如果同一块中的两个线程属于同一个扭曲,那么它们需要是原子的。如果不是,那么它们就不会并行执行,据我目前所知..谢谢Paul,虽然同一块中的两个线程需要是原子的,如果它们属于同一个扭曲。如果没有,那么它们就不会并行执行,据我目前所知..这是非常清楚的,谢谢。这让我去阅读相关的Cuda文档,以便更好地理解。我正在编写一个内核,它使用嵌套循环来更新32*32共享内存。我知道如果内核有32个线程,那么我可以保证共享内存中没有竞争条件。然而,我发布了256个线程。除了使用诸如if之类的谓词外,有没有其他方法可以保证在同一块上不会有两个warp同时运行(threadIdx.xWell,你可以把它拉回到每个块只运行32个线程的状态,但是在更大的CUDA iron上,我怀疑这会比使用原子写入造成更多的性能问题。这非常清楚,谢谢。这让我去阅读相关的CUDA文档,以获得更好的理解。我正在编写一个使用嵌套循环的内核来提高性能日期a 32*32共享内存。我知道如果内核是用32个线程发布的,那么我可以保证共享内存中没有争用条件。但是我是用256个线程发布的。除了使用诸如if之类的谓词之外,有没有办法保证在同一块上不会有两个warp并发运行(threadIdx.xWell,您可以将它拉回到每个块只运行32个线程的状态,但在更大的CUDA iron上,我怀疑这会比使用原子写入造成更多的性能问题。