次のコードがあるとします。
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 を使用して の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上で説明したロジックに従うことで速度が向上しました。私は何を間違っていますか?
前もって感謝します