CUDA 学习线程块调度

Posted tiemaxiaosu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CUDA 学习线程块调度相关的知识,希望对你有一定的参考价值。

一、调度

       如果我们有19个线程块和4个SM,将所有的线程都分配到一个SM上进行处理,显然不够合理。如果让前3个SM每个处理6个线程块,最后一个SM处理一个线程块,那么最后一个线程块就会很快处理完,然后SM会闲置。这样做设备的利用率会很低。

       如果我们用轮流交替的方式将线程块分配到SM 中,每个SM处理4个线程块(4*4=16 个线程块),还剩下三个线程单独用一个SM 再次处理,假设每个线程块执行所花费的时间是一样的,那么通过让每个SM能均衡处理线程块,而不是像之前那样有的SM负载过重,有的SM负载过轻,这样我们就可以减少17%的执行时间。

       而在实际的程序中,我们往往会用到成千上万个线程块。在线程块调度者为每个SM初始化分配了线程之后,就会处于闲置状态,直到有线程执行完毕。当线程执行完毕之后就会从SM中撤出,并释放其占用的资源。由于线程块都相同的大小,因此一个线程块从SM 中撤出后另一个在等待队列中的线程块就会被调度执行。所有线程块的执行顺序是随机、不确定的,因此,当我们在编写一个程序解决一个问题的时候,不要假定线程块的执行顺序,因为线程块根本就不会按照我们所想的顺序执行。

       我们在设计核函数时,最好保证线程块的数目是SM数目的整数倍,以此提高设备的利用率。


以上是关于CUDA 学习线程块调度的主要内容,如果未能解决你的问题,请参考以下文章

cuda 共享内存和块执行调度

cuda为啥要开启32倍数的线程

CUDA 扭曲和每个块的最佳线程数

CUDA中的线程和块结构以及如何分配具有不同结构的线程(c ++)

NVIDIA 架构:CUDA 线程和线程块

CUDA 学习(十九)优化策略4:线程使用计算和分支