2

我在 win32 环境中运行 C++ 优化程序。该程序为 FFTW 和 pthreads 使用预构建的 DLL。

最近,程序发生了变化,它可以遇到非常大的数字,甚至可能是无穷大。在此更改之后,这个原本精简而强大的系统开始产生奇怪的症状 - 最明显的是它在不同的运行(在同一台计算机上,使用相同的二进制文件)产生不同的数值结果,甚至在这里和那里添加 printf 或虚拟分配从根本上改变了行为。

我仔细检查了所有可能的缓冲区溢出、内存分配、线程问题(我现在将线程池大小减少到 1)、堆栈大小,但经过数周的搜索,我什么也没找到。在更改之前,该程序没有不确定性或稳定性问题,它会定期运行数天。

我想知道问题是否出在 FFTW 模块上?或者这种浮点不稳定性是否源于大量数字?

4

4 回答 4

2

浮点数本身不会导致不确定性,但您可能使用的任何第三方库如果它们有问题,例如无法正确处理无穷大,都可能会这样做。

您可能还需要考虑您自己的代码可能是罪魁祸首的可能性。当第三方库被大量使用时,通常(尽管不总是)就是这种情况,因为假设大多数错误已经被其他人发现并不是超出想象的范围。

FFTW 是否属于该类别,我不知道。但它肯定有可能被更多的人测试过而不是你自己的代码:-)

于 2012-03-06T07:38:59.943 回答
0

使用Valgrind找出您的 ar 是否从未初始化的变量中读取。它们是最常见的不想要的随机性来源,因此是非确定性的。

另一点可能是多线程(尽管您说您将线程池减少到一个),可能是控制线程和工作线程之间的竞争条件。Valgrind 也可以帮助检查多线程代码中的潜在竞争。

于 2012-03-06T09:09:45.880 回答
0

大数不会导致不确定的行为,但它们可以放大它——以前小的舍入差异可能会变成有限数和 NaN 或无穷大之间的差异。

要查看的一件事是传递给 FFTW 的缓冲区的对齐方式。像大多数高性能数值软件一样,它可能会根据数据对齐使用不同的实现。

于 2012-03-06T15:48:08.717 回答
0

我一直在寻找一些提示,以解决 Java 中浮点值和非确定性行为的类似问题,我最终进入了这个线程。我只想分享这个链接,它解释了为什么 C++ 代码在使用接近溢出的浮点值时会导致不确定的行为。文章指出,问题是由底层编译器转换为机器代码引起的。根据机器是比较已经截断的值还是更精确地比较存储在 CPU 寄存器中的值,我们可以获得不同的行为。我希望这有帮助。

于 2014-05-19T15:00:17.983 回答