我對使用gcc的x86-64 SSE向量指令感興趣,並且不想使用任何內聯彙編。有沒有辦法在C中做到這一點?如果是這樣,有人可以給我一個例子嗎?在沒有內聯彙編的情況下使用SSE指令和gcc
回答
是的,您可以使用* mmintrin.h頭文件中的內在函數(emmintrin.h
,xmmintrin.h
等,具體取決於您要使用的SSE級別)。出於多種原因,這通常比使用匯編器更可取。
#include <emmintrin.h>
int main(void)
{
__m128i a = _mm_set_epi32(4, 3, 2, 1);
__m128i b = _mm_set_epi32(7, 6, 5, 4);
__m128i c = _mm_add_epi32(a, b);
// ...
return 0;
}
請注意,這種方法適用於各種平臺上的大多數x86和x86-64編譯器,例如, gcc,clang和英特爾在Linux/Mac OS X/Windows上的ICC,甚至微軟的Visual C/C++(當然,只有Windows)。
找到gcc包含的*intrin.h
標題(這裏是/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/include/
)。
也許值得注意的是,標頭immintrin.h
根據您允許的功能(例如使用-msse2
或-mavx
)包含所有其他固有。
你想要的是intrinsics,它看起來像庫函數,但實際上內置於編譯器中,因此它們被轉換成特定的機器代碼。
Paul R和hroptatyr描述了在哪裏可以找到GCC的文檔。 Microsoft also has good documentation on the intrinsics in their compiler;即使你使用GCC,你也可能會發現MS對這個想法的描述是一個更好的教程。
ARM體系結構如何?它支持NEON SIMD嗎?或者這隻適用於x86? – enthusiasticgeek 2013-05-28 20:30:17
@enthusiasticgeek問題指定x86-64。 ARM和NEON有自己的編譯器和自己的內在函數。 – Crashworks 2013-06-03 05:23:24
- 1. GCC內聯彙編錯誤:沒有這樣的指令:`STOSD」
- 2. 在沒有反彙編程序的情況下掃描「調用」指令?
- 3. 內聯彙編,out指令
- 4. 用於複數乘法的彙編代碼/ AVX指令。 (GCC內聯彙編)
- 5. 如何在沒有指令的情況下使用JQuery和Angular?
- 6. GCC彙編內聯:與只有內聯彙編代碼
- 7. MSVC內聯彙編GCC的
- 8. 編譯sse內在指令
- 9. gcc內聯彙編上下文切換
- 10. 如何在沒有優化的情況下使用gcc與gcc?
- 11. 使用內聯彙編與GCC
- 12. GCC內聯彙編可變
- 13. GCC內聯彙編:約束
- 14. GCC內聯彙編錯誤
- 15. 使用SSE2內在函數和gcc內聯彙編器
- 16. 在SSE內部函數中使用'錯誤'指令的gcc(6.1.0)
- 17. GCC聯彙編
- 18. GCC C++和內聯彙編代碼?
- 19. ARM64(iOS)上的內聯彙編指令
- 20. 轉換一個GCC內聯彙編德爾福內聯彙編
- 21. 在沒有調試的情況下查找哪個彙編指令導致非法指令錯誤
- 22. ARM GCC是否具有彙編'REV'指令的內置函數?
- 23. GCC內聯彙編:調用DWORD PTR
- 24. 在沒有使用「RATE」命令的情況下在Excel中獲得匯率
- 25. 在C++中使用乘法累加指令內聯彙編
- 26. GCC內聯彙編 - 與__volatile__和「內存」有什麼不同?
- 27. 非法指令的gcc彙編
- 28. 聯彙編GCC中,指定由表達
- 29. GCC內聯彙編中的標籤
- 30. gcc的內聯彙編輸入變量
這是用於gcc還是VC++? – pythonic 2012-04-25 07:07:23
gcc和VC++都支持內在函數。 – 2012-04-25 07:29:37
FTW,icc也支持這些內在函數 – hroptatyr 2012-04-25 07:30:12