与T的alignof(T)不等于__m512的alignof(__m512)

73
我遇到了一个奇怪的情况,即alignof(__m512)与由苹果的clang编译的std::alignment_of<__m512>::value不相等。经过一些测试,我发现当在模板中使用T=__m512时评估alignof(T),结果与直接使用alignof(__m512)不同。我还在Ubuntu(WSL)上使用g++和非苹果的clang编译了几个测试,并得到了正确(我认为)的行为。这是苹果的clang的一个错误还是已实现行为的问题?
#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


2
"常规 clang" 也能正常工作。 - Paul Sanders
1
你是在一台支持 AVX512 的机器上编译它吗? - thedudehimself
@thedudehimself 是的。 - VainMan
相关:D53207std::alignment_of<T>::value可能与alignof(T)不同,但这个问题可以追溯到2018年末,然而clang v11在2020年末发布。 - YSC
@thedudehimself 这有什么关系呢?我希望能够在没有 AVX512 的机器上进行交叉编译,以便为具有 AVX512 的机器编译程序。 - masterxilo
1个回答

1

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

struct X { __m512 m; }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接