質問: スーパーコンピュータはなぜ高速に計算ができるのですか? スーパーコンピュータは多くのCPUを並列にして速度を稼いでいると認識しています しかしなぜ高速に計算できるかわかりません 理由はアムダールの法則です 複数のプロセッサを使って並列計算してプログラムの高速化を図る場合、そのプログラムの逐次的部分に制限を受ける。例えばプログラムの95%を並列化できたとしても、どれだけプロセッサ数を増やしても図で示したように20倍以上には高速化しない。 この法則を無視しないといけないことになるのですがどんな原理なのですか
回答: プログラムの実行時間を、並列化可能な部分の実行時間+逐次処理部分の実行時間と考えた時に、第一項は並列化により短縮することができ、理論的には並列数を無限大とすることで0に近似できます。 並列化なしの時の処理時間を 100 とし、逐次処理部分がそのうち 5% だとすると、 並列化なし 95 + 5 = 100 5並列 95/10 + 5 = 19 + 5 = 24 (4.2倍高速化) 20並列 95/10 + 5 = 9.5 + 5 = 14.5 (6.9倍高速化) 1000並列 95/1000 + 5 = 0.1 + 5 = 5.1 (19.6倍高速化) 100000並列 95/100000 + 5 ≒ 5 (20倍高速化) となり、逐次実行部が5%あると20倍までしか高速化できない、というのはこういうことです。 逐次実行部が1%分であれば理想的には100倍高速化できますし、0.1%であれば1000倍高速化できます。 逐次実行部の割合を下げるには、逐次実行部を少なくするのではなく、並列実行部を大きくしてもよいのです。 たとえば 1 + 1/x + 1/x^2 + ... 1/x^n の値を様々なxとnで求める問題があるとします。 従来 x と n を それぞれ 1, 2, 3, ... 1000 で求めていたところ、x = 1, 1.01, 1.02, ... 1000 n = 1, 2, 3, ... 100000 とすれば並列実行部を約 10000 倍にすることができ、これは逐次実行部を1/10000にするのと同じことです。 実際の数値計算やシミュレーションでもイメージとしては「より計算の繰り返しを増やす」とか「より多くの数値で計算してみる」とかで精度があがるので、並列数を増やす方向の高速化でもニーズがあると言うことになります。