i最近发现,dram中的位可以被其中的颗粒或宇宙射线随机翻转。我想知道这个错误的频率。
不幸的是,我发现的最新统计量是从1990年(来源(,该年份指出,每128mb的内存每个月都应发生错误。
由于我找不到现代公羊中软错误率的最新统计量,因此我试图在Java中编写一个程序来测量RAM 4GB的软误差频率。我希望该程序可以在分配的4GB RAM中检测到的所有软错误,如果它没有以任何方式进行优化。
问题是,我不知道该如何检查程序是否有效(我认为这不是由于优化而不是(,而且我不知道如何将其更改为预期的工作。
根据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。如果您认为我的代码甚至没有优化都无法正常工作,请解释原因。
简单:一旦您的循环主体做某事(例如打印索引失败(,优化循环主体就会无效!
,如果有的话,这将是JIT优化事物,Javac并不是在优化方面做的不断折叠要多得多。
但是,当然,您将使用完整控制此类内容的语言在安全方面处于安全方面。
除此之外:我宁愿怀疑您是否会使用此类代码遇到错误。