#include<cstdint>
#include<iostream>
#include<immintrin.h>
using namespace std;
int main()
{
alignas(32) int32_t a[32];
__m256i t256(_mm256_setzero_si256());
_mm256_store_si256(reinterpret_cast<__m256i*>(a),t256);
cout<<"pass"<<endl;
_mm256_store_si256(reinterpret_cast<__m256i*>(a+8),t256);
cout<<"pass"<<endl;
_mm256_store_si256(reinterpret_cast<__m256i*>(a+4),t256);
cout<<"pass"<<endl;
}
我在Windows中运行此程序时获得三次“通过”(由vs2017 15.6.6编译,CPU为i7-6700HQ)。
但是,我在arch linux中运行第三个语句时得到Segmentation fault
(由g ++ 7.3.1&amp; clang 6.0.0编译,CPU为i7-7820x)。
我使用的选项是-std=c++17 -march=native
。
在我看来,我可以存储在a
内的任何地方,因为a
在32字节边界上对齐,并且每个元素都是32位整数。
但是我得到了什么Segmentation fault
?
Intel _mm256_store_si256
答案 0 :(得分:1)
__m256i
需要与32字节(256位)边界对齐。由于数组a
通过alignas(32)
与32字节边界对齐,因此地址a
和a+8
(等效地址(char*)a + 8*sizeof(int32_t)
)也与32对齐字节边界。
然而a+4
不是。它的地址将在两个32字节边界之间。因此,您的第三个语句具有未定义的行为,并且可能在不同的体系结构上执行不同的操作。