我发现了一个相关的回答,但我对此有一些疑问。
我使用 GTX 1650,相关信息是(我删除了一些不相关的信息):
$ /opt/cuda/extras/demo_suite/deviceQuery
Device 0: "NVIDIA GeForce GTX 1650"
(14) Multiprocessors, ( 64) CUDA Cores/MP: 896 CUDA Cores
Maximum number of threads per multiprocessor: 1024
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)
问:那么“网格大小”怎么会x
大于1024*14
这很奇怪?(2147483647,1,1)
可能超过 GPU 可以提供的线程数(即1024*14
)。
y,z
“网格大小”的情况也是一样的。
答案1
多个块组合成一个网格,同一个网格内的所有块包含相同数量的线程。一个块中的线程数量是有限的,但网格可用于需要大量线程块并行运行并使用所有可用多处理器的计算。
还
与每个块的最大线程数不同,每个网格的块数限制与最大网格尺寸没有区别。
因此,网格本质上是一种保存所有可供执行的块的构造,它们与处理器内可用的线程块数量无关。
这在计算中很常见。
你经常会有一些任务可以分解成工作单元,而且工作单元的数量比可用的线程数量多得多。然后你只需设置一个调度程序,当另一个块完成时,将一个新的工作块放入处理器块中。
这仍然可以由硬件处理。没有什么可以阻止硬件调度程序知道如何处理对象链接列表,该列表表示“当一个对象完成时,从该列表中获取下一个对象”。