2012-03-06 1 views
2

저는 win32 환경에서 C++ 최적화 프로그램을 실행하고 있습니다. 이 프로그램은 FFTW 및 pthreads에 대해 미리 빌드 된 DLL을 사용합니다.매우 큰 부동 소수점 숫자가 비 결정 성을 일으킬 수 있습니까?

최근에 프로그램이 매우 많은 수와 무한대로 만날 수있는 방식으로 변경되었습니다. 이 변경 이후, 다르게 경량이며 견고한이 시스템은 이상한 증상을 일으키기 시작했습니다. 가장 큰 차이점은 같은 컴퓨터에서 동일한 바이너리를 사용하여 다른 수치 결과를 산출하고 여기 저기에 printf 또는 더미 할당을 추가하는 것입니다 행동을 근본적으로 바꿨다.

가능한 모든 버퍼 오버런, 메모리 할당, 스레딩 문제 (스택 풀 크기를 1로 줄였습니다.), 스택 크기를 두 번 확인했지만 몇 주 동안 검색했지만 아무 것도 발견하지 못했습니다. 변경 전, 프로그램에는 비 결정론이나 안정성 문제가 없었으며 일정 기간 동안 정기적으로 실행됩니다.

문제가 FFTW 모듈에있을 수 있는지 궁금합니다. 아니면 그러한 부동 소수점 불안정성이 큰 숫자에서 유래 할 수 있습니까?

+0

큰 숫자를 사용하고 이전 범위의 숫자가 입력 된 경우 여전히 견고하고 견고한 상태로 실행되는 경우에만이 문제가 발생합니까? 또는 실제로 사용하는 숫자에 관계없이 결정 론적 동작이 전혀 변경되지 않았습니까? –

답변

2

부동 소수점 자체는 비 결정 성을 발생시키지 않지만 무한 성을 올바르게 처리하지 않는 등 버그가있는 경우 사용하는 제 3 자 라이브러리가 그렇게 할 수 있습니다.

자신의 코드가 범인이 될 가능성을 고려하고 싶을 수도 있습니다. 대부분의 버그가 이미 다른 사람에 의해 발견되었다고 가정하는 상상의 범위를 벗어나지 않았으므로 대개 타사 라이브러리가 많이 사용되는 경우 (항상 그렇지는 않지만)입니다.

FFTW가 해당 카테고리에 속하는지 여부는 모르겠습니다. 하지만 분명히 자신의 코드보다 많은 사람들이 테스트했을 수도 있습니다 :-)

+5

임의성의 출처가 필요하지만, 비 결정적이어야합니다 (예 : 초기화되지 않은 메모리에서 읽는 중. –

+0

경쟁 조건이 또한 유효합니다 (그리고 pthreads는 멀티 스레드 프로그램을 제안합니다). 비정상 숫자가 포함 된 수학은 보통 수학보다 수학이 훨씬 느립니다. – MSalters

0

Valgrind을 사용하면 초기화되지 않은 변수에서 ar을 읽을 수 있는지 확인할 수 있습니다. 그것들은 불필요한 임의성과 비 결정론의 가장 흔한 원천입니다.

또 다른 포인트는 멀티 쓰레딩 (threadpool을 1로 줄임)이지만, 제어 스레드와 작업 스레드 사이의 경쟁 상태 일 수 있습니다. Valgrind는 다중 스레드 코드에서 잠재적 인 경쟁을 검사하는 데 도움을 줄 수 있습니다.

0

큰 숫자는 비 결정적 동작을 일으키지 않지만 확대 할 수는 있습니다. 이전에는 작은 반올림 차이점이 유한 숫자와 NaN 또는 무한대 사이의 차이가 될 수 있습니다.

살펴볼 한 가지는 FFTW에 전달되는 버퍼 정렬입니다. 대부분의 고성능 수치 소프트웨어와 마찬가지로 데이터 정렬에 따라 다른 구현을 사용할 수 있습니다.

0

Java에서 부동 값 및 비 결정적 동작과 유사한 문제를 해결하기 위해 몇 가지 힌트를 찾고 있었는데이 스레드에서 종료되었습니다. C++ 코드가 오버 플로우에 가까운 부동 값을 사용할 때 비 결정적 동작을 일으킬 수있는 이유를 설명하는이 LINK을 공유하려고합니다. 이 기사에서는 문제가 컴파일러 번역을 기계 코드로 언더 레이잉하면 발생한다고 설명합니다. 머신이 이미 잘라 놓은 값이나 CPU 레지스터에 저장된 값을 더 높은 우선 순위로 비교하는지 여부에 따라 우리는 다른 행동을 취할 수 있습니다. 이게 도움이 되길 바란다.

관련 문제