gpt4 book ai didi

c++ - 什么会导致 _mm_setzero_si128() 变为 SIGSEGV?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:00 26 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Qt, GCC, SSE and stack alignment

我正在将模拟器从 TinyPTC 转换为 WxWidgets。一些图形例程使用 SSE 内在函数进行了优化。在 GUI 的初始化过程中,初始状态被渲染一次,所有的 SSE 例程都可以完美运行。但是,如果我稍后从事件处理程序调用它们,我会得到一个 SIGSEGV。

起初我认为这些是一些奇怪的对齐问题,但它甚至发生在:

__m128i zero = _mm_setzero_si128();

当我用未优化的代码替换 SSE 例程时,一切正常。

我想事件处理发生在与初始化不同的线程中。不同线程使用SSE有什么需要注意的吗?还有什么可能导致此行为?


SIGSEGV 发生在 movdqa %xmm0, -40(%ebp) 指令(其中有几个)。如果我用 -O1 编译,movdqa 指令被完全优化掉,程序运行良好。正如评论中已经指出的那样,这似乎毕竟是堆栈的对齐问题。

这是 CodeLite 为编译生成的命令:

g++ -c "x:/some/folder/sse.cpp" -g -O1 -Wall -std=gnu++0x -msse3
-mthreads -DHAVE_W32API_H -D__WXMSW__ -D__WXDEBUG__ -D_UNICODE
-ID:\CodeLite\wxWidgets\lib\gcc_dll\mswud -ID:\CodeLite\wxWidgets\include
-DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -o ./Debug/sse.o -I.

有什么异常吗? WxWidgets 是否有可能在某处更改对齐设置?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com