用随机数据填充内存

时间:2009-08-11 13:44:36

标签: linux memory fortran ram

有没有办法用随机数据填充linux机器上的空闲RAM?

我之所以这样说的原因是:我在一个我们在Fortran中进行数值编程的小组中工作。有时候,人们搞砸双精度实数,所以应该给出双精度结果的程序只能提供单精度。

如果我的理解是正确的,那么在这样的程序中,在单精度限制之后,会看到结果的随机波动。也就是说,如果您使用相同的输入多次运行相同的程序,则每次都会得到随机不同的结果。你看到的(随机部分)取决于机器的空闲RAM中的随机值。但实际上,如果在同一台机器上重复运行程序,则会重复使用相同的内存部分,其中包含相同的随机数据,每次都会导致相同的输出。

我的想法是,如果你可以用随机数据覆盖内存,你实际上会看到程序输出中的随机波动。这样可以更容易地找到这些错误。

这个想法是否重击,或者如果没有,我如何填补内存?我可以将/ dev / random连接到RAM中吗?

7 个答案:

答案 0 :(得分:5)

您的理解不正确。在开始执行之前,你无法用随机数据填充程序的内存,即使你可以,它也无法解决你的问题。

如果您的Fortran程序声明了一个单精度浮点变量,编译器将在内存中分配一个32位单元来保存该值。每次程序从变量读取时,处理器将从单元格中获取32位值。每次分配给变量时,处理器都会向单元格写入32位值。在任何情况下,随机位都不应该在细胞之前或之后“渗入”细胞的值。

虽然浮点运算不精确,但它也不是随机的。如果您计算1.0 / 3.0 + 1.0 / 3.0 + 1.0 / 3.0)一千次,则每次都会获得0.99999...

第二点是,当在Linux上执行程序时,操作系统会将所有数据存储器小心地预先初始化为零。这样做是为了避免每次运行程序时程序的行为都不同:这将是一件坏事。编辑:这样做的另一个原因是防止私人信息从一个进程泄漏到另一个进程。

(评论者:请注意,我故意在一些问题上滑过,以使解释变得简单。)

答案 1 :(得分:4)

如果你有一个最近的(> = 2.4似乎)glibc你可以使用设置环境变量MALLOC_PERTURB_来使malloc()返回设置为某个值的内存。请参阅http://udrepper.livejournal.com/11429.htmlhttp://people.redhat.com/drepper/defprogramming.pdf

那么问题是你的Fortran程序是否使用了glibc malloc(),我想这取决于Fortran编译器。

答案 2 :(得分:2)

我会尝试使用fUnit之类的东西编写单元测试,以确保双精度值始终按预期工作,通过编写一些需要双精度结果的测试,在存储单个精度结果的情况下经常出现

例如:编写一个测试,调用具有各种输入的函数,该函数应该生成双精度输出,并测试它是否与assert()一起使用。

答案 3 :(得分:2)

你想要实现的目标,尽管意图高尚,而且有趣的构思,让我想起Wile E. Coyote计划抓住走鹃,而步枪和狙击行动将是最好的选择。

如果您遇到问题,则表示您的代码存在结构性问题,并且您正在失去对程序的控制权。虽然我完全知道软件是如何在学术界和fortran中开发的,但是因为世界其他地方的问题让自己陷入困境,这是有问题的。

您应该做的是审核您的代码。然后如果他再次搞砸了那就打败了一些研究生。

答案 4 :(得分:2)

Linux为您提供了/proc/pid/maps/proc/pid/mem,让您高兴。当然,在写作时你必须格外小心。另外,请记住,每个进程可用的唯一内存段是它自己的,因此您可能需要进行一些附加和代码修补才能获得所需的内容。祝你好运,无论如何。 :)

编辑:它仍然比代码审计复杂几倍 - 这也更有可能揭示问题的实际来源。

答案 5 :(得分:1)

我认为随机数据会使调试变得更加困难。由内存中的随机值或计算错误引起的答案中的随机性是什么?我想修复已知的值会更好。

在FORTRAN方面,您是说可以互换使用“混合精度”数字吗?我不清楚实际问题。

但我不知道如何用任何东西填充Linux中的空闲内存。

答案 6 :(得分:1)

您已经请求帮助它实现您的问题解决方案,即内存随机化。但是,我觉得这是一个奇怪的,可能很难调试的解决方案。

在我看来,你会从中获益更多   - 静态代码分析工具   - 特定的单元测试   - 代码审查的清单,专门针对此问题

有时,人们可以认为解决方案更简单;如果你没有单精度数学可以做到,你可能会阻止这些库的链接,所以错误会出现链接错误;在您的开发过程的早期。祝你好运。