[英]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.