x86_64 SSE对齐:GCC和Clang之间的区别

时间:2019-01-10 17:26:01

标签: c alignment clang sse simd

我有一个广泛使用SSE内在函数的大型代码库,该代码库仅在GCC下针对x86_64平台开发。在堆栈上分配了很多__m128float[4],在x86_64上使用GCC进行编译时,它们总是对齐到16字节。

我们正在测试clang,它在未对齐的SSE加载和存储以及堆栈变量上崩溃。

似乎我可以__attribute__ ((aligned(16)))

一步一步地解决所有错误。

有没有办法强制clang将所有变量全局对齐为16个字节?我在文档中找不到任何内容。

1 个答案:

答案 0 :(得分:4)

__m128局部变量应该与任何编译器对齐16个字节,并且不需要任何其他工作。 float[4]仅具有4个字节的对齐方式,因此您需要为此添加合适的指令。大多数人为此使用宏,例如

#ifdef _MSC_VER
  // MSVC...
  #define ALIGN(n) declspec(align(n))
#else
  // the civilised world...
  #define ALIGN(n) __attribute__ ((aligned(n)))
#endif

,然后将变量声明为例如:

ALIGN(16) float[4] my_floats;