异构计算中的流水线调度
2024-02-03
我们理解一下使用流水线调度比不用流水线调度能高多少效率。
在计算机结构体系上,如果我们的计算任务都是用CPU进行计算,那么怎么样的效率最高?让每个CPU都专门做好自己那块计算就好,减少CPU切换,直接做好一件事再做一件事。假如一个任务包含三个子任务(预处理、计算、后处理),要高效地完成一次任务,那么每个CPU专心按顺序计算ABC三个子任务就行,这样的效率最高,CPU100%跑满。该模式如下图所示:
但是,三个任务中,假如预处理和后处理用的是CPU,计算用的是GPU,那么我们这个计算场景就叫做异构计算了,如果按照之前的计算模式,GPU一直会偷懒(下图空白处就是GPU/CPU空闲时间),利用率很低,大概是67%的使用率。所以现在这个计算任务的瓶颈就出现在GPU的使用率上了,GPU是稀缺资源,一定要利用好,整个任务才会高效。
这里有人会提出一个方案说,我再加一个CPU不就好了吗,GPU的使用率就能打满,如下图:
这个方案下,GPU确实100%利用上了,但是整体的CPU的利用率很低,只有60+%,多数时间都在等待抢占GPU。
如果此时采取的是流水线的设计思路,让CPU-A负责预处理的工作,让CPU-B负责后处理的工作,让CPU和GPU每时每刻都在工作,利用率很高,GPU和CPU的使用率可以达到100%,从而整体上达到任务完成效率最高。