0

我有一块 Nvidia GeForce GTX 960M 显卡,它具有以下规格:

  • 多处理器:5
  • 每个多处理器的核心数:128(即 5 x 128 = 总共 640 个核心)
  • 每个多处理器的最大线程数:2048
  • 最大块大小(x、y、z):(1024、1024、64)
  • 翘曲尺寸:32

如果我运行 1 个 640 个线程块,那么单个多处理器会获得 640 个线程的工作负载,但一次只能同时运行 128 个线程。但是,如果我运行 5 个 128 个线程的块,那么每个多处理器都会得到一个块,并且所有 640 个线程都同时运行。因此,只要我创建 128 个线程的块,那么每个多处理器的线程分布就可以尽可能均匀(假设总共至少有 640 个线程)。

那么我的问题是:为什么我要创建大小大于每个多处理器内核数的块(只要我没有达到每个维度的最大块数)?

4

1 回答 1

1

如果我运行 1 个 640 个线程块,那么单个多处理器会获得 640 个线程的工作负载,但一次只能同时运行 128 个线程。

那是不正确的。所有 640 个线程同时运行。SM 具有指令延迟并且是流水线的,因此所有线程都处于活动状态并同时具有状态。线程不绑定到特定的内核,执行模型与传统的多线程 CPU 执行模型有很大不同。

但是,如果我运行 5 个 128 个线程的块,那么每个多处理器都会得到一个块,并且所有 640 个线程都同时运行。

这可能会发生,但不能保证。所有块都将运行。它们运行的​​ SM 由块调度机制决定,这些启发式方法没有记录。

因此,只要我创建 128 个线程的块,那么每个多处理器的线程分布就可以尽可能均匀(假设总共至少有 640 个线程)。

从上面的答案来看,这也不符合。

那么我的问题是:为什么我要创建大小大于每个多处理器内核数的块(只要我没有达到每个维度的最大块数)?

由于线程与内核无关,因此该架构有很多延迟,并且需要大量运行中的线程来隐藏所有延迟并达到峰值性能。不幸的是,基本上您在问题中假设的这些论点都不正确或与确定给定设备的最佳块数或其大小相关。

于 2019-07-23T13:28:01.530 回答