我对使用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