MinGW64无法进行32字节堆栈对齐(Windows x64上的AVX需要),是否可以轻松解决或切换编译器?

MinGW64无法进行32字节堆栈对齐(Windows x64上的AVX需要),是否可以轻松解决或切换编译器?,windows,gcc,alignment,mingw-w64,avx,Windows,Gcc,Alignment,Mingw W64,Avx,我正在尝试使用AVX指令和windows 64位。我很熟悉g++编译器,所以我一直在使用它,然而,有一个大的bug被描述并报告,并且给出了非常粗略的解决方案 基本上,m256变量不能在堆栈上对齐以与avx指令正常工作,它需要32字节对齐 在我链接的另一个堆栈问题中给出的解决方案非常糟糕,特别是当您考虑性能时。每次需要调试时都必须运行的python程序,该程序将指令替换为次优的未对齐指令,或者过度分配并在代码中执行大量昂贵的黑客指针数学运算以获得正确对齐。如果你做指针数学解,我认为仍然有可能出现s

我正在尝试使用AVX指令和windows 64位。我很熟悉g++编译器,所以我一直在使用它,然而,有一个大的bug被描述并报告,并且给出了非常粗略的解决方案

基本上,m256变量不能在堆栈上对齐以与avx指令正常工作,它需要32字节对齐

在我链接的另一个堆栈问题中给出的解决方案非常糟糕,特别是当您考虑性能时。每次需要调试时都必须运行的python程序,该程序将指令替换为次优的未对齐指令,或者过度分配并在代码中执行大量昂贵的黑客指针数学运算以获得正确对齐。如果你做指针数学解,我认为仍然有可能出现seg故障,因为你无法控制分配或r值/临时值


我正在寻找一个更简单、更便宜的解决方案。我不介意切换编译器,但如果这是最好的解决方案,我会选择。但是,我对这个错误的理解很差,因为它是windows 64位的固有缺陷,所以切换编译器会有帮助吗?或者其他编译器也会有同样的问题吗?

您可以通过切换到Microsoft的64位C/C++编译器来解决这个问题。这个问题不是64位Windows固有的。尽管Kai Tietz在您链接的bug报告中说了什么,但微软的x64 ABI确实允许编译器在堆栈上为变量提供大于16字节的对齐方式


此外,Cygwin的64位GCC4.9.2版本可以在堆栈上为变量提供32字节对齐

MinGW-w64不是有一个32位编译选项吗?@JasonR即使你包装了_m256以获得与黑客代码的正确对齐,AVX intrinsic仍然返回_m256,这意味着如果你正在编写需要使用临时变量的代码,那么_m256临时变量总是有可能从寄存器溢出到堆栈上,然后seg故障就会发生,对吗?所以这甚至不是一个真正的问题solution@Ragdoll:正是;仅仅在源代码中解决这个问题是无法实现的。您需要在编译器级别上提供某种级别的支持,以使其可行。一种可能的解决方案是编译器在向堆栈移动或从堆栈移动时发出未对齐的移动指令。这就是您链接的Python脚本的基本功能。不幸的是,当代处理器的256位未对齐移动会导致性能下降(尽管自Nehalem体系结构以来128位未对齐移动一直是全速的)。Microsoft和Intel编译器都会在使用AVX的每个函数调用开始时手动对齐堆栈。GCC不这样做的原因可能是。@JasonR,当你说
时,这与这个问题并不相关。潜在的问题是在mingw-w64中使用AVX指令是不安全的,因为Windows x64 ABI不支持AVX指令,因此它显然无法将堆栈与32字节对齐。
您的意思是AVX不适用于Windows吗?是这样吗?另请参见Ross的答案-
,尽管Kai Tietz在您链接的bug报告中说,微软的x64 ABI确实允许编译器在堆栈上为变量提供大于16字节的对齐方式。
猜猜是时候切换到visual Studio了studio@Ragdoll我刚刚检查了Cygwin,它也支持它。奇怪的是,我认为cygwins gcc编译器应该是一样的,我不认为cygwin修改了编译器,只是修改了工具链中的其他东西,他们有可能解决它吗?Kai知道你在说什么吗?@Royi对不起,我不知道。我不再关注MinGW开发,也从未关注过MinGW-w64。