缓存 – CUDA – 多处理器,每个块的经线大小和最大线程数:确切的关系是什么?

我知道在CUDA GPU中有多处理器,其中包含CUDA内核。在我的工作场所,我正在使用一个GTX 590,它包含512个CUDA内核,16个多处理器,并且具有32的翘曲大小。因此,这意味着在每个多处理器中有32个CUDA内核,它们在同一个经线。最后每个块大小的最大线程是1024。

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

那么,我的CUDA并行执行模式是否正确?如果没有,什么是错误或缺失?我想要调整我目前正在开展的项目,所以我需要整个事情最正确的工作模式。

In my workplace I am working with a GTX 590, which contains 512 CUDA cores, 16 multiprocessors and which has a warp size of 32. So this means there are 32 CUDA cores in each multiprocessor which works exactly on the same code in the same warp. And finally the maximum threads per block size is 1024.

一个GTX590包含你提到的两个数字,因为卡上有2个GPU。下面,我专注于单芯片。

Let me tell my understanding of the situation: For example I allocate N blocks with the maximum threadPerBlock size of 1024 on the GTX 590. As far as I understand from the CUDA programming guide and from other sources, the blocks are firstly enumerated by the hardware. In this case 16 from the N blocks are assigned to different multiprocessors.

块不一定在多处理器(SM)之间均匀分布。如果您正好安排16个块,那么SM中的一些可以获得2或3个块,而其中一些则会空闲。我不知道为什么

Each block contains 1024 threads and the hardware scheduler assigns 32 of these threads to the 32 cores in a single multiprocessor.

线程和内核之间的关系并不直接。每个SM中有32个“基本”ALU。处理单精度浮点和大多数32位整数和逻辑指令的操作。但是只有16个加载/存储单元,所以如果正在处理的warp指令是加载/存储,那么它必须被调度两次。只有4个特殊功能单元,可以做三角法等。所以这些指令必须安排32/4 = 8次。

The threads in the same multiprocessor (warp) process the same line of the code and use shared memory of the current multiproccessor.

不,在一个SM中同时可以有超过32个线程“飞行中”。

If the current 32 threads encounter an off-chip operation like memory read-writes, they are replaced with an another group of 32 threads from the current block. So, there are actually 32 threads in a single block which are exactly running in parallel on a multiprocessor in any given time, not the whole of the 1024.

不,不仅仅是内存操作导致经纱被替换。 ALU也是深度流水线的,所以随着数据依赖关系的发展,新的经线将被交换,这些数据依然存在。因此,如果代码包含两个指令,其中第二个指令使用第一个指令的输出,则warp将被置于保持状态,而第一条指令的值将通过流水线。

Finally, if a block is completely processed by a multiprocessor, a new thread block from the list of the N thread blocks is plugged into the current multiprocessor.

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

And finally there are a total of 512 threads running in parallel in the GPU during the execution of the CUDA kernel. (I know that if a block uses more registers than available on a single multiprocessor then it is divided to work on two multiprocessors but lets assume that each block can fit into a single multiprocessor in our case.)

不,一个块不能分为两个多处理器。整个块总是由单个多处理器处理。如果给定的多处理器没有足够的资源来处理至少一个内核的块,那么您将收到一个内核启动错误,您的程序根本就不会运行。

这取决于你如何将线程定义为“运行”。 GPU通常具有多达512个线程,同时在芯片上消耗各种资源。

请参阅@ harrism的这个问题的答案:CUDA: How many concurrent threads in total?

http://stackoverflow.com/questions/11564608/cuda-multiprocessors-warp-size-and-maximum-threads-per-block-what-is-the-exa

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:缓存 – CUDA – 多处理器,每个块的经线大小和最大线程数:确切的关系是什么?