【问题标题】:How can I prevent compiler and JIT optimization from breaking my hardware test in java?如何防止编译器和 JIT 优化破坏我在 java 中的硬件测试?
【发布时间】:2017-04-28 18:56:28
【问题描述】:

我最近发现 DRAM 中的位可以通过其中的粒子衰变或宇宙射线随机翻转。我想知道这个错误多久发生一次。

不幸的是,我发现的最新统计数据来自 1990 年 (source),它表明每个月每 128MB 内存都会发生一个错误。

由于我找不到任何关于现代 RAM 中软错误率的最新统计数据,因此我尝试用 java 编写一个程序来测量我的 4GB RAM 上的软错误频率。我希望程序能够检测分配的 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
}

我可以做些什么来避免优化破坏程序的预期用途?

附:如果您认为我的代码不经过优化就无法运行,请解释原因。

【问题讨论】:

  • 是的,这将永远做你期望它做的事情,不是任何语言,尤其是 Java
  • @JarrodRoberson 你会在代码中进行哪些更改以有效测量软错误频率?
  • 在每个人都跳到 OP 的背上之前,there has been a Java bug 其中数组的默认值未设置为零,可能会暴露堆内存信息。现在,OP 的建议有点疯狂,不,这可能不会发现任何内存错误,但如果他们不走运,它可能出现 JVM 错误。
  • (在本例中为 0),我们可以通过将每个条目与该值 (0) 进行比较来检测错误。 不,你不能,这个语句只是说明你有多少不知道您使用的工具(Java)如何工作(或在这种情况下不工作)。享受 D/K 效应吧!
  • 必须用像 C 这样的低级语言来做这种事情。即使那样,你也必须担心分页(除非你在实模式下重新启动,或者编写一个将虚拟内存直接映射到物理内存的内核)...

标签: java hardware compiler-optimization


【解决方案1】:

简单:一旦你的循环体做某事(比如只是打印它失败的索引),优化掉循环体将是无效的!

如果真的是 JIT 优化了一些东西,javac 在优化方面所做的只是不断折叠。

当然,如果您使用对此类事情有完全控制权的语言,那么您会比较安全。

除此之外:我很怀疑您是否会在使用此类代码时遇到错误。

【讨论】:

  • 4GB 数组可以在命令行中使用 -Xmx 参数
  • 你是对的。我不断将最大数组大小与最大条目数混为一谈。后者仅限于 Integer.MAX_VALUE - x(x 是一个小数字,取决于 JVM 版本)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 2016-04-22
  • 1970-01-01
  • 2015-09-03
  • 2018-01-04
相关资源
最近更新 更多