我有一个看起来像这样的联合
union bareVec8f {
__m256 m256; //avx 8x float vector
float floats[8];
int ints[8];
inline bareVec8f(){
}
inline bareVec8f(__m256 vec){
this->m256 = vec;
}
inline bareVec8f &operator=(__m256 m256) {
this->m256 = m256;
return *this;
}
inline operator __m256 &() {
return m256;
}
}
__m256需要在 32 字节边界上对齐才能与 SSE 函数一起使用,并且应该自动对齐,即使在联合内也是如此。
当我这样做时
bareVec8f test = _mm256_set1_ps(1.0f);
我遇到分段错误。由于我制作的构造函数,此代码应该有效。但是,当我这样做时
bareVec8f test;
test.m256 = _mm256_set1_ps(8.f);
我没有遇到分段错误。
因此,由于工作正常,联合可能正确对齐,似乎构造函数会导致一些分段错误
我正在使用 gcc 64 位窗口编译器
---------------------------------编辑马特设法提出了这里似乎正在发生的错误的最简单的例子。
#include <immintrin.h>
void foo(__m256 x) {}
int main()
{
__m256 r = _mm256_set1_ps(0.0f);
foo(r);
}
我正在编译-std=c++11 -mavx
这是 Windows g++ 中的一个错误。它不会在应该执行 32 字节堆栈对齐时执行。 错误 49001 错误 54412
在这个SO线程上,有人制作了一个Python脚本来处理g ++的程序集输出来解决问题,所以这将是一个选择。
否则,为了避免在联合中出现这种情况,您可以使按值获取__m256
的函数改为通过引用获取。这不应该有任何性能损失,除非优化为低/关闭。
如果您不知道 - 联合别名会导致C++中未定义的行为,例如不允许写入m256
然后读取floats
或ints
。因此,也许您的问题有不同的解决方案。