Maximum number of threads per multiprocessor是怎么得到的?

Maximum number of threads per multiprocessor是由SP算出的吗?
Maximum number of threads per block又是由什么算出的?这两个线程数应该是指活跃线程数吗?为什么3060 的Maximum number of threads per multiprocessor是1536,Maximum number of threads per block是1024呢

Hi Xiaoyubing, 您好,

我觉得您首先需要搞清楚两个概念,即Stream Multiprocessor(后面简称SM)和block,SM是硬件单元由很多sp组成,而Block是CUDA编程模型中定义的线程组织形式。多个block可以运行在同一个SM中,block对SM并不是独占的。并且很多情况下都是很多个block在一个SM中运行。所以这个最大线程数并不相同。而最大线程数跟cuda toolkit中的定义相关,所以您自考虑他的时候先尽可能把软硬件个离开考虑。

2 个赞

非常感谢你的回复!我知道SM是硬件层面的,block是软件抽象出的概念,在实际的编码过程中当然是多个block在一个SM中,Maximum number of threads per multiprocessor和Maximum number of threads per block是官方给出的性能数据,但我以为的是(显然我的理解不对)一个SM上最少存活一个block,所以这个理论最大线程数是一样的。所以我想了解两个问题。第一:3060显卡上一个SM中有128个cuda core, 为什么每个SM的最大线程数是1536,128怎么算出1536的?;第二: “最大线程数跟cuda toolkit中的定义相关”这里指的是每个SM的最大线程数还是每个block的?(了解这些是想更加清楚运行的逻辑,可以更好利用所有线程来发挥更好的性能)

抱歉,回复较晚,最近比较忙。

1.一个block中的最大线程数是固定的1024。
2.每个sm中最大的线程数,你要这样计算:

  • 先看你的GPU架构可以在这里查到https://developer.nvidia.com/cuda-gpus
  • 比如你的3060,就是ampere架构,在里面可以查到是8.6.
  • 然后你在看每个SM中可以驻留的最大warp数量,在这里可以查到:CUDA C++ Programming Guide
  • 这里看到3060的架构也就是8.6那一列最大warp驻留数是48,也就是一个sm可以最多保留48个warp
  • 然后每个warp的线程数是32,那么你的GPU中一个SM最大的驻留线程数是:32 threads/warp * 48 warp = 1536 threads