Как я могу произвести переупорядочение команд в jcstress test?
Когда я подозреваю, что определенная перестановка команд разрешена спецификацией языка 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 ответ
В конце концов мне удалось наблюдать за переупорядочением в исходном тесте 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
}