Как я могу произвести переупорядочение инструкций в jcstress test? - PullRequest
0 голосов
/ 15 мая 2019

Когда я подозреваю, что определенная перестановка инструкций разрешена спецификацией языка Java, я хочу воспроизвести ее в тесте jcstress.Как я могу это сделать?Например, в следующем коде инструкции Load и Store (я считаю) могут быть переупорядочены при выполнении в некоторой среде выполнения.Тем не менее, когда я запускаю jcstress в Intel x84_64 Ubuntu, результат не показывает какого-либо переупорядочения.

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;
    }
}

1 Ответ

0 голосов
/ 20 мая 2019

Мне наконец-то удалось наблюдать переупорядочение в исходном тесте jcstress с явными опциями JVM и запуск его с большим количеством часов.

java -jar target / jcstress.jar -f 20 -XX: -TieredCompilation, -XX: + UnlockDiagnosticVMOptions, -XX: + StressLCM, -XX: + StressGCM

Однако в одном из следующих тестов переупорядочение никогда не наблюдается, независимо от того, как долго я запускаю тестирование, хотя оно выглядит эквивалентно другим тестам.

// reordering can be observed!
@Actor
    public void actor1() {
        int ee = e;     // Load
        d = 1;          // Store

        if (ee == 2) {
            f = 2;
        }
    }
// reordering can be observed!
@Actor
    public void actor1() {
        f = e;          // Load & Store
        d = 1;          // Store
    }
// reordering NEVER observed!
@Actor
    public void actor1() {
        if (e == 2) f = 2;     // Load & conditionally Store
        d = 1;          // Store
    }
...