4

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

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

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

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

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

4

1 回答 1

5

这似乎是对术语的混淆。

“SM”(SM = 流式多处理器)和“多处理器”指的是同一个东西,硬件单元是 GPU 上的主要执行单元。这些术语指的是特定的硬件资源。不同的 GPU 可能有不同数量的 SM。deviceQuery 使用 CUDA示例代码可以找到特定 GPU 的 SM 数量:

cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, 0); // 0-th device
std::cout << deviceProp.multiProcessorCount;

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

没有 API 函数可以直接控制线程块到 SM 上的调度。通过使用CUDA 流优先级,可以对同时运行的不同内核的线程块的调度进行某种程度的间接控制。

于 2013-10-01T13:25:52.907 回答