2013-05-22 83 views
0

我在學習矢量化(第一次學習)。關鍵是看看我能否展開一個循環。我喜歡像這樣加載四個連續的花車,請參閱Seg故障。無法將浮點數組讀入__m128

el0 = _mm_load_ps(&array[0]); 
el1 = _mm_load_ps(&array[1]); // Seg fault 

我明白爲什麼我會得到seg故障。我的問題是,是否有一個整潔的方式_mm_loading與抵消?

+1

您可能正在尋找未對齊的[加載內部函數](http://software.intel.com/sites/products/文檔/ doclib/stdxe/2013/composerxe /編譯器/ CPP-MAC/GUID-A3272CE8-E597-4296-AFE1-52BF12625F84.htm)。 '_mm_loadu_ps()'特別。 – Mysticial

+2

假設數組的類型是'float []',你可能還想跨4個元素而不是1個數組。 –

+0

Jason - 正如我所說的,重點是展開循環,即跨度大於1的元素。這裏的計劃是看我是否能在某些foo()計算中加快速度。我想要使​​用的數組元素是數組[i],數組[i + 1]和數組[i + 2],或者更具體的,從i,i + 1和i + 2開始的四個元素。神祕 - 我想我可以通過修改你鏈接的功能來調整工作。謝謝! –

回答

0

評論者已經解決了這個問題,但當問題出現在未解答的問題列表中時,它很煩人。

_mm_load_ps(&array[0]) // load a vector of array[0..3] 
_mm_load_ps(&array[1]) // load a vector of array[1..4]. different alignment than array[0] 

// what you probably want is: 
_mm_load_ps(&array[4]) // load a vector of array[4..7], aligned if array is aligned 

指數跨度應爲sizeof(vector_type)/sizeof(array[0])。 (然後,當您擴展您的AVX代碼時,您不必更改索引。)