天天看點

關于多核多CPU多線程和并行計算的一點補充

多核多CPU多線程并行計算,在某些情況下的确是對性能有大幅提升。但問題是,對性能的提升并不是一定的。商家和技術提供者,為了自身的利益,很多情況下隻展示了美好的一面,卻把不利的一面加以隐藏。

線程的切換、排程,線程資料的同步,都須要消耗系統時間。線程越多,消耗越多。同時伴随引發的CPU的流水線清空,每次清空也将導緻數十個時鐘周期的浪費。雖然在以線程為機關進行排程的作業系統下,多線程能争取到更多的運作時間,但如果作業系統排程的機關是程序,而不是線程的話,多線程并不能争取到更多的運作時間,反而還會因程序内線程的排程而産生額外的消耗。

對于多核多CPU計算而言,先假設同一線程在同一時間片内隻運作在一個Core上。那麼,如果任線程在不同的Core上自由排程,則對每個Core有自己獨立的L1、L2級緩存的CPU而言,對于某些任務線程,因為運作的Core變了,對應的L1、L2級緩存也同時變更,則如果上個時間片内的有效資料即使沒有被換出L1或L2緩存,也不可以再加以利用,因為那些資料存在于另外一個Core的高速緩存中。于是高速緩存将需要重新加載。而在加載之前則得從另外一個Core的高速緩沖中重新将資料寫回記憶體。是以,時間上的開銷便出現了。相對而言,兩個Core共享相同的高速緩存的CPU架構則沒有這個問題。是以,如果因高速緩存頻繁命中失敗而導緻的資料同步的時間開銷相對于任務單元顯著加大的話,則可以考慮将任務線程綁定單個Core運作。現在再假設,如果多核排程的政策是:同一線程的不同片斷在同一時間片内可以運作在多個Core上。則如果線程編寫不好,便會導緻多個Core之間的資料同步。而如果資料同步處理不當,便會引發國企資料的使用,進而導緻進一步的錯誤。

任何技術的采用,都得付出其相應的代價。是以,無論是多線程還是多核多CPU,無論是OpenMP還是CUDA,如果其帶來的弊端大于其帶來的好處,便需要仔細考慮一下,追趕時髦技術所付出的代價,是否值得。