2010-02-09 2 views
0

Windows (Intel x86 아키텍처)에서 VS-2008을 사용하여 Theora video deocder 라이브러리 및 응용 프로그램을 컴파일했습니다. 나는이 설정을 사용하여 theora 비트 스트림 (*. ogg 파일)을 디코딩합니다. 이 디코더 라이브러리의 소스 코드는 Windows-VS-2008 조합에서 컴파일되도록 일부 수정 된 FFMPEG v0.5 소스 패키지에서 사용됩니다.출력 이유 Linux-gcc 컴파일 된 C 코드 출력과 MS-VS2008 컴파일 된 출력 간의 1 비트 차이점은 무엇입니까?

이제 gcc를 사용하여 빌드 한 Linux (Intel x86 아키텍처)에서 ffmpeg (V0.5) 응용 프로그램을 사용하여 동일한 Theora 비트 스트림을 디코딩하고 일부 디코딩 된 출력 yuv 파일을 얻으면이 출력 파일은 다음과 같은 1 비트 차이가 있습니다. 출력은 Windows-VS2008 설정에서 얻었으며, 출력 파일의 몇 바이트는 전부가 아닙니다. 나는 2 개의 출력이 비트 매치가 될 것으로 예상했다.

내가 요소 아래에 의심하고 있습니다 :

을 a)는 두 개의 컴파일러 GCC 및 MS-VS2008 사이의 일부 데이터 유형이 일치하지 않습니다.?

b.) 코드가 log, pow, exp, cos 등의 런타임 수학 라이브러리 함수를 사용하지 않는다는 것을 확인했지만 여전히 내 코드에는 (a + b + c) /3. 이것이 문제가 될 수 있습니까?

이 "3으로 나누기"또는 다른 숫자의 구현은 두 가지 설정에서 다를 수 있습니다.

c.) 어떤 종류의 반올림/잘림 효과가 다르게 발생합니까?

d.) Windows 설치에없는 makefile/configure 옵션으로 Linux에있는 모든 매크로가 누락 될 수 있습니까?

그러나 문제와 그 문제를 해결할 수 없습니다.

1.) 위의 질문이 유효합니까? 아니면이 두 가지 설정에 의해 생성 된 출력에 이러한 1 비트 차이가 발생할 수있는 다른 문제가있을 수 있습니다.

2.) 어떻게 디버그하고 수정합니까?

것 같아요, 리눅스 GCC 설치 및 Windows MS 컴파일러 사이의 출력 차이의이 시나리오 (비디오 디코더 응용 프로그램 내 경우 특정 반드시) 어떤 일반적인 코드에 대한 사실조차 할 수

모든 포인터는 것 이것에 관해 도움이 되십시오.

덕분에, 일부 부동 소수점 LIB

2의

-AD

+0

MSVC /fp:fast /arch:SSE2에 대한

플래그 SSE는 내 대답은 도움이 되었습니까? 문제를 해결 했습니까? 방법? – osgx

+1

@osgx : 당신의 대답은 ffmpeg를 구성하는 동안 mmx 최적화를 비활성화하는 지침을주었습니다. 빌드 후, 그것은 나를 위해 일했습니다. 감사. – goldenmean

답변

1

저는 이러한 행동이 x87/sse2 수학에서 나올 것이라고 생각합니다. gcc의 어떤 버전을 사용하십니까? float (32-bit) 또는 double (64-bit)을 사용합니까? 메모리에 저장할 수있는 것보다 x87의 수학 비트가 내부적으로 더 많습니다 (82).

gcc -ffloat-store에 대한 플래그를 시도하십시오. -msse2 -mfpmath =

+0

옵션 http://gcc.gnu.org/ml/gcc-help/2009-07/msg00417.html – osgx

0

1, 아마 다른 최적화,이 문제인가?

편집 :
는 GCC의 VS (http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx)의 "/ fprecise"옵션을 봐 또는 "-fprecise-수학을"가져 가라.

+0

@ Martell Becket : 내가 묻고있는 것 같아요. 약간의 차이점은 problem.then입니다. 그렇습니다. ffmpef 소스 코드에서 만든 theora dec에 대한이 Windows 응용 프로그램이 참조 용으로 조금 정확한 것이어야합니다. 즉 ffmpeg 출력. – goldenmean

+0

필자는 압축 비디오 스트림의 경우 픽셀의 밝기가 0.4 % (1 비트) 차이가 있음을 의미합니까? 아마도 다양한/fprecise 스위치를 사용해야합니다. –

+0

포인터 최적화 및 부동 소수점 라이브러리 동작 옵션을 사용해 주셔서 감사합니다. 나는 그들을 점검 할 것이다. – goldenmean

0

b)에 대해서는 정수 및 실수 나누기가 C99에서 완전히 지정됩니다. C99는 정수 (이전 표준은 반올림 방향 구현이 정의 됨)에 대해 반올림을 지정하고 부동 소수점에 IEEE 754를 지정합니다.

VS2008이 C99를 구현한다고 주장하지 않은 것을 들었을 때, 이것은 실제로 도움이되지 않습니다. 최소한 구현 정의는 몇 가지 테스트 케이스를 작성하고 컴파일러에서 어떤 결정을 내릴 수 있는지를 의미합니다.

정말로 신경 쓰는 분이라면 자세한 추적 코드를 별도의 파일로 출력하고 첫 번째 차이점을 추적 할 수 있습니까? 어쩌면 디버깅 목적으로 트레이스가 이미 존재할 수도 있습니다.

+0

@Pascal : 예, 각 모듈 이전의 두 설정에서 덤프/추적을 추가하는 것은 내가 생각한 옵션 중 하나입니다. 차이가 발견 될 때까지 모듈에서 이러한 덤프를 계속 비교하십시오. 그러나 나는 세부 디버그에서 점프하기 전에 목록에서 체크하고 싶다. 같은 문제가있는이 게시물의 – goldenmean

관련 문제