向量化計算
軟體優化的原理與實踐系列之一
前言
用過MATLAB仿真語言的同學,都有這樣的經驗。要盡量多用向量化運算,而不要自己手寫循環語句,否則代碼的執行效率會相當低下。如果你熟悉python,涉及到數值計算的時候,也要盡量的調用成熟的數值計算的庫,比如numpy,而不是自己用循環去實作。一個衆所周知的理由是,别人成熟的庫已經經過了高度的優化,我們沒有必要重複造輪子。
事實上,還有另外一個根本性的原因是,向量化計算,就即使沒有經過任何優化的代碼,也會比非向量化運算要快。本篇博文将試圖解釋其根本性原因。
背景
現代計算機大都采用了分層的存儲器結構:寄存器,cache,主存,磁盤。CPU的計算單元直接和寄存器交換資訊,計算時需要把資料逐級傳遞到寄存器,計算得到的結果也要将結果逐級放回存儲器。基于這種存儲體系結構,程式員在編制軟體的時候,要盡量的減少和cache,主存,磁盤這些存儲器交換資料。我們把整個軟體的執行實行劃分為兩部分,CPU真正執行運算的時間和寄存器與存儲器交換資料的時間,即:

常見線性代數運算操作的q值
小結
把計算流程用向量,矩陣的數學語言重新描述,在此基礎上實施的計算,總是比标量計算的效率高,即使代碼沒有經過任何優化。