2012-03-06 62 views
2

我在win32环境中运行C++优化程序。该程序使用FFTW和pthreads的预建DLL。非常大的浮点数会导致非确定性吗?

最近,程序改变的方式是它可能会遇到非常大的数字,并可能是无穷大。在这个变化之后,这个精简而健壮的系统开始产生奇怪的症状 - 最显着的是它在不同的运行中产生了不同的数值结果(在同一台计算机上,具有相同的二进制),甚至在这里和那里增加了printf或虚拟分配从根本上改变了行为。

我仔细检查了每个可能的缓冲区溢出,内存分配,线程问题(我现在将线程池大小减少到1),堆栈大小,但经过几周的搜索后,我什么也没找到。在改变之前,程序没有非确定性或稳定性问题,它经常运行好几天。

我不知道问题可能出在FFTW模块吗?或者这种浮点不稳定性可能源于大数?

+0

只有当您使用大量数字时它才会发生这种行为,并且在以前范围中的数字提供时它仍然运行精益和健壮?或者确定性行为完全改变,无论你实际使用什么数字? – 2012-03-15 22:14:11

回答

2

浮点数本身不会导致非确定性,但任何您可能正在使用的第三方库可能会这样做,如果它们是错误的,比如没有正确处理无穷大。

你可能还想考虑一下你的自己的代码可能是罪魁祸首的可能性。当第三方库被大量使用时,这通常(但并非总是),因为假设大多数错误已经被其他人发现,它并没有超出想象范围。

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

+5

尽管您需要一个随机性来源,但它是非确定性的,例如从未初始化的内存中读取。 – 2012-03-06 07:46:34

+0

竞争条件也会起作用(并且pthreads表明一个多线程程序)。涉及非正常数字的数学通常比正常数学的数学慢很多。 – MSalters 2012-03-06 08:33:13

0

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

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

0

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

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

0

我正在寻找一些提示,以解决Java中浮动值和非确定性行为的类似问题,并且我已经结束了这个线程。我只是想分享一下LINK,它解释了为什么C++代码在使用接近溢出的浮点值时会导致非确定性行为。文章指出,这些问题是由底层编译器翻译成机器码造成的。根据机器是否将已截断的值或存储在CPU寄存器中的值与更精确的比较,我们可以得到不同的行为。我希望这有帮助。

相关问题