T =__ m512的 alignof (T)不等于 alignof (__m512)

我遇到了一个奇怪的情况,alignof(__m512)不等于 std::alignment_of<__m512>::value编译苹果的叮当声。经过一些测试,我发现当 alignof(T)在一个模板内与 T=__m512评估,结果是不同的直接 alignof(__m512)。 我还在 ubuntu (WSL)上运行了几个由 g + + 和非 Apple 编译的测试,得到了正确的(我认为)行为。 这是苹果公司的一个漏洞,还是一个关于实现行为的问题?

#include <immintrin.h> //avx headers


#include <cstdio>
#include <typeinfo>
#include <type_traits>


void test_directly() {
printf("directly: typeid %s alignof %zu\n", typeid(__m512).name(), alignof(__m512));
}


template<typename T>
void test_as_template_argument() {
static_assert(std::is_same<T, __m512>::value, "assert");
printf("template: typeid %s alignof %zu\n", typeid(T).name(), alignof(T));
}


int main() {
test_directly();
test_as_template_argument<__m512>();
return 0;
}

输出(用 clang++ -std=c++17 -march=native编译) :

directly: typeid Dv16_f alignof 64
template: typeid Dv16_f alignof 32

Clang 的版本:

Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

MacOS 版本: macOS Catalina 10.15.4 (19E2269) Darwin 19.4.0

1685 次浏览

这似乎是一个错误。您可以通过像下面这样将 __m512包装在一个结构中来获得所需的行为:

struct X { __m512 m; }