CUDA并行性中MP和SP(或者它是Core)之间的区别?

时间:2014-11-14 04:59:36

标签: parallel-processing cuda gpu

因此,在阅读了一些非常有用的帖子之后,我得出结论,

  1. 每个网格块都在单个设备上执行。 (例如,设备有9 MP)

  2. 每个线程块在单个MultiProcessor上执行。 (例如,1 MP具有8个SP /核心)。

  3. 每个线程组(称为warps)在SP / Core上执行。
  4. 现在,如果我假设

    1. 我总共有72个核心(9 * 8),
    2. 我用9个块和8个线程调用内核,总共72个线程。
    3. 所有72个线程将并行运行?
    4. 然而,如果我打电话不止于此,那么它们不会并行运行?

2 个答案:

答案 0 :(得分:1)

  

每个网格块在单个设备上执行。 (例如,设备有9 MP)

正确。

  

每个线程块在单个多处理器上执行。 (例如,1 MP   有8个SP / Cores)。

线程块单独调度到SM上,给定块中的线程由同一个SM执行。

  

每个线程块在单个多处理器上执行。 (例如,1 MP   有8个SP / Cores)。

右。线程块在一个多处理器上执行,它们在内核执行期间不会迁移到另一个SM。

  

如果我打电话的次数不多,他们就不会并行?

简短的回答是否定的。只有一个经线真正并行(如@ebarr所说)。

答案很长,warp映射到SM(SP上的一个线程),并且所有32个线程在SM中并行运行。如果由于某种原因,其中一个线程需要执行长延迟操作,这将导致其余线程(以及SM队列中的其他线程)空闲。为了解决这个问题,CUDA在warp之间使用快速上下文切换。

因此,在线程级别(在warp内)和warp级别存在并行性(不同的SM在给定时刻运行一个warp)。

如果您启动的线程数超过72,会发生什么?启动超过72个线程是CUDA的目的。正如我之前所说,隐藏运营商延迟的方式是通过上下文切换,即启动大量线程。

线程块将被划分为warp,这些warp将在SM上进行调度和排队,并以 unknown 顺序执行。

答案 1 :(得分:1)

Each Grid of Blocks executes on a single device. (e.g Device has 9 MP)

是!

Each Block of Threads executes on a single MultiProcessor. (e.g 1 MP has 8 SP/Cores).

是的!

Each Group of Threads (called warps) executes on a SP/Core.

没有!通常,warp(所有当前硬件上的32个线程)分布在内核中。

Now, if I assume that

I have a total of 72 Cores (9*8) ,
I call kernel with 9 blocks and 8 threads,total 72 threads.
All the 72 threads will run in parallel ?

是的!但它不会很快......

However, If I call more than that, then they will not run in parallel ?

他们将并行运行。 GPU通过超额认购实现了良好的性能。核心无法在一个周期内完成指令,并且需要多个周期才能返回(这称为latency)。通过拥有比核心更多的线程,您可以在正在启动的指令与执行之间的间隙中发出另一条指令。这是从GPU中获得最佳性能的唯一方法 - 通过每个核心拥有多个线程 - 并且是GPU编程的基础。 SM上可以有多少线程数有限制,但通常你想要尽可能多的线程,是你拥有内核的线程数的几倍。

从程序员的角度来看,网格中的所有线程并行运行。从硬件的角度来看,每个SM都与其他SM并行运行。每个SM可以具有多个warp,其中每个循环都执行指令。每条指令在SM的核心上并行执行。每个核心都可以在其管道中进行许多操作。

程序员的观点和硬件的观点之间的细微差别在于硬件中存在基于资源的依赖性。程序员看不到这些依赖性。