2017-02-16 89 views
0

明確運行我有一個應用程序(makeahmap)的報告崩潰,當執行SIMD代碼:在Windows 8 SIMD/SSE代碼崩潰在Windows 7和Linux

https://github.com/artyom-beilis/makeahmap/blob/master/sources/makeahmap.cpp#L947

我不能準確地重現該問題我的機器上相同的輸入:

  • 無論是Windows 7,我用我的Windows開發
  • 也不在Linux上 - 還不止這些,該方案具有完美的valgrind下0錯誤運行。
  • 所有加載和存儲都未對齊,並且所有值都具有較大的頁邊空白用於加載和保存16個字節的未對齊數據。
  • 該計劃是32位,並使用MinGW的-G ++內置

問:

  1. 什麼樣的工具可以幫助我找到了墜毀在用戶的PC上的原因是什麼?
  2. 什麼東西可能會丟失?
+1

我似乎記得gcc有這個錯誤,當它有時錯誤地推測堆棧是16字節對齊。嘗試'-mstackrealign'不會傷害我認爲 – Ap31

+0

我沒有點擊鏈接查看你的代碼;它的相關部分應該在這裏。猜測:客戶的CPU是否支持您使用的SSE指令? – 1201ProgramAlarm

+0

Windows 8,Windows 8.1和Windows 10不會安裝在不支持SSE,SSE2,NX或PAE的處理器上。所有的x64處理器都必須支持這些,所以操作系統也會強制檢查32位。請參閱[Windows 8.x系統要求](https://support.microsoft.com/en-us/help/12660/windows-8-system-requirements)。這也意味着您不能依靠SSE3,SSSE3,SSE4.x或AVX,並且必須檢查處理器支持,以確保您沒有使用這些指令之一。似乎應用程序不能確保所有情況下對齊的內存分配,只是在Windows 7上幸運。 –

回答

0

的問題是:

  1. Windows使用4字節堆棧對齊
  2. 默認棧對齊GCC使用16字節。它修復了main/winmain中的對齊方式,但它不適用於從外部線程調用的函數,因爲不保證16字節對齊。

解決方案:

添加__attribute__((force_align_arg_pointer))屬性,從線程調用的函數。

+0

的情況感謝@ Ap31給了我解決方案的方向 – Artyom