以下兩行有何區別?_mm_load_ps vs. _mm_load_pd vs.等
__m128 x = _mm_load_ps((float *) ptr);
__m128 y = _mm_load_pd((double *)ptr);
換句話說,爲什麼會有這麼多不同的_mm_load_xyz
的指令,而不是通用__m128 _mm_load(const void *)
?
以下兩行有何區別?_mm_load_ps vs. _mm_load_pd vs.等
__m128 x = _mm_load_ps((float *) ptr);
__m128 y = _mm_load_pd((double *)ptr);
換句話說,爲什麼會有這麼多不同的_mm_load_xyz
的指令,而不是通用__m128 _mm_load(const void *)
?
有不同的內在,因爲它們對應於不同的指令。
有不同的加載指令,因爲英特爾希望保持設計處理器的自由度,雙精度向量由不同的物理寄存器文件支持,而不是單精度向量或整數向量,或使用不同的執行單元。如果沒有辦法指定數據應該加載到適當的寄存器文件或轉發網絡,任何這些可能會增加額外的延遲。想一想
一種方式是不同的指令做「同樣的事情」,但另外提供了一個提示處理器告訴它如何對待加載的數據將被未來的使用說明書操作。這可以幫助處理器確保數據處於正確的位置,以便儘可能有效地使用,或者可能會被處理器忽略。
請注意,這不只是一個假設。在使用整數向量加載(MOVDQA)來加載浮點運算所消耗的數據的處理器上,與使用浮點運算來獲取浮點運算數據相比,需要更多的時間(反之亦然) 。有關此主題的更多詳細信息,請參閱「英特爾優化手冊」或Agner Fog的說明。使用與您將如何使用數據相匹配的負載,以避免將來出現此類性能危險。
_mm_load_ps
負荷4個單精度浮點值
_mm_load_pd
負載2的雙精度浮點值
這些做不同的事情,所以我覺得這很有道理的具有不同的功能。而且,在C中,沒有超載。
比我的更好的解釋:) – 2012-01-13 19:27:58
所以這只是一個語義問題,而不是CPU相關的東西? – Mehrdad 2012-01-13 19:29:36
@Mehrdad,好吧,既然我們在這裏使用內在函數,那麼這些函數在執行時可能會有所不同,而不允許泛化。 – 2012-01-13 19:38:49
的返回類型'_mm_load_pd'是'__m128d',不'__m128' – 2012-01-13 19:57:05
@PaulR:那....讓世界上所有的感覺。我完全沒有注意到這一點。感謝您指出。 :) – Mehrdad 2012-01-13 20:00:26