多核心與同步
以多個執行緒計算陣列所有元素的總和時,為了效能,適合的方法為下列何者?
- A所有執行緒針對每個元素,取得鎖後加到一個共用變數
- B所有執行緒針對每個元素,不經同步就加到一個共用變數
- C各執行緒以區域變數加總自己負責的部分,最後再將這些結果各加一次
查看答案與解析
正確答案:C. 各執行緒以區域變數加總自己負責的部分,最後再將這些結果各加一次
若針對每個元素更新共用變數,鎖或原子指令的等待,加上快取列的來回移動,會變得非常慢。各執行緒以暫存器或區域變數求出部分和,最後只用執行緒數量的加法算出整體的和,共用的寫入就會非常少。這種方法稱為歸約(reduction),也已內建於OpenMP等平行化機制中。
- A. 鎖的等待與通訊會使平行化的效果幾乎消失。
- B. 會有資料競爭,總和不會正確。
- C. 正確。這是稱為歸約的方法。