16

JMMの因果関係は、その中で最も紛らわしい部分のようです。JMMの因果関係、および並行プログラムで許可される動作に関していくつか質問があります。

私が理解しているように、現在のJMMは常に因果関係のループを禁止しています。(私は正しいですか?)

ここで、JSR-133ドキュメント、24ページ、図16に従って、次の例があります。

最初はx = y = 0

スレッド1:

r3 = x;
if (r3 == 0)
    x = 42;
r1 = x;
y = r1;

スレッド2:

r2 = y;
x = r2;

直感的には、r1 = r2 = r3 = 42不可能のようです。ただし、可能な限り言及されているだけでなく、JMMでは「許可」されています。

可能性として、私が理解できない文書からの説明は次のとおりです。

コンパイラーは、これまでに割り当てられた唯一の値が0と42であると判断できます。それから、コンパイラーは、実行した時点で、42の書き込みを実行したか、 読み取りと表示を行っただけxであると推測できます。値42。いずれの場合も、の読み取りで値42を確認することは合法です。その後、 ;に変更される可能性があります。これにより、以前に変換して実行できるようになり、問題の動作が発生します。この場合、書き込み先が最初にコミットされます。r1 = xxxxr1 = xr1 = 42y = r1y = 42y

私の質問は、それは本当にどのようなコンパイラの最適化ですか?(私はコンパイラーを認識していません。)42は条件付きでのみ記述されるため、ifステートメントが満たされた場合、コンパイラーはどのようにしてx

第二に、コンパイラーがこの投機的最適化を行い、コミットy = 42して最終的に作成r3 = 42したとしても、因果関係の区別が残っていないため、因果関係ループの違反ではありませんか?

実際、同じ文書(15ページ、図7)には、同様の因果ループが許容できないと言及されている例が1つあります。

では、なぜこの実行順序がJMMで合法なのですか?

4

3 に答える 3

6

説明したように、これまでに書き込まれた値xは0と42のみです。スレッド1:

r3 = x; // here we read either 0 or 42
if (r3 == 0)
  x = 42;  
// at this point x is definitely 42
r1 = x;

したがって、JITコンパイラは、、およびさらにとしr1 = xて書き換えることができます。重要なのは、スレッド1は常に無条件に42をに書き込むということです。変数は実際には冗長であり、マシンコードから完全に削除できます。したがって、この例のコードは、からへの因果関係の矢印の外観のみを示していますが、詳細な分析では、実際には因果関係がないことが示されています。驚くべき結果は、書き込みを早期にコミットできることです。r1 = 42y = 42yr3xyy

最適化に関する一般的な注意事項:メインメモリからの読み取りに伴うパフォーマンスの低下に精通していると思います。そのため、JITコンパイラは可能な限りそれを拒否することに傾倒しており、この例では、x何に書き込むかを知るために実際に読み取る必要がないことがわかりyます。

表記に関する一般的な注意事項:、、r1r2ローカル変数です(スタックまたはCPUレジスタにある可能性があります)r3。、は共有変数です(これらはメインメモリにあります)。これを考慮しないと、例は意味がありません。xy

于 2012-11-07T15:02:28.063 に答える
3

コンパイラーは、いくつかの分析と最適化を実行し、Thread1の次のコードで終了することができます。

y=42; // step 1
r3=x; // step 2
x=42; // step 3

シングルスレッド実行の場合、このコードは元のコードと同等であるため、有効です。次に、Thread2のコードがステップ1とステップ2の間に実行された場合(これは十分に可能です)、r3にも42が割り当てられます。

このコードサンプルの全体的な考え方は、適切な同期の必要性を示すことです。

于 2012-11-07T15:06:25.343 に答える
1

javacコードを大幅に最適化しないことは何の価値もありません。JITはコードを最適化しますが、コードの並べ替えについてはかなり保守的です。CPUは実行を並べ替えることができ、これを少しだけかなり割り当てます。

CPUに命令レベルの最適化を行わないように強制すると、かなりコストがかかります。たとえば、CPUの速度が10倍以上遅くなる可能性があります。AFAIK、Java設計者は、ほとんどのCPUで効率的に機能する必要な最小限の保証を指定したいと考えていました。

于 2012-11-07T15:03:35.973 に答える