線程化方法學的四個步驟。算法
1, 分析(Analysis)編程
a) 必須對程序結構十分熟悉,算法精通。緩存
b) 判斷算法是否能夠修改成並行算法。多線程
c) 經過調試工具,獲取程序最耗時的地方。併發
d) 修改佔用時間最多的算法,得到最大收益。dom
2, 設計與實現(Design and implementation)分佈式
a) 函數
3, 測試正確性(Test for Correctness)工具
a) 知道全部線程化得錯誤,產生的緣由和產生的現象。性能
b) 學會使用線程調試工具和Debug調試工具。
4, 性能調優(Tune for Performance)
a) 線程化代碼調優經常使用方法。
b) 學會使用線程調優軟件。
開發方法:從串行到並行。先串行保證算法的正確,而後修改並行,跳過程序的性能。
理論模型:
並行隨機訪問機(Parallel Random Access Machine, PRAM)
問題核心:共享內存。共享內存致使兩種類型的讀操做限制和寫操做限制:併發或者獨佔(Exclusive)。
內存訪問模式 |
描述 |
併發讀,併發寫 (Concurrent Read, Concurrent Write,CRCW) |
多線程同時寫一個內存位置,而且多個線程同時寫入一個內存位置 |
併發讀,獨佔寫 (Exclusive Write,Concurrent Read, CREW) |
|
獨佔讀,併發寫 (Concurrent Write,Excusive Read, ERCW) |
|
獨佔讀,獨佔寫 (Concurrent Write,Excusive Read, EREW) |
|
分佈式內存模型(Distributed-Memory)
經常使用可移植庫:
l PVM(Parallel Virutual Machine,並行虛擬機)
l MPI(Message Passing Interface, 消息傳遞接口)。更多信息能夠從Beowulf項目得到。
共享內存編程與分佈式內存編程的比較
共有功能:
冗餘工做:
1, 分佈式確定會由於發送數據和接受數據產生執行開銷。
2, 多線程產生數據產生冗餘開銷。
分解工做:
1, 分配工做到不一樣的線程和進程中。
共享數據:
1, 部分數據根據程序須要被線程和進程共享。
工做的靜態/動態分配:
1, 總執行時間大體等於每一部分工做的執行時間之和,應用於靜態分配。
2, 當工做的數量遠多於線程的數量,而且時間不能計算,應用於動態分配。
共享內存獨有功能:
局部變量和線程局部存儲。Windows和POSIX線程都定義了線程局部存儲(Thread-Local Storage, TLS) API。TLS的值在不一樣函數之間保持不變,相似於靜態變量。
內存效應:
多核之間共享緩存,要處理緩存置換問題。
多核之間獨有緩存,效率比較低。
僞共享。線程的不一樣變量被包含在同一條緩存線(Cache Line)中。根據緩存一致性原則,當某個線程更新緩存中的一個變量,若是另外一個線程但願訪問緩存線其餘內容是,須要先將改緩存線寫回到內存中。
內存中的通訊:
對同一個內存區域,進行讀寫。
互斥:
每次只容許一個線程訪問相同的共享變量。
生產者和消費者:
讀/寫鎖
緩存一致性協議參考文檔: