我的GPU上有多少线程、块和网格的总数。

3
对于NVIDIA GEFORCE 940mx GPU,设备查询显示它有3个多处理器和每个MP的128个核心。enter image description here

每个多处理器的线程数=2048

所以,3 * 2048 = 6144。即GPU中总共有6144个线程。
6144/1024 = 6,即总共有6个块。warp大小为32。
但是从这个视频https://www.youtube.com/watch?v=kzXjRFL-gjo中我发现每个GPU都有线程限制,但没有关于块数量的限制。
所以我对此感到困惑。我想知道:
  1. 我的GPU中有多少个线程?我们可以使用所有线程来执行程序吗?
  2. 有多少个块和网格?

通常情况下,GPU对线程总数或块总数没有明显的限制。这些通常不是硬件的属性,而是您编写代码的属性。目前所有可用的CUDA GPU都可以支持至少数十亿个块和至少数万亿个线程(总数)。您需要摆脱认为这些想法与GPU硬件之间存在严格联系的思维方式。 - Robert Crovella
3
你所计算出的6144数字是你的GPU的最大瞬时容量,但这与你可以启动多少块或线程无关。 - Robert Crovella
因此,我们可以确定线程/块的最大限制等。而不是线程数或块数。 - 9113303
是的,每个块的最大线程数是硬件限制。 - Robert Crovella
@RobertCrovella 但是对于一个任务,线程数应该有一个限制。我们不能随心所欲地设置线程数。我的GPU的限制是多少?是6144还是更多? - 9113303
1个回答

1

看起来你混淆了两组完全不同的限制:

  1. GPU上可以同时运行的线程和块的最大数量。
  2. 针对给定内核可以启动的线程和块的最大数量。

你引用的数字(每个多处理器2048个线程,总共三个多处理器=6144个线程)代表第一组限制。你在 deviceQuery 输出截图中显示的数字则代表第二组限制。

  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)

定义给定内核启动的限制。虽然它们有些重叠,但您可以将它们视为相对独立的。有关内核启动参数和块尺寸实际操作的更全面讨论,请参见此处


但是 cat /proc/sys/kernel/threads-max 给出了线程的最大数量,我得到了126906。这怎么可能? - 9113303
@9113303:那个数字与你的GPU无关,这是可能的原因。请阅读CUDA编程指南附录H。 - talonmies
<<<nblocks, blocksize>>> 定义了内核。在我的情况下,nblock 和 blocksize 应该是多少?这取决于我们的任务吗? - 9113303

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接