3 回答

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

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