CUDA |多处理器数量的兴趣 - 与SM的混淆

时间:2013-09-29 22:09:56

标签: c++ cuda

我有一台NVIDIA GT650M,具有以下属性:

( 2) Multiprocessors, (192) CUDA Cores/MP:     384 CUDA Cores
Maximum number of threads per multiprocessor:  2048

我刚刚摆脱了流式多处理器(SM)与实际多处理器之间的困惑。 SM和多处理器是不同的东西,对吧? 例如,使用可视化分析器,我有一个虚拟内核,它只用等待1个1个线程的块启动时等待并持续370ms。 我可以用4块1024个线程和一个SM启动它,它仍然持续370ms。这是正常的,因为该任务使用芯片的2个多处理器,每个处理器使用2048个并发线程(一旦我使用5个块x 1024,它需要740ms,正常)。 同样,我可以使用4个SM同时启动4个1024个线程的4个块,它仍然需要370毫秒,确定。

问题的第一部分是为了确保我们不应该混淆SM和多处理器?就像我有时甚至在这里的答案中看到的那样:CUDA - Multiprocessors, Warp size and Maximum Threads Per Block: What is the exact relationship? 因此,无法通过多处理器显式控制任务的调度方式,因为(据我所知)没有运行时函数允许它正确吗?那么,如果我有一个带有2个mutliprocessors的卡和每个多处理器2048个线程,或者另外一个带有4个多处理器的卡,每个1024个线程,给定的程序将以相同的方式执行?

其次,我想知道哪种用法更好,拥有更多核心的多处理器,反之亦然?到目前为止,我的理解让我说更多的多处理器(对于每个多处理器的给定最大线程)具有很少的内核将更适合更少/更简单操作的更大规模并行,而每个多处理器具有更多内核(现在我在谈论我几乎不知道的事情)将有更多的专用ALU用于加载/存储操作和复杂的数学函数,因此它更适合于每个线程需要更多操作的内核?

1 个答案:

答案 0 :(得分:3)

这似乎是对术语的混淆。

“SM”(SM =流处理多处理器)和“多处理器”指的是相同的东西,硬件单元是GPU上的主要执行单元。这些术语指的是特定的HW资源。不同的GPU可能具有不同数量的SM。可以使用CUDA deviceQuery sample code为特定GPU找到SM的数量。

“发布”中的CUDA程序的元素是线程块。 grid 是与内核启动关联的所有 threadblocks 的集合。各个线程块在各个SM上执行。您可以在内核中启动大量线程块,或多或少独立于您运行的GPU。然后将以特定GPU及其SM提供的任何速率处理线程块。

没有API函数可以直接控制线程块到SM上的调度。通过使用CUDA stream priorities可以获得对同时运行的不同内核的线程块调度的某种程度的间接控制。

相关问题