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 学习线程块调度的主要内容,如果未能解决你的问题,请参考以下文章