Caching CUDA-多处理器、扭曲大小和每个块的最大线程数:确切的关系是什么?

Caching CUDA-多处理器、扭曲大小和每个块的最大线程数:确切的关系是什么?,caching,memory,cuda,textures,Caching,Memory,Cuda,Textures,我知道CUDA GPU上有多个处理器,其中包含CUDA内核。在我的工作场所,我使用的是GTX 590,它包含512个CUDA内核,16个多处理器,扭曲大小为32。这意味着每个多处理器中有32个CUDA内核,它们在同一个warp中的同一代码上工作。最后,每个块大小的最大线程数是1024 我的问题是块大小和多处理器计数扭曲大小是如何精确关联的。让我告诉你我对这种情况的理解:例如,我在GTX 590上分配了N个最大threadPerBlock大小为1024的块。据我从CUDA编程指南和其他来源了解,这

我知道CUDA GPU上有多个处理器,其中包含CUDA内核。在我的工作场所,我使用的是GTX 590,它包含512个CUDA内核,16个多处理器,扭曲大小为32。这意味着每个多处理器中有32个CUDA内核,它们在同一个warp中的同一代码上工作。最后,每个块大小的最大线程数是1024

我的问题是块大小和多处理器计数扭曲大小是如何精确关联的。让我告诉你我对这种情况的理解:例如,我在GTX 590上分配了N个最大threadPerBlock大小为1024的块。据我从CUDA编程指南和其他来源了解,这些块首先由硬件枚举。在这种情况下,N个块中的16个被分配给不同的多处理器。每个块包含1024个线程,硬件调度器将其中32个线程分配给单个多处理器中的32个内核。同一多处理器(warp)中的线程处理同一行代码,并使用当前多处理器的共享内存。如果当前32个线程遇到诸如内存读写之类的片外操作,它们将替换为当前块中另一组32个线程。因此,实际上在一个块中有32个线程,它们在任何给定的时间内都在多处理器上并行运行,而不是整个1024个线程。最后,如果一个块完全由多处理器处理,则N个线程块列表中的一个新线程块将插入当前多处理器。最后,在CUDA内核执行期间,GPU中总共有512个线程并行运行。(我知道,如果一个块使用的寄存器多于单个多处理器上可用的寄存器,那么它将被划分为在两个多处理器上工作,但假设在我们的例子中,每个块都可以装入单个多处理器。)

那个么,我的CUDA并行执行模型是正确的吗?如果没有,有什么错或遗漏?我想微调我正在进行的当前项目,因此我需要整个项目中最正确的工作模型

在我的工作场所,我使用的是GTX 590,它包含512个CUDA内核,16个多处理器,扭曲大小为32。这意味着每个多处理器中有32个CUDA内核,它们在同一个warp中的同一代码上工作。最后,每个块大小的最大线程数是1024

GTX590包含您提到的2倍的数字,因为卡上有2个GPU。下面,我将重点介绍单个芯片

让我告诉你我对这种情况的理解:例如,我在GTX 590上分配了N个最大threadPerBlock大小为1024的块。据我从CUDA编程指南和其他来源了解,这些块首先由硬件枚举。在这种情况下,N个块中的16个被分配给不同的多处理器

块不一定均匀分布在多处理器(SMs)上。如果您恰好安排了16个块,那么一些SMs可以获得2或3个块,而其中一些则处于空闲状态。我不知道为什么

每个块包含1024个线程,硬件调度器将其中32个线程分配给单个多处理器中的32个内核

线程和内核之间的关系并不是那么直接。每个SM中有32个“基本”ALU。处理诸如单精度浮点和大多数32位整数和逻辑指令等问题的指令。但是只有16个加载/存储单元,因此如果当前正在处理的warp指令是加载/存储,则必须对其进行两次调度。只有4个特殊的函数单元,它们可以做三角函数之类的事情。因此,这些指令必须安排32/4=8次

同一多处理器(warp)中的线程处理同一行代码,并使用当前多处理器的共享内存

不,在一个SM中,可以同时有超过32个线程在运行

如果当前32个线程遇到诸如内存读写之类的片外操作,它们将替换为当前块中另一组32个线程。因此,实际上在一个块中有32个线程,它们在任何给定的时间内都在多处理器上并行运行,而不是整个1024个线程

不,导致翘曲被替换的不仅仅是内存操作。ALU也是深度管道化的,因此当仍在管道中的值发生数据依赖时,新的扭曲将被替换。因此,如果代码包含两条指令,其中第二条指令使用第一条指令的输出,那么当第一条指令的值通过管道时,扭曲将被搁置

最后,如果一个块完全由多处理器处理,则N个线程块列表中的一个新线程块将插入当前多处理器

多处理器一次可以处理多个块,但一个块一旦开始处理,就不能移动到另一个MP。块中当前正在运行的线程数取决于块使用的资源数量。CUDA占用率计算器将根据特定内核的资源使用情况,告诉您同时有多少块在运行

最后,在CUDA内核执行期间,GPU中总共有512个线程并行运行。(我知道,如果一个块使用的寄存器多于单个多处理器上可用的寄存器,那么它将被划分为在两个多处理器上工作,但假设在我们的例子中,每个块都可以装入单个多处理器。)

不可以,不能将一个块划分为在两个多处理器上工作。整个块始终由单个多处理器处理。如果给定的多处理器没有足够的资源来处理至少一个块