当前位置: 首页 > 知识库问答 >
问题:

如何防止编译器和JIT优化破坏java中的硬件测试?

刁瀚昂
2023-03-14

我最近发现,DRAMs中的比特可以被其中粒子的衰变或宇宙射线随机翻转。我想知道这种错误发生的频率。

不幸的是,我发现的最新统计数据来自1990年(来源),其中指出每128MB内存每月都会发生错误。

由于我找不到任何关于现代ram软错误率的最新统计数据,我尝试用java编写一个程序来测量4GB RAM上的软错误频率。我希望该程序能够检测到分配的4GB内存中的每个软错误,如果它没有以任何方式进行优化的话。

问题是,我不知道如何检查程序是否有效(我假设它不是因为优化),也不知道如何将其更改为按预期工作。

根据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、 如果你认为我的代码没有优化就无法工作,请解释原因。

共有1个答案

皇甫喜
2023-03-14

简单:只要循环体做了一些事情(比如只是打印失败的索引),优化掉循环体就无效了!

如果有的话,这将是JIT优化掉的东西,javac在优化方面所做的只是不断折叠。

但是,当然,为了安全起见,您可以使用完全控制此类事情的语言。

除此之外:我宁愿怀疑你是否会遇到这样的代码错误。

 类似资料:
  • 我最近遇到了这个精彩的cpp2015演讲cppCon 2015:钱德勒·卡鲁斯“调整C:基准、CPU和编译器!哦,天哪!” 提到的防止编译器优化代码的技术之一是使用以下函数。 我在努力理解这一点。问题如下。 1)逃避比重击有什么好处? 2) 从上面的例子来看,clobber()似乎可以防止前面的语句(push_back)以这种方式进行优化。如果是这样,为什么下面的代码片段不正确? 如果这还不够混乱

  • 我对GlazeedList 1.8中的一些代码有问题,该代码在java 1.8_05 / 64 bit / FC20下运行时会导致SIGSEGV 我有分解后的输出(见下文),但我不知道如何调试它。 因此,任何调试代码的帮助或向何处寻求帮助的提示都将不胜感激。 反汇编代码超过30000个字符。那么,你必须到这里来https://java.net/jira/browse/GLAZEDLISTS-564

  • 问题内容: 从TABLE布局切换到DIV布局以来,一个普遍的问题仍然存在: 问题 :您用动态文本填充DIV,并且不可避免地会有一个超长单词延伸到div列的边缘,使您的网站看起来不专业。 复古 :这 从未 发生过表布局。一个表格单元格总是可以很好地扩展到最长单词的宽度。 严重性 :我什至在大多数主要站点上都 遇到了 这个问题,尤其是在德国站点上,这些站点甚至连“限速”之类的通用词都非常长(“ Ges

  • 问题内容: 我正在运行gulp 3.6.2,并具有从在线示例中设置的以下任务 每当我的CoffeeScript gulp手表出现错误时,手表就会停止-显然不是我想要的。 正如其他地方推荐的那样 但它似乎不起作用。 我究竟做错了什么? 响应@Aperçu的回答,我修改了方法并尝试了以下操作: 重新启动,然后在我的coffee文件中创建语法错误。相同的问题: 问题答案: 您的函数应如下所示: 我认为您

  • 如果关闭了编译器优化(gcc-o0...),那么说'volatile'关键字没有区别是可以的吗? 我制作了一些示例“C”程序,并且仅当打开编译器优化时,才在生成的汇编代码中看到易失性和非易失性之间的区别,即((gcc-o1....)。

  • 问题内容: 如果我有一个,并且用户输入了一个国际化域名,则Angular_(编辑:除了不是Angular的错,会_自动将值转换为punycode,这是一个不错的功能,但如果值将显示回给他们。例如 变成 当后端需要该域的原始Unicode版本时,它也会引起问题,而Angular应用会发送punycode版本。 我可以使用例如punycode.js将其转换回去,但是有没有一种方法可以在Angular中