2012-11-16 51 views
0

我讀過的關於使用C/C++內在類型來處理SIMD功能(如MMX和SSE)的一切都表明,您應該將這些類型用作不透明類型,而不是直接引用內部函數。但是,當我看到很多示例時,他們通過獲取(明確對齊的)指向原始數據的指針並將其重新解釋爲指向內部類型的指針,然後再進行工作。但是,通過使用指向內部類型的指針,特別是在將其他數據別名爲這些類型時,是否違反該規則?SIMD內部函數和指針

+0

正常情況下,指向原始數據的指針是一個'unsigned char *'或'void *',當涉及到指針混疊時它有特殊的規則。一旦你有了實際的內在類型,你就可以使用內部類型指針來引用它。 –

回答

4

你似乎發現的是大多數例子都是吸引人的。

引用SSE類型的「內部」實際上相當安全(只要它編譯),並且實際上你可以在內存中將它們別名爲內存中的「正常」數據類型,並且很多的人這樣做是因爲它使得代碼更方便地編寫和使用。

但它幾乎毀了使用SIMD的要點。它阻止了很多優化,這意味着編譯器必須不斷地存儲/加載SIMD數據類型,而不是將它們保存在SIMD寄存器中。

可以這樣做,但你應該不是。正如你發現的那樣,許多人認爲「應該」是「隨意做到這一點」。

+0

這就是我認爲的可移植性,它當然會起作用,但編譯器會爲這些特定實例生成次優代碼。 – Omaha