【问题标题】:x86_64 SSE alignment : differences between GCC and Clangx86_64 SSE 对齐:GCC 和 Clang 之间的差异
【发布时间】:2019-06-05 15:12:33
【问题描述】:

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

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

看来我可以一一解决所有错误__attribute__ ((aligned(16)))

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

【问题讨论】:

  • 当 gcc 可以看到代码执行 SIMD 加载/存储到本地数组时,它会选择对齐目标数组。 (使您免于自己未指定对齐的错误)。此外,x86-64 SysV ABI 指定至少 16 字节的本地或全局数组以及所有 VLA 获得 16 字节对齐(3.1.2 聚合和联合),所以 IDK 为什么 clang 不这样做。可能不是针对 Linux / OS X,或者 LLVM 认为 ABI 超出了指定本地对齐的界限。

标签: c alignment clang sse simd


【解决方案1】:

__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;

【讨论】:

  • 在可移植 C11 中,#include <stdalign.h> 并使用 alignas(16) float arr[4];(作为奖励,与 C++ 完全相同的语法将编译。)
猜你喜欢
  • 2017-10-09
  • 2012-08-14
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 2019-04-09
  • 2016-11-17
  • 2014-07-12
  • 2019-03-26
相关资源
最近更新 更多