我最近发现DRAM中的位可以通过其中的粒子衰减或宇宙射线随机翻转。我想知道这种错误发生的频率。
不幸的是,我发现的最新统计数据来自1990年(source),其中指出每128 MB内存每月都会出现错误。
由于我无法在现代RAM中找到最近的软错误率统计数据,因此我尝试用java编写程序来测量4GB内存中的软错误率。我希望该程序可以检测分配的4GB RAM中的每个软错误,如果它没有以任何方式进行优化。
问题是,我不知道如何检查程序是否有效(我认为它不是因为优化),而且我不知道如何将其更改为按预期工作。< / p>
根据1990年的统计数据,我应该期望每22小时检测一次错误,因此我需要运行该程序将近一个星期,以99%的可信度运行它。假设现代硬件没有比90年代更好的软错误率。
以下循环是我程序中最重要的部分:
int[] memory = new int[1_073_741_824]; // 4GB array, each value initialized to 0
while (true) {
for (int i = 0; i < memory.length; i++) {
if (memory[i] != 0) {
// soft error found
memory[i] = 0;
// print information about the error in a log file
}
}
// Sleep for a minute
}
如何避免优化以破坏程序的预期用途?
P.S。如果您认为我的代码在没有优化的情况下甚至无法工作,请解释原因。
答案 0 :(得分:0)
简单:只要您的循环体执行某些操作(例如只打印失败的索引),优化掉循环体就无效了!
如果有的话,那将是JIT优化的东西,javac在优化方面做的不仅仅是常数折叠。
但是,当然,您可以使用完全控制此类内容的语言来安全地使用。
除此之外:我怀疑你会遇到这样的代码错误。