【发布时间】:2017-02-16 16:17:18
【问题描述】:
我报告了一个应用程序 (makeahmap) 在执行 SIMD 代码时崩溃:
https://github.com/artyom-beilis/makeahmap/blob/master/sources/makeahmap.cpp#L947
我无法在我的机器上使用完全相同的输入重现该问题:
- 我没有使用 Windows 7 开发我的 windows
- 在 Linux 上也不行 - 不仅如此,程序在 valgrind 下运行完美,错误为 0。
- 所有加载和存储都是未对齐的,并且所有值都有很大的边距来加载和保存 16 字节未对齐的数据。
- 该程序是 32 位的,使用 mingw-g++ 构建
问题:
- 什么样的工具可以帮助我找到用户电脑崩溃的原因?
- 可能缺少哪些内容?
【问题讨论】:
-
我似乎记得 gcc 有时会错误地假定堆栈是 16 字节对齐时出现了这个错误。我认为尝试
-mstackrealign不会造成伤害 -
我没有点击链接来查看您的代码;它的相关部分应该在这里。一个猜测:客户的 CPU 是否支持您使用的 SSE 指令?
-
Windows 8、Windows 8.1 和 Windows 10 无法安装在不支持 SSE、SSE2、NX 或 PAE 的处理器上。所有 x64 处理器都必须支持这些,因此操作系统也会强制检查 32 位。见Windows 8.x system requirements。这也意味着您不能指望 SSE3、SSSE3、SSE4.x 或 AVX,并且必须检查处理器支持,以确保您没有使用这些指令之一。似乎该应用程序并不能确保在所有情况下都对齐内存分配,而只是在 Windows 7 上很幸运。