首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SIMD指令中捕获SIGFPE

从SIMD指令中捕获SIGFPE
EN

Stack Overflow用户
提问于 2016-09-25 18:16:09
回答 1查看 369关注 0票数 1

我试图清除浮点除以零标志,以忽略这个例外。我期望在设置了标志(我相信默认行为没有变化,并在下面注释掉)后,我的错误处理程序就会触发。然而,_mm_div_ss似乎并没有提高SIGFPE。有什么想法吗?

代码语言:javascript
复制
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <xmmintrin.h>

static void sigaction_sfpe(int signal, siginfo_t *si, void *arg)
{
    printf("inside SIGFPE handler\nexit now.");
    exit(1);
}

int main()
{
    struct sigaction sa;

    memset(&sa, 0, sizeof(sa));
    sigemptyset(&sa.sa_mask);
    sa.sa_sigaction = sigaction_sfpe;
    sa.sa_flags = SA_SIGINFO;
    sigaction(SIGFPE, &sa, NULL);

    //_mm_setcsr(0x00001D80); // catch all FPE except divide by zero

    __m128 s1, s2;
    s1 = _mm_set_ps(1.0, 1.0, 1.0, 1.0);
    s2 = _mm_set_ps(0.0, 0.0, 0.0, 0.0);
    _mm_div_ss(s1, s2);

    printf("done (no error).\n");

    return 0;
}

上述代码的输出:

代码语言:javascript
复制
$ gcc a.c
$ ./a.out 
done (no error).

正如你所看到的,我的处理程序永远也找不到。附带注意:我尝试了几个不同的编译器标志(-msse3,-march=native),没有任何改变。

gcc (Debian 5.3.1-7) 5.3.1 20160121

来自/proc/cpuinfo的一些信息

代码语言:javascript
复制
model name      : Intel(R) Core(TM) i3 CPU       M 380  @ 2.53GHz
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm arat dtherm tpr_shadow vnmi flexpriority ept vpid
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-26 14:04:52

两件事。

首先,我误解了文档。必须揭露例外情况才能被抓住。调用_mm_setcsr(0x00001D80);将允许SIGFPE在除以零的情况下触发。

第二,gcc正在优化我的分而治之指令,即使使用-O0

给定源线

代码语言:javascript
复制
_mm_div_ss(s1, s2);

gcc -S -O0 -msse2 a.c编译

代码语言:javascript
复制
76     movaps  -24(%ebp), %xmm0
77     movaps  %xmm0, -72(%ebp)
78     movaps  -40(%ebp), %xmm0
79     movaps  %xmm0, -88(%ebp)

a1     subl    $12, %esp        ; renumbered to show insertion below
a2     pushl   $.LC2
a3     call    puts
a4     addl    $16, %esp

同时源行

代码语言:javascript
复制
s2 = _mm_div_ss(s1, s2); // add "s2 = "

给出

代码语言:javascript
复制
76     movaps  -24(%ebp), %xmm0
77     movaps  %xmm0, -72(%ebp)
78     movaps  -40(%ebp), %xmm0
79     movaps  %xmm0, -88(%ebp)
       movaps  -72(%ebp), %xmm0
       divss   -88(%ebp), %xmm0
       movaps  %xmm0, -40(%ebp)
a1     subl    $12, %esp
a2     pushl   $.LC2
a3     call    puts
a4     addl    $16, %esp

通过这些更改,将根据MXCSR中的零除标志调用SIGFPE处理程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39690198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档