1

Win64用のEclipse3.7バージョンのJavaEEをインストールしてから、手動バージョン1.2のAtejiのインストール手順に従いました。

I = J =100000の高速化の例を実行して得られた結果:

PERFORMANCE COMPARISON BETWEEN SEQUENTIAL AND PARALLEL COMPREHENSIONS

sequential sum:
    `+ for (int i : I, int j : J) (i*j);
parallel sum:
    `+ for || (int i : I, int j : J) (i*j);
data size : I = 100000; J = 100000

Wait for the result...
sequential sum: mean time = 202 ms; standard deviation = 1 ms; ( 8473 8460 203 202 202 204 203 202 205 202 203 202 203 204 203 202 204 202 203 203 )
parallel sum: mean time = 2017 ms; standard deviation = 961.311 ms; ( 1787 1800 1790 1847 1457 1442 1698 1457 1455 1439 1467 4083 3239 1461 1458 1469 1470 1469 3077 4311 )

Speed up = 0.10014873574615767
Available processors = 8

プロセッサアクティビティのモニターは、4つのコアが実際に並列タスクで使用されていることを示しています。hello worldの例は機能します(「hello」と「world」はランダムな順序で印刷されます)。Atejiマニュアルのトラブルシューティングセクションを確認しましたが、すべて正しいです(JDKとJRE 1.7を使用しました)

問題はどこから来るのでしょうか?ありがとう!

4

1 に答える 1

3

この驚くべき結果を教えているのは、マイクロベンチマークに頼るべきではないということです。

私の4コアラップトップでは、Java6 VM(1.6.0_22-b04 HotSpot(TM)64ビットサーバー)で期待されるスピードアップが得られます。

sequential sum: mean time = 383 ms; standard deviation = 83,319 ms;
parallel sum: mean time = 114 ms; standard deviation = 22,271 ms;
Speed up = 3.3596491228070176

同じマシンで、Java7 VM(1.7.0_03-b05 HotSpot(TM)64ビットサーバー)で言及した驚くべき結果が得られました。

sequential sum: mean time = 7 ms; standard deviation = 0 ms;
parallel sum: mean time = 69 ms; standard deviation = 10,863 ms; 
Speed up = 0.10144927536231885

2つのVMバージョン間でシーケンシャル時間が50倍に分割されていることに注意してください。これは間違いなく、強力な最適化が始まったことを示しています。

賢いVMは、合計の結果を単純な代数式として静的に表現できるため、計算を行わない場合(time = 0ms)まで実行できます。並列バージョンのコードには、同じ最適化を妨げる何かが含まれている必要があります。したがって、驚くほどの結果が得られます。

確かに、合計式をより現実的なものに変更すると

    `+ for (int i : I, int j : J) (x[i]*y[j])

ここで、被加数は入力配列から取得されるため、合計を最適化することはできません。そうすると、期待に沿ったスピードアップの結果が得られます。

JRE6

sequential sum: mean time = 436 ms;
parallel sum: mean time = 156 ms; standard deviation = 35,086 ms;
Speed up = 2.7948717948717947

JRE7

sequential sum: mean time = 163 ms; standard deviation = 4 ms;
parallel sum: mean time = 78 ms; standard deviation = 15,362 ms;
Speed up = 2.08974358974359

スピードアップの数値が遅いのは、アレイxとyへの同時アクセスによるものです。コアごとにアレイのローカルコピーを使用すると、元の例のように4に近いスピードアップが得られる可能性があります。

パトリック

于 2012-12-02T15:07:48.117 に答える