繁体   English   中英

为什么使用大于每个多处理器内核数的线程块

[英]Why use thread blocks larger than the number of cores per multiprocessor

我有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个线程)。

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

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

那是不对的。 所有640个线程同时运行。 SM具有指令等待时间并被流水线处理,因此所有线程均处于活动状态并同时具有状态。 线程没有绑定到特定的内核,执行模型与常规的多线程CPU执行模型有很大的不同。

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

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

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

从上面的答案来看,两者都不是。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM