【发布时间】:2015-09-04 20:29:19
【问题描述】:
我正在尝试使用 AVX 指令和 Windows 64 位。我对 g++ 编译器很满意,所以我一直在使用它,但是,报告了 here 报告的一个大错误,here 提出了非常粗略的解决方案。
基本上,m256 变量无法在堆栈上对齐以与 avx 指令正常工作,它需要 32 字节对齐。
在我链接的另一个堆栈问题中提出的解决方案非常糟糕,特别是如果您考虑到性能。每次要调试时都必须运行的 Python 程序,该程序将指令替换为次优的未对齐指令,或者过度分配并在代码中进行大量昂贵的 hacky 指针数学运算以获得正确的对齐。如果您执行指针数学解决方案,我认为仍然有可能出现段错误,因为您无法控制分配或 r-values / temporaries。
我正在寻找一种更简单、更便宜的解决方案。我不介意切换编译器,我宁愿不这样做,但如果这是最好的解决方案,我会的。但是,我对该错误的理解很差,因为它是 Windows 64 位固有的,所以切换编译器会有所帮助还是其他编译器也有同样的问题?
【问题讨论】:
-
MinGW-w64 没有 32 位编译选项吗?
-
@JasonR 即使您包装了 __m256 以与 hacky 代码正确对齐,AVX 内部函数仍然返回 __m256,这意味着如果您正在执行需要使用临时代码的代码,总有机会__m256 临时会溢出寄存器,进入堆栈,然后会发生段错误,对吗?所以这甚至不是一个真正的解决方案
-
@Ragdoll:没错;仅通过解决源代码中的问题就无法解决此问题。您需要在编译器级别提供一定程度的支持才能使其可行。一种可能的解决方案是编译器在移入/移出堆栈时发出未对齐的移动指令。这基本上就是您链接的 Python 脚本所做的。不幸的是,现代处理器对未对齐的 256 位移动有性能损失(尽管自 Nehalem 架构以来,128 位未对齐的移动一直是全速的)。
-
Microsoft 和 Intel 编译器都在每个使用 AVX 的函数调用开始时手动对齐堆栈。为什么 GCC 不这样做可能是related to exception handling。
-
@JasonR,当您说
That's not really relevant to this question. The underlying problem is that it's not safe to use AVX instructions in mingw-w64, because it apparently can't align the stack to 32 bytes because it isn't supported by the Windows x64 ABI.时,您的意思是 AVX 不适用于 Windows?就像它一样?另请参阅罗斯的回答 -Despite what Kai Tietz said in the bug report you linked, Microsoft's x64 ABI does allow a compiler to give variables a greater than 16-byte alignment on the stack.
标签: windows gcc alignment mingw-w64 avx