我有一个 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 用于加载/存储操作和复杂的数学函数,所以它会更适合每个线程需要更多操作的内核?