【问题标题】:clarification about CUDA number of threads executed per SM关于每个 SM 执行的 CUDA 线程数的说明
【发布时间】:2012-09-09 10:11:55
【问题描述】:

我是 cuda 编程的新手,我正在阅读“编程大规模并行处理器 - 动手方法”一书中关于具有 128 个 SP(16 个 SM,每个 8 个 SP)的 G80 芯片。 英特尔 CPU 和 G80 芯片之间有一个比较。 Intel CPU 支持 2 到 4 个线程,具体取决于机器型号,每个内核。 其中G80芯片支持每个SM 768个线程,这颗芯片的总和是12000个线程。

我的问题是G80芯片可以同时执行768个线程吗? 如果不是同时,那么英特尔 CPU 支持每个内核 2 到 4 个线程是什么意思?我们总是可以在操作系统调度的 Intel CPU 上运行许多线程/进程。

【问题讨论】:

标签: cuda gpgpu


【解决方案1】:

G80 会同时为每个 SM 保留 768 个线程的上下文,并交错执行。这是 CPU 和 GPU 之间的主要区别。 GPU 是深度多线程处理器,通过其他线程的计算隐藏了某些线程的内存访问。执行线程的延迟要高得多,CPU 和 GPU 针对线程吞吐量而不是线程延迟进行了优化。相比之下,CPU使用乱序推测执行来减少一个线程的执行延迟。 GPU 使用多种技术来减少线程调度开销。例如,GPU 将线程分组在称为波前扭曲的更粗略的可调度元素中,并在 SIMD 上执行扭曲的线程。 GPU 线程是相同的,因此它们是 SIMD 模型的合适选择。在程序员的眼中,线程以 MIMD 方式执行,它们被分组在线程块中以减少通信开销。

CPU 内核中使用的线程通过动态调度来填充不同的执行单元。 CPU 线程不一定属于同一类型。这意味着一旦一个线程忙于浮点,其他线程可能会发现 ALU 空闲。因此,这些线程的执行可以同时进行。维护每个内核的多个线程以填充不同的执行单元,从而有效地防止空闲单元。然而,动态调度在功率和能源消耗方面是昂贵的。因此,制造商每个 CPU 内核使用几个线程。

回答您问题的第二部分:GPU 中的线程由硬件(每个 SM warp 调度程序)调度,操作系统甚至驱动程序都不会影响调度。

【讨论】:

  • 这是迄今为止最好的答案,但有几个缺点。您应该提到 GPU 线程(和 CPU 超线程)没有昂贵的上下文切换,因为所有驻留线程的资源(寄存器数据)同时驻留在芯片上。此外,您关于“执行线程的延迟远高于 CPU”的说法具有误导性。您的意思是,由于更大/更深的缓存、乱序执行、分支预测等,某些 CPU 指令的延迟较低。
  • @harrism:您的 cmets 很好地补充了答案。
【解决方案2】:

据我所知,768 是SMresident threads 的最大数量。线程在由 32 个线程组成的 warp 中执行。所以在一个 SM 中,所有 768 个线程不会同时执行,而是一次调度成 32 个线程的块,即一次一个 warp。

【讨论】:

    【解决方案3】:

    CPU 上的类似技术称为“同步多线程”(SMT),在英特尔的营销演讲中称为超线程。它通常允许两个,在某些 CPU 上,四个线程由 CPU 本身在硬件中调度。

    这与操作系统可能会在此之上调度更多软件线程这一事实不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 2020-10-15
      • 1970-01-01
      相关资源
      最近更新 更多