次のコードがあるとします。
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 を使用したときに費やされた時間です。1
Tp
私の例では、 CPU20 + 8*2 = 36
でコードを実行するために時間単位を費やさなければなりません。1
次に、14
cpus を使用すると、1
時間単位を使用して の最初の14
値を見つけることができますA
。次に6
cpus を使用すると、別の1
時間単位を使用して の残りの6
値を見つけることができますA
。
の残りの値を見つけながらA
、他の8
cpu を使用して の8
値C
を見つけ、時間単位E
を費やします。2
1 + (1 || 2) = 1 + 2 = 3
したがって、合計で時間単位を費やすことにspeedup
なります。つまり、36/3 = 12
これは正しいです?より良い速度を達成するために、より良い方法で CPU を使用することはできますか? また、アムダールの法則を使用して、結果をより迅速に見つけることは可能でしょうか? アムダールの法則によると、x
が並列実行できないコード全体の部分である場合、最大速度アップは1/(x + (1 - x)/p)
がp
使用される CPU の数であるということです。したがって、私の場合、この数は に等しくなり14
ます。
しかし、並行して実行できるコードの部分をどのように見つけることができるかわかりません。次の方程式を解くことにした場合:
それからx = 1/78
。x
しかし、コードを見るだけでこれを見つけるにはどうすればよいですか? 問題をより一般的に見ることにした場合、時間単位を必要とする最初のループを20
並行して実行できます。ただし、2 番目のループでは、ループ内の操作を並列に実行できないため、16
時間単位のうち、並列8
に実行できるのは のみです。
したがって、並行して実行できる合計時間は です28
。だからx = 8/36
。
したがって、アムダールの法則から次の結果が得られます (wolframalpha から):
しかし、12
上で説明したロジックに従うことで速度が向上しました。私は何を間違っていますか?
前もって感謝します