我正在win32环境中运行C ++优化程序。该程序使用预构建的DLL进行FFTW和pthreads。
最近,该计划的变化方式可能会遇到非常大的数字,甚至可能是无限的。在这个改变之后,这个精简且强大的系统开始产生奇怪的症状 - 最明显的是它在不同的运行中(在同一台计算机上,使用相同的二进制文件)产生不同的数值结果,甚至在这里和那里添加printf或虚拟分配从根本上改变了行为。
我仔细检查了每个可能的缓冲区溢出,内存分配,线程问题(我现在将线程池大小减小到1),堆栈大小,但经过数周的搜索,我什么都没找到。在更改之前,该程序没有非确定性或稳定性问题,它经常运行数天。
我想知道这个问题是否存在于FFTW模块中?或者这种浮点不稳定性是否源于大量?
答案 0 :(得分:2)
浮点数本身不会导致非确定性,但您可能正在使用的任何第三方库如果有错误,可能会这样做,例如无法正确处理无穷大。
您可能还想考虑您的拥有代码可能是罪魁祸首的可能性。当第三方库被大量使用时,通常(但并非总是如此),因为假设大多数错误已经被其他人发现,并不是超出想象范围。
我不知道FFTW是否属于该类别。但它肯定有可能被更多人测试而不是你自己的代码: - )
答案 1 :(得分:0)
使用Valgrind查看您的ar读取是否来自未初始化的变量。它们是不受欢迎的随机性的最常见来源,因而是非决定论。
另一点可能是多线程(虽然你说你将线程池减少到一个),可能是控制线程和工作线程之间的竞争条件。 Valgrind也可以协助检查多线程代码中的潜在比赛。
答案 2 :(得分:0)
大数字不会导致非确定性行为,但它们可以放大它 - 以前小的舍入差异可以成为有限数和NaN或无穷大之间的差异。
要注意的一件事是传递给FFTW的缓冲区的对齐方式。与大多数高性能数值软件一样,它可能根据数据对齐使用不同的实现。
答案 3 :(得分:0)
我正在寻找一些提示,以解决Java中浮动值和非确定性行为的类似问题,我已经在这个线程中结束了。我只想分享这个LINK,它解释了为什么C ++代码在使用接近溢出的浮点值时会导致非确定性行为。文章指出,问题是由编译器转换为机器代码引起的。根据机器是否比较已经截断的值或存储在CPU寄存器上的值更加精确,我们可以得到不同的行为。我希望这会有所帮助。