1. 程式人生 > >並行演算法設計與效能優化總結

並行演算法設計與效能優化總結

與其說是總結,不如說是查漏補缺。因此,可能對別人來說,看起來語無倫次,毫無章法,僅作為自己的記錄:

1.並行和併發的區別在於併發是在單核上執行多執行緒,即為滿足使用者應用需求,並行才是為了加速。

2.一般來說,並行相對序列的加速比,不會超過核數。Amdal定律告訴我們,在計算規模一定的前提下,只要程式碼中有不能並行的部分,程式是不太可能完全線性加速的,在處理器核心增多的情況下,並行不好的部分,可能會成為加速的瓶頸,最終程式或硬體達到一定的核心數量的極限,再增加核心不會增加效能了。

3.CPU的功耗與頻率的三次方近似成正比,這導致無限制的提升CPU頻率已經無可能,因此才出現多核,GPU等滿足效能要求。

4.將多個多核整合在一起,叫多路,而GPU將幾百,幾千個核心整合在一起,叫眾核。

5.在實踐中,程序可以排程到一臺機器中的一個核心或者多個處理器核心上,而執行緒會排程到一個核心上執行,向量化的程式碼則會對映到一個核心內的向量單元上執行。由於作業系統的排程策略不同,並不會保證程序和執行緒一直在相同的核心上執行。通常基於程序的是像MPI一樣的分散式儲存器程式設計模式,基於執行緒的是像OpenMP,pthread等基於共享儲存器的程式設計模式。基於分散式計算的各節點有獨立的儲存器,因此,基於程序的訊息傳遞通訊更合適,而多核等由於共享儲存器,基於執行緒的共享儲存器更合適。

6.所謂超執行緒,是晶片廠商提供了切換執行緒的代價。一般應用加速比不超過20%。

7.GPGPU是一種利用處理影象任務的GPU來完成本來有CPU處理(與影象處理無關的)的通用計算任務。

8.指令級並行方法有:指令流水線,亂序執行,多發射,VLIW和分支預測。

9.向量級並行方法有:SIMD,SIMT

10.執行緒級並行:多線 程並行。

      10.1執行在使用者空間的執行緒叫使用者執行緒,執行在核心的執行緒叫核心執行緒,使用者執行緒由庫管理,無需作業系統支援,因此建立和排程無需干擾作業系統的執行,消耗少,作業系統不知使用者執行緒的存在,因此無法將使用者執行緒對映到核心上,當用戶執行緒由於資源分配而阻塞時,作業系統無法切換。為了將使用者執行緒和核心執行緒的優點同時發揮出來,現代庫和作業系統將使用者執行緒對映到核心執行緒,通常有一對一,一對多,多對多,多對一,多數為多對多的方式,實際在核心上執行的執行緒數量可能遠少於宣告和建立的執行緒數。

       10.2常見的多執行緒程式設計庫有:pthread,win32 thread,OpenMP,C/C++新標準,OpenCL和CUDA,OpenACC

       10.3通常,支援超執行緒的多核處理器能夠使用的執行緒數最多是物理核心的2倍,還要防止資料競爭,死鎖,餓死,記憶體偽共享等問題。所謂資料競爭就是在多個執行緒訪問相同資料時,由於同步等原因,需要讓步等待其他執行緒訪問結束,導致效能降低,所謂偽共享,是多個執行緒讀寫資料對映在一個cache線上時,如果一個執行緒更改了資料,那麼其他執行緒對該資料的快取就失效,如果執行緒頻繁的更改資料,硬體就需要不停的更新cache線,這使得效能從獨享cache降低到共享cache或者記憶體的水平。

       10.4多核和單核上多執行緒執行的不同。

       10.4.1單核上,多執行緒就是併發,多個執行緒執行鎖或者臨界區,實際上是一個執行緒在執行,而核心也只支援一個執行緒在執行,執行緒排程影響的只是持有和釋放鎖的時間,多核上,鎖或者臨界區會導致其餘的處理器空閒而只允許一個處理器執行持有鎖的那個執行緒,這中序列會影響效能。

       10.4.2單核上,負載均衡不用考慮,多核上,此時最終執行時間由執行最長的執行緒決定。

       10.4.3單核上,任務排程完全由作業系統執行,無須開發人員干預,而多核上,需要人為合理分配核心計算任務,以儘量同時結束計算。

11.cache,虛擬記憶體TLB,NUMA等記憶體訪問加速技術。NUMA技術的使用,需要保證控制流(執行緒或者程序等)分配儲存器時分配在離自己近的實體記憶體上,這可以通過執行緒內使用malloc分配來辦到。同時要保證控制流不能核心間遷移。即綁核。如GCC的環境變數GOMP_CPU_AFFINITY=“0-3 4-10:2”,Linux系統有numactl工具設定NUMA特性,以及pthread提供API,OpenMP也是提供API。

11.序列程式碼優化從 以下幾個角度分析:     11.1系統級,需要分析出效能控制因素,例如網速,利用率,負載均衡。如果CPU使用率不高且很穩定,則需要優化記憶體頻寬,若CPU使用率忽上忽下,則需要考慮其他程序佔用CPU。當然,CPU大多時候空閒,說明沒有很大程度上發揮硬體計算能力,或者,訪問頻寬太小,或者CPU在等待其他程序,執行緒釋放資源等。      11.2應用級別,通常有編譯選項,呼叫高效能庫,去掉全域性變數等、      11.3演算法級,函式級,迴圈級,語句級,指令級