0

次のコードがあるとします。

int i,j;

for(i=0; i<20; i++)
   A[i] = A[i] + B[i];

for(j=0; j<8; j++){
   C[j] = C[j] + D[j];
   E[j] = E[j] + C[j];
}

14ここで、最終結果を並列で計算するために使用できる同一の CPUがあると仮定しましょう。

14上記のコードを実行するときにすべての CPU を使用することで得られる最大速度は? 1各操作(加算)には単位時間がかかるとしましょう。

私が見ているように、速度の向上は一般Ts/Tpに、CPU をTs使用したときに費やされた時間であり、利用可能なすべての CPU を使用したときに費やされた時間です。1Tp

私の例では、 CPU20 + 8*2 = 36でコードを実行するために時間単位を費やさなければなりません。1

次に、14cpus を使用すると、1時間単位を使用して の最初の14値を見つけることができますA。次に6cpus を使用すると、別の1時間単位を使用して の残りの6値を見つけることができますA

の残りの値を見つけながらA、他の8cpu を使用して の8Cを見つけ、時間単位Eを費やします。2

1 + (1 || 2) = 1 + 2 = 3したがって、合計で時間単位を費やすことにspeedupなります。つまり、36/3 = 12

これは正しいです?より良い速度を達成するために、より良い方法で CPU を使用することはできますか? また、アムダールの法則を使用して、結果をより迅速に見つけることは可能でしょうか? アムダールの法則によると、xが並列実行できないコード全体の部分である場合、最大速度アップは1/(x + (1 - x)/p)p使用される CPU の数であるということです。したがって、私の場合、この数は に等しくなり14ます。

しかし、並行して実行できるコードの部分をどのように見つけることができるかわかりません。次の方程式を解くことにした場合:

ここに画像の説明を入力

それからx = 1/78xしかし、コードを見るだけでこれを見つけるにはどうすればよいですか? 問題をより一般的に見ることにした場合、時間単位を必要とする最初のループを20並行して実行できます。ただし、2 番目のループでは、ループ内の操作を並列に実行できないため、16時間単位のうち、並列8に実行できるのは のみです。

したがって、並行して実行できる合計時間は です28。だからx = 8/36

したがって、アムダールの法則から次の結果が得られます (wolframalpha から):

ここに画像の説明を入力

しかし、12上で説明したロジックに従うことで速度が向上しました。私は何を間違っていますか?

前もって感謝します

4

2 に答える 2

0

次のサイトによると http://www.futurechips.org/thoughts-for-researchers/parallel-programming-gene-amdahl-said.html CPU の数は 14 に制限されるべきではなく、次のサイズを取る必要があります。あなたのベクトルをnとして。アマダールの法則を使用して行うことは、アルゴリズムがどれだけうまくスケーリングし、p が無限大になるとこの限界に到達するかを見つけることです。

于 2013-08-18T15:55:38.407 に答える
0

アムダールの法則に関連してこのコードを並列化することについてのあなたの仮定は正しくありません。アムダールの法則はこの部分の強化に注意を払っているため、コードはシーケンシャルです。そのため、最初のループを計算している間、20 個のシリアルジョブのうち 14 個のみが並列化されます。その後、スレッドは 2 番目のループに到達します (このコードを完全な並列バージョンに再編成する場合を除きます)。2 番目のループでは、コードのすべての部分を並列化できます。今度は、強化された各部分のシリアル部分に対する強化のパーセンテージを見つけて、そのスピードアップを見つける必要があります。

于 2013-09-01T19:59:53.050 に答える