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