軟體優化的原理與實踐系列之一向量化計算

celerychen發表於2018-09-20

向量化計算

軟體優化的原理與實踐系列之一

前言

用過MATLAB模擬語言的同學,都有這樣的經驗。要儘量多用向量化運算,而不要自己手寫迴圈語句,否則程式碼的執行效率會相當低下。如果你熟悉python,涉及到數值計算的時候,也要儘量的呼叫成熟的數值計算的庫,比如numpy,而不是自己用迴圈去實現。一個眾所周知的理由是,別人成熟的庫已經經過了高度的優化,我們沒有必要重複造輪子。

事實上,還有另外一個根本性的原因是,向量化計算,就即使沒有經過任何優化的程式碼,也會比非向量化運算要快。本篇博文將試圖解釋其根本性原因。

背景

現代計算機大都採用了分層的儲存器結構:暫存器,cache,主存,磁碟。CPU的計算單元直接和暫存器交換資訊,計算時需要把資料逐級傳遞到暫存器,計算得到的結果也要將結果逐級放回儲存器。基於這種儲存體系結構,程式設計師在編制軟體的時候,要儘量的減少和cache,主存,磁碟這些儲存器交換資料。我們把整個軟體的執行實行劃分為兩部分,CPU真正執行運算的時間和暫存器與儲存器交換資料的時間,即:

 常見線性代數運算操作的q值

小結

把計算流程用向量,矩陣的數學語言重新描述,在此基礎上實施的計算,總是比標量計算的效率高,即使程式碼沒有經過任何優化。


相關文章