2017-02-25 39 views
1

我有8個矢量的32字節對齊的結構在它:什麼時候將__m256轉換爲正確而不是加載?

struct ALIGN(32) Ray8 
{ 
    float x[8]; 
    float y[8]; 
    float z[8]; 
}; 

當使用AVX2,我想在一致這些部件進行操作。我什麼時候需要使用_mm256_load_ps()明確加載它們而不是投射它們?例如,使用以下簽名:

void GenerateRayDirections(__m256 * x, _m256 * y, _m256 * z) { ... } 

援引爲

void GenerateRayDirections((__m256*)ray.x, (__m256*)ray.y, (__m256*)ray.z); 

我使用英特爾的恩布里庫,他們有一個vfloat8類內部存儲的表示形式_m256和是float8的工會,所以根本沒有鑄造 - 但似乎也沒有負載電話。如果我改爲嵌入vfloat8類:

void GenerateRayDirections(&ray.x.v, &ray.y.v, &ray.z.v); 

我正在尋找一些關於何時加載或投射的指導?

+0

當你想讓它們在一個向量中時加載到向量上,並在你想要投射概念時施放它們,你確定要加載嗎?你的彙編代碼證明了它嗎? – Martin

回答

0

實際上,就生成的程序集而言,在演員或電話號碼_mm256_load_ps之間應該沒有區別。正如你指出的那樣,你甚至可以通過聯合來獲得理想的結果。

但是,所有這些都會生成加載和存儲指令(vmov)。

爲什麼您可能更喜歡手動撥打_mm256_load_ps?因爲它迫使你考慮數據何時從內存移動到向量寄存器。使用鑄造和工會的缺點是你可能不知道裝載和存儲。它們具有顯着的延遲懲罰,更糟糕的是高級源代碼可能指示什麼。

使用像_mm256_loadu_ps這樣的內在函數的另一個好處是您可以在沒有惡意崩潰的情況下允許未對齊的內存訪問。

相關問題