首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在jcstress测试中产生指令重排序?

如何在jcstress测试中产生指令重排序?
EN

Stack Overflow用户
提问于 2019-05-15 06:06:17
回答 1查看 94关注 0票数 1

当我怀疑java语言规范允许某些指令重新排序时,我想在jcstress测试中重现它。我该怎么做呢?例如,在下面的代码中,Load和Store指令(我相信)允许在某些运行时环境中执行时重新排序。但是,当我在英特尔x84_64 Ubuntu中运行jcstress时,结果没有显示任何重新排序。

代码语言:javascript
复制
import org.openjdk.jcstress.annotations.*;
import org.openjdk.jcstress.infra.results.I_Result;

@JCStressTest
@Outcome(id = "0", expect = Expect.ACCEPTABLE,
         desc = "Default outcome.")
@Outcome(id = "2", expect = Expect.ACCEPTABLE_INTERESTING,
         desc = "Load-Store reordering happens.")
@State
public class ReorderingTest {

    int d;
    int e;
    int f;

    @Actor
    public void actor1() {
        int ee = e;     // Load
        d = 1;          // Store

        if (ee == 2) {
            f = 2;
        }
    }

    @Actor
    public void actor2() {
        if (d == 1) {
            e = 2;
        }
    }

    @Arbiter
    public void arbiter(I_Result r) {
        r.r1 = f;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-05-21 03:14:43

最后,我使用显式的JVM选项观察了原始jcstress测试中的重新排序,并以更长的时间运行它。

-jar -f 20 -XX:-TieredCompilation,-XX:+UnlockDiagnosticVMOptions,-XX:+StressLCM,-XX:+StressGCM

然而,在下面的一个测试中,无论我运行测试多长时间,都没有观察到重新排序,尽管它看起来与其他测试相同。

代码语言:javascript
复制
// reordering can be observed!
@Actor
    public void actor1() {
        int ee = e;     // Load
        d = 1;          // Store

        if (ee == 2) {
            f = 2;
        }
    }
代码语言:javascript
复制
// reordering can be observed!
@Actor
    public void actor1() {
        f = e;          // Load & Store
        d = 1;          // Store
    }
代码语言:javascript
复制
// reordering NEVER observed!
@Actor
    public void actor1() {
        if (e == 2) f = 2;     // Load & conditionally Store
        d = 1;          // Store
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56139254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档