多核多CPU多线程并行计算,在某些情况下的确是对性能有大幅提升。但问题是,对性能的提升并不是一定的。商家和技术提供者,为了自身的利益,很多情况下只展示了美好的一面,却把不利的一面加以隐藏。
线程的切换、调度,线程数据的同步,都须要消耗系统时间。线程越多,消耗越多。同时伴随引发的CPU的流水线清空,每次清空也将导致数十个时钟周期的浪费。虽然在以线程为单位进行调度的操作系统下,多线程能争取到更多的运行时间,但如果操作系统调度的单位是进程,而不是线程的话,多线程并不能争取到更多的运行时间,反而还会因进程内线程的调度而产生额外的消耗。
对于多核多CPU计算而言,先假设同一线程在同一时间片内只运行在一个Core上。那么,如果任线程在不同的Core上自由调度,则对每个Core有自己独立的L1、L2级缓存的CPU而言,对于某些任务线程,因为运行的Core变了,对应的L1、L2级缓存也同时变更,则如果上个时间片内的有效数据即使没有被换出L1或L2缓存,也不可以再加以利用,因为那些数据存在于另外一个Core的高速缓存中。于是高速缓存将需要重新加载。而在加载之前则得从另外一个Core的高速缓冲中重新将数据写回内存。因此,时间上的开销便出现了。相对而言,两个Core共享相同的高速缓存的CPU架构则没有这个问题。因此,如果因高速缓存频繁命中失败而导致的数据同步的时间开销相对于任务单元显著加大的话,则可以考虑将任务线程绑定单个Core运行。现在再假设,如果多核调度的策略是:同一线程的不同片断在同一时间片内可以运行在多个Core上。则如果线程编写不好,便会导致多个Core之间的数据同步。而如果数据同步处理不当,便会引发国企数据的使用,从而导致进一步的错误。
任何技术的采用,都得付出其相应的代价。因此,无论是多线程还是多核多CPU,无论是OpenMP还是CUDA,如果其带来的弊端大于其带来的好处,便需要仔细考虑一下,追赶时髦技术所付出的代价,是否值得。
The Way of the great learning involves manifesting virtue, renovating the people, and abiding by the highest good.
没有评论:
发表评论