?5555
負載不平衡指多個線程的計算量差異顯著,導致部分線程空轉或等待,降低并行效率。其核心矛盾在于任務劃分的靜態性與計算動態性不匹配,尤其在處理不規則數據或動態任務時尤為突出。以稀疏矩陣的向量乘法為例,假設其非零元素分布極不均勻,會導致靜態調度下線程負載差異很大。因此,采樣動態調度,在運行時按需分配任務,當某線程完成其塊后主動請求新塊進行運算,并通過合理的鎖機制來規避死鎖問題。此外,進行數據重排與分塊優化也可處理負載不平衡問題,即將高密度作為小塊,低密度作為大塊分發給不同線程。
444
區塊分發基本原理為將任務空間劃分為連續且大小相等的塊,每個線程分配一個或多個完整塊
循環分發基本原理為按輪詢方式分配單個任務給各線程。
塊循環分發結合以上兩種方法,基本原理為依次為每個線程分發一個包含多個任務的固定塊,重復分配直到全部任務都被處理
對比可以發現,區塊分發的局部性好,在連續內存訪問時,緩存命中率高,但存在問題為若任務執行時間差異大,可能導致部分線程空閑,即負載不平衡問題;而循環分發負載較為均衡,適用于任務執行時間差異大的場景;塊循環分發結合區塊和循環分發,通過調整塊大小,使每個線程分配到緩存行整數倍大小的塊,就可兼顧內存局部性和負載均衡,因此靈活性高,適用場景廣。
虛假共享是循環分發的程序修改數組元素后,若其他線程要訪問的元素與該元素同屬一個緩存行中,就不得不重新載入數據;由于循環分發的跳躍式內存訪問,若其跳躍的步長不足一個緩存行,那么相鄰線程就會頻繁出現虛假共享的問題。
3333
?多線程 | ?多進程 | |
---|---|---|
?內存模型 | 共享同一進程的地址空間(全局變量、堆內存等) | 每個進程擁有獨立地址空間,需通過IPC(管道、共享內存等)通信 |
?資源開銷 | 線程創建/切換僅需分配棧空間 | 需復制父進程資源(內存、文件描述符等),上下文切換成本高 |
?同步與互斥 | 需鎖機制(互斥鎖、信號量等)避免數據競爭 | 進程間資源隔離,天然避免內存競爭(但需處理IPC同步) |
?穩定性 | 線程崩潰可能導致整個進程終止 | 進程間隔離,單個進程崩潰不影響其他進程 |
多線程主要目的在于避免空閑的未使用資源,多進程的目的在于利用冗余的資源。?
多線程可充分利用多核CPU并行執行;上下文切換僅涉及寄存器/棧,開銷較小;線程之間能夠更高效地實現資源共享,無需復雜的IPC機制。
?方法 | ?行為 | ?資源管理 | ?注意事項 |
---|---|---|---|
?join() | 阻塞調用線程,等待目標線程執行完成 | 自動回收線程資源(棧、寄存器狀態等) | - 必須在析構前調用,否則觸發std::terminate() - 同一線程只能join一次 |
?detach() | 分離線程生命周期,使其成為后臺守護線程 | 資源由運行時(C++)或init進程(Linux)回收 | - 分離后無法再join - 需確保線程不訪問已銷毀對象 |
一句話來講,join方法產生的子線程是由調用線程管理的,而detach產生的子線程脫離了調用線程,由系統負責管理?
22222?
虛假共享是指多個線程訪問同一緩存行中不同變量時,因為修改導致緩存一致性協議頻繁觸發,從而降低性能。具體來說,現代CPU的緩存以64字節的緩存行為單位管理,當一個線程修改緩存行中的數據時,其他線程的該緩存行會被標記為無效,需要重新從內存加載,即使這些線程操作的是緩存行中不同的變量
原因可歸納為一下兩點:1.變量在內存中連續存儲,可能被分配到同一緩存行,而MESI協議以緩存行為最小單位維護一致性,無法區分變量是否真正共享。2.?不同線程修改同一緩存行中的獨立變量,觸發緩存行無效化
1111?
馮·諾依曼瓶頸指計算機中CPU與內存之間的數據傳輸速率遠低于CPU計算速度,導致CPU因等待數據而空轉的性能瓶頸。
在矩陣乘法運算中,利用緩存能夠加快CPU獲取矩陣數據,這主要基于空間局部性和時間局部性的原理;對于空間局部性,CPU按緩存行加載數據,一次加載可滿足8次相鄰地址浮點數之間的訪問需求,此外,將B矩陣轉置存儲于緩存中,使?B[k][j]?按行訪問,可避免跳躍式內存訪問導致的緩存失效,從而可以進一步加快矩陣乘法計算速度;對于時間局部性,緩存可以避免重復從內存加載相同數據,如計算 C[i][j]?時需遍歷 A?的第?i?行和 B?的第?j?列,若這些數據緩存在L1/L2中,后續計算 C[i][k]?或 C[k][j]?時可復用
其核心原因是馮·諾依曼架構中指令和數據共享同一總線,導致取指令和取數據無法并行
例如,當CPU需要頻繁訪問內存時,總線帶寬不足會顯著降低吞吐量,尤其在處理大規模數據時(如深度學習的矩陣運算)
在矩陣乘法W=U×V中,緩存通過以下機制緩解瓶頸:
- ?時間局部性:頻繁訪問的行列元素(如U的行向量和V的列向量)被保留在高速緩存中,減少內存訪問次數