簡體   English   中英

從 SIMD 指令捕獲 SIGFPE

[英]Capture SIGFPE from SIMD instruction

我正在嘗試清除浮點除以零標志以忽略該異常。 我期待設置標志(我相信默認行為沒有變化,並在下面注釋掉),我的錯誤處理程序將觸發。 但是, _mm_div_ss似乎並沒有提高 SIGFPE。 有任何想法嗎?

#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;
}

上面代碼的輸出:

$ gcc a.c
$ ./a.out 
done (no error).

如您所見,我的處理程序從未到達。 旁注:我已經嘗試了幾個不同的編譯器標志(-msse3,-march=native)而沒有任何變化。

gcc (Debian 5.3.1-7) 5.3.1 20160121

來自 /proc/cpuinfo 的一些信息

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

兩件事情。

首先,我誤解了文檔。 異常需要被揭露才能被捕獲。 調用_mm_setcsr(0x00001D80); 將允許 SIGFPE 在除以零時觸發。

其次,即使使用-O0 ,gcc 也在優化我的除法指令。

給定的源代碼行

_mm_div_ss(s1, s2);

gcc -S -O0 -msse2 ac編譯給出

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

雖然源線

s2 = _mm_div_ss(s1, s2); // add "s2 = "

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 處理程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM