2016-05-07 49 views
0

我可以定義一個函數指針_mm_load_ps_mm_store_ps之類?英特爾內部函數 - 函數指針加載/存儲

我在考慮類似

float* x0; //param 
... 
__m128 (*load_x0)(float const *mem); 
if((unsigned long)x0 & 15) load_x0 = &_mm_loadu_ps; 
else load_x0 = &_mm_load_ps; 

但導致

未定義參考_mm_load_ps

未定義參考_mm_loadu_ps

回答

2

內在功能被直接編譯成它們代表指令的適當的報頭。沒有函數調用被髮射,並且任何庫中都不存在這些函數的實現。出於這個原因,你不能使用一個內部函數指針。

考慮將包裝這樣的:

__m128 my_mm_load_ps(float const *mem) 
{ 
    return _mm_load_ps(mem); 
} 

__m128 my_mm_loadu_ps(float const *mem) 
{ 
    return _mm_loadu_ps(mem); 
} 

您可以使用包裝的函數指針:

__m128 (*load_x0)(float const *mem); 
if((unsigned long)x0 & 15) load_x0 = &my_mm_loadu_ps; 
else load_x0 = &my_mm_load_ps; 
+0

有趣。所以我儘可能地使用對齊的負載,但需要爲額外的函數調用支付額外開銷。你認爲這會得到回報? – User1291

+2

@ User1291不,它不會。除了幾個非常古老的微架構之外,在對齊和未對齊指令(在對齊數據上使用時)之間沒有區別。 – fuz

+1

@ User1291只需使用未對齊的負載的一切,它會很好。基準,如果有疑問。 – fuz

-1

你包括他這些功能的文件?

「xmmintrin.h」是這些矢量載荷

+0

當然。 (實際上,使用pmmintrin.h。)我刪除了「load_x0」的賦值,並固執地使用'_mm_loadu_ps''到處都沒有這樣的錯誤。 – User1291

+2

如果這些是編譯器內在函數,那麼它們沒有地址,並且不能引用它們。 –

+0

我不認爲有辦法規避這種限制,不是嗎?這是...令人不滿意的。不管怎樣,謝謝。你想詳細說明,所以我可以接受它作爲答案? – User1291