【问题标题】:SIMD/SSE code crashes on Windows 8 running clearly on Windows 7 and Linux在 Windows 7 和 Linux 上清晰运行的 Windows 8 上的 SIMD/SSE 代码崩溃
【发布时间】: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++ 构建

问题:

  1. 什么样的工具可以帮助我找到用户电脑崩溃的原因?
  2. 可能缺少哪些内容?

【问题讨论】:

  • 我似乎记得 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 上很幸运。

标签: c++ windows sse simd


【解决方案1】:

问题是:

  1. Windows 使用 4 字节堆栈对齐方式
  2. GCC 使用的默认堆栈对齐方式为 16 字节。它修复了 main/winmain 中的对齐,但它不适用于从外部线程调用的函数,因为不能保证 16 字节对齐。

解决方案:

__attribute__((force_align_arg_pointer))属性添加到从线程调用的函数中。

【讨论】:

  • 感谢@Ap31 给了我解决方案的方向
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2011-06-06
  • 2023-03-23
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多