SIMD/SSE 代码在 Windows 8 运行 上明显崩溃 Windows 7 和 Linux
SIMD/SSE code crashes on Windows 8 running clearly on Windows 7 and Linux
我有一个应用程序 (makeahmap) 在执行 SIMD 代码时崩溃的报告:
https://github.com/artyom-beilis/makeahmap/blob/master/sources/makeahmap.cpp#L947
我无法在我的机器上使用完全相同的输入重现该问题:
- 都没有 Windows 7 我用 windows 开发
- 也不在 Linux - 不仅如此,程序在 valgrind 下运行完美,错误为 0。
- 所有加载和存储都是未对齐的,并且所有值都有较大的边距用于加载和保存 16 字节未对齐数据。
- 程序为32位,使用mingw-g++构建
问题:
- 什么样的工具可以帮助我找到用户电脑崩溃的原因?
- 可能缺少什么东西?
问题是:
- Windows 使用 4 字节堆栈对齐
- GCC 在 16 字节中使用的默认堆栈对齐方式。它修复了 main/winmain 中的对齐,但它不适用于从外部线程调用的函数,因为不能保证 16 字节对齐。
解决方案:
向从线程调用的函数添加 __attribute__((force_align_arg_pointer))
属性。
我有一个应用程序 (makeahmap) 在执行 SIMD 代码时崩溃的报告:
https://github.com/artyom-beilis/makeahmap/blob/master/sources/makeahmap.cpp#L947
我无法在我的机器上使用完全相同的输入重现该问题:
- 都没有 Windows 7 我用 windows 开发
- 也不在 Linux - 不仅如此,程序在 valgrind 下运行完美,错误为 0。
- 所有加载和存储都是未对齐的,并且所有值都有较大的边距用于加载和保存 16 字节未对齐数据。
- 程序为32位,使用mingw-g++构建
问题:
- 什么样的工具可以帮助我找到用户电脑崩溃的原因?
- 可能缺少什么东西?
问题是:
- Windows 使用 4 字节堆栈对齐
- GCC 在 16 字节中使用的默认堆栈对齐方式。它修复了 main/winmain 中的对齐,但它不适用于从外部线程调用的函数,因为不能保证 16 字节对齐。
解决方案:
向从线程调用的函数添加 __attribute__((force_align_arg_pointer))
属性。