2013-07-31 9 views
1

내 C 코드의 계산이 점차적 인 언더 플로를 생성하고 있으며, 프로그램이 SIGFPE로 종료되고 있습니다. 점진적인 언더 플로우 (비정규)가 계산 결과로 발생하고 실행을 종료하지 않으면 어떻게 결과를 0으로 플러시 할 수 있습니까? (나는 레드햇 리눅스 머신에서 일하고있다.) 감사.계산 결과가 리눅스에서 비정규 숫자가 될 때 0으로 플러시

+0

프로그램이 언더 플로우로 종료되게하려면 특별한 작업을 수행 했습니까? 나는 요즘 언더 플로가 마이크로 코드에서 대부분 처리되었다고 생각했는데, 정규화 된 결과를위한 하드웨어 구현보다 느리지 만 소프트웨어 계층에 완전히 투명하게됩니다. –

+0

점진적인 언더 플로우가 발생할 때 FTZ를 활성화하기 위해 gcc에서 컴파일 할 때 추가 할 수있는 플래그가 있습니까? – Laplace

+0

아마 gcc 플래그가 아니지만 코드를 실행할 수 있습니다. 그러나 질문에 대답 할 수있는 사람은 기본 동작이 아니기 때문에 언더 플로에서 SIGFPE를 수신하는 방법을 아는 데 관심이있을 수 있습니다. 그 사람이 당신을 도울 수 있도록 관련 정보 일 수도 있습니다. –

답변

3

당신은 아키텍처를 지정하지 않은 - 나는 그것이 비교적 최근에 x86 [-64],이 경우 당신이 <xmmintrin.h>에 지정된 _mm_getcsr, _mm_setcsr를 사용하여 SSE 제어 레지스터를 조작 할 수 있다는 추측을거야 (또는 <immintrin.h>) 헤더.

'flush-to-zero'비트는 0x8000으로 설정되고 'denormals-are-zero'(입력의 경우/src)는 0x0040으로 설정됩니다.

_mm_setcsr(_mm_getcsr() | 0x8040); 또는 <pmmintrin.h> (SSE3)와 :

_mm_setcsr(_mm_getcsr() | (_MM_FLUSH_ZERO_ON | _MM_DENORMALS_ZERO_ON));

이 쉽게 언더 플로우의 원인을 확인 할 수 있지만 FP 환경이 더입니다 이후는, 해결책 간주되어서는 안된다 더 긴 IEEE-754 호환.