c++ - `__m256` 的包装器使用构造函数产生段错误 - Windows 64 + MinGW + AVX 问题

标签 c++ g++ mingw-w64 avx windows64

我有一个看起来像这样的 union

 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 函数一起使用,并且应该自动对齐,即使在 union 内也是如此。

当我这样做的时候

bareVec8f test = _mm256_set1_ps(1.0f);

我遇到了段错误。由于我创建的构造函数,这段代码应该可以工作。但是,当我这样做时

bareVec8f test;
test.m256 = _mm256_set1_ps(8.f);

我没有遇到段错误。

因为它工作正常,所以 union 可能正确对齐,似乎构造函数导致了一些段错误

我正在使用 gcc 64 位 Windows 编译器

--------------------------------编辑 Matt 设法给出了这里似乎发生的错误的最简单示例。

#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 字节堆栈对齐。 Bug 49001 Bug 54412


关于 this SO thread有人制作了一个 Python 脚本来处理 g++ 的程序集输出来解决这个问题,所以这是一个选择。

否则,为了在您的 union 中避免这种情况,您可以使按值获取 __m256 的函数改为通过引用获取它。这不应该有任何性能损失,除非优化很低/关闭。

如果您不知道 - union 别名会导致 C++ 中的未定义行为,不允许编写 m256 然后读取 floatsints例如。因此,也许您的问题有不同的解决方案。

关于c++ - `__m256` 的包装器使用构造函数产生段错误 - Windows 64 + MinGW + AVX 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30926241/

相关文章:

c++ - constexpr 静态从 int 转换为具有非固定基础类型的作用域枚举的未定义行为在 C++17 中编译

c++ - 我可以在 OpenFrameworks 中调用 testApp 以外的应用程序吗?

c++ - 你能举一个C++中堆栈溢出的例子吗?

c - MinGW w64 缺少 dll

c++ - 哪个跨平台 GUI 库对每个平台都具有最原生的感觉?

c++ - 数据转换解决方案

gcc - makefile 错误 : opening dependency file . d/file_name.Td: 没有这样的文件或目录

c++ - 如何生成可在Unix和Linux上运行的可执行文件?

ruby - 安装 Gem 时出现 SSL 错误(在 MinGW64-MSys2 上)

compilation - 尝试编译OpenVDB