3 回答

TA貢獻2041條經驗 獲得超4個贊
許多CPU具有“向量”或“ SIMD”指令集,這些指令集將相同的操作同時應用于兩個,四個或更多數據?,F代的x86芯片具有SSE指令,許多PPC芯片具有“ Altivec”指令,甚至某些ARM芯片也具有稱為NEON的矢量指令集。
“向量化”(簡化)是重寫循環的過程,以便與其同時處理(例如)數組的4個元素N / 4次,而不是處理數組的單個元素N次。
(我之所以選擇4,是因為這是現代硬件最有可能直接支持的功能;“向量化”一詞也用于描述更高級別的軟件轉換,您可以在其中完全抽象出循環并僅描述對數組而不是元素的操作。組成它們)
向量化和循環展開之間的區別: 考慮以下非常簡單的循環,該循環將兩個數組的元素相加并將結果存儲到第三個數組中。
for (int i=0; i<16; ++i)
C[i] = A[i] + B[i];
展開此循環會將其轉換為如下形式:
for (int i=0; i<16; i+=4) {
C[i] = A[i] + B[i];
C[i+1] = A[i+1] + B[i+1];
C[i+2] = A[i+2] + B[i+2];
C[i+3] = A[i+3] + B[i+3];
}
另一方面,將其向量化會產生如下結果:
for (int i=0; i<16; i+=4)
addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);
其中“ addFourThingsAtOnceAndStoreResult”是您的編譯器用來指定矢量指令的任何內部函數的占位符。請注意,某些編譯器能夠自動矢量化非常簡單的這樣的循環,通常可以通過編譯選項啟用它。更復雜的算法仍然需要程序員的幫助才能生成良好的矢量代碼。

TA貢獻1806條經驗 獲得超5個贊
向量化在科學計算中得到了很大的應用,在科學計算中,大量數據需要得到有效處理。
在實際的編程應用程序中,我知道它已在NUMPY中使用(不確定其他)。
Numpy(Python中用于科學計算的軟件包),使用矢量化來快速處理n維數組,如果使用內置的python選項來處理數組,這通常會比較慢。
雖然萬噸的解釋是在那里,這里是矢量化定義為numpy的文檔頁面
向量化描述了代碼中沒有任何顯式的循環,索引等操作-當然,這些事情只是在優化的預編譯C代碼中“在幕后”發生的。向量化代碼具有許多優點,其中包括:
向量化的代碼更簡潔,更易于閱讀
更少的代碼行通常意味著更少的錯誤
該代碼更類似于標準數學符號(通常更容易正確地對數學構造進行編碼)
向量化產生更多的“ Pythonic”代碼。沒有向量化,我們的代碼將效率低下,并且難以閱讀循環。
- 3 回答
- 0 關注
- 5427 瀏覽
添加回答
舉報