【问题标题】:Reason for output 1 bit differences between Linux-gcc compiled C code output and MS-VS2008 compiled output?Linux-gcc 编译的 C 代码输出和 MS-VS2008 编译的输出之间输出 1 位差异的原因?
【发布时间】:2011-01-14 23:30:22
【问题描述】:

我有一个 Theora 视频解码器库和应用程序在 windows(Intel x86 架构)上使用 VS-2008 编译。我使用这个设置来解码 theora 比特流(*.ogg 文件)。此解码器库的源代码来自 FFMPEG v0.5 源包,经过一些修改以使其在 windows-VS-2008 组合上编译。

现在,当我使用我使用 gcc 构建的 linux(Intel x86 架构)上的 ffmpeg(V0.5) 应用程序解码相同的 theora 比特流并获得一些解码的输出 yuv 文件时,此输出文件与从 windows-VS2008 设置中获得的输出,以及输出文件的几个字节,不是全部。我希望 2 个输出是位匹配的。

我怀疑以下因素:

a.)两个编译器 gcc 和 MS-VS2008 之间的某些数据类型不匹配?

b.)我已经验证代码没有使用任何运行时数学库函数,如 log、pow、exp、cos 等......但我的代码仍然有一些操作,如 (a+b+c)/ 3.这会是个问题吗?

这种“除以三”或任何其他数字的实现在两种设置中可能不同。

c.)某种不同的舍入/截断效果?

d.) 我是否会遗漏 Linux 中作为 makefile/configure 选项存在的任何宏,而 Windows 设置中没有该宏?

但我无法缩小问题范围并解决它。

1.) 我的上述怀疑是否有效,或者是否有任何其他问题可能导致这两种不同设置产生的输出出现这些 1 位差异。

2.) 我该如何调试和修复这个问题?

我猜,这种 linux-gcc 设置和 Windows MS 编译器之间的输出差异场景甚至可以适用于任何通用代码(不一定特定于我的视频解码器应用程序)

任何指针都会对此有所帮助。

谢谢,

-AD

【问题讨论】:

  • 我的回答有帮助吗?你解决了这个问题吗?怎么样?
  • @osgx:您的回答给了我在配置 ffmpeg 时禁用 mmx 优化的指示。构建后,它对我有用。谢谢。

标签: linux gcc ffmpeg ogg-theora


【解决方案1】:

我认为,这种行为可能来自 x87/sse2 数学。你使用什么版本的 gcc?您使用浮点(32 位)还是双精度(64 位)? x87 上的数学在内部具有更多的精度位(82),而不是可以存储在内存中

尝试 gcc -ffloat-store 的标志; -msse2 -mfpmath=sse

msvc 的标志/fp:fast /arch:SSE2

【讨论】:

【解决方案2】:

1、可能是一些浮点库的不同优化

2、有问题吗?

编辑:
看看 VS (http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx) 上的“/fprecise”选项或 gcc 上的“-fprecise-math”。

【讨论】:

  • @Martin Becket:我猜你在问,位差是个问题。然后是的,对我来说是,因为我用 ffmpef 源代码创建的用于 theora dec 的 Windows 应用程序应该参考位精确,即 ffmpeg 输出。
  • 我的意思是,对于压缩视频流,像素亮度的 0.4%(1 位)差异显着吗?您可能应该尝试各种 /fprecise 开关
  • 感谢指针优化和浮点库行为选项。我会检查他们。
【解决方案3】:

关于 b),整数和浮点除法完全在 C99 中指定。 C99 为整数指定向零舍入(早期标准为实现定义的左舍入方向),而 IEEE 754 为浮点指定。

听说 VS2008 没有声称实现 C99,这并没有真正的帮助。实现定义至少意味着您可以编写一些测试用例并确定在您的编译器中做出了哪个决定。

如果您真的关心这一点,那么如何检测代码以将详细跟踪输出到单独的文件并检查跟踪的第一个区别?嘿,也许跟踪甚至已经存在用于调试目的!

【讨论】:

  • @Pascal:是的,在每个模块之前的两个设置中添加转储/跟踪,是我考虑过的选项之一。继续比较模块中的这些转储,直到找到差异。但是我想在进入详细调试之前,通过一些更高级别的分析/调试来勾选列表,所有其他原因!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多