アマダールの法則の関数定義を見つけて理解するのは簡単ですが、私が見つけることができた実用的な例はすべて、私の小さなエンドウ豆の脳が理解するにはあまりにも曖昧であるか、あまりにも学術的/大脳的でした.
アマダールの法則は次のパラメータを取ります: F
、マルチスレッドでは改善できないタスクの割合、およびN
、使用するスレッドの数。
F
ある程度の精度でどのように計算しますか?
コードの一部を見て、それがマルチスレッドによって改善されるかどうかをどのように判断しますか?
アマダールの法則の関数定義を見つけて理解するのは簡単ですが、私が見つけることができた実用的な例はすべて、私の小さなエンドウ豆の脳が理解するにはあまりにも曖昧であるか、あまりにも学術的/大脳的でした.
アマダールの法則は次のパラメータを取ります: F
、マルチスレッドでは改善できないタスクの割合、およびN
、使用するスレッドの数。
F
ある程度の精度でどのように計算しますか?
コードの一部を見て、それがマルチスレッドによって改善されるかどうかをどのように判断しますか?
コードのどの部分がマルチスレッドの恩恵を受けないかを言うのは比較的簡単です: シーケンシャル部分です。一連の小さなステップを順番に実行する必要がある場合、次のステップを開始する前に常に 1 つのステップが完了するのを待つ必要があるため、マルチスレッドは役に立ちません。多くの一般的なタスクは、この意味で (必ずしも) 連続しているとは限りません。たとえば、リストで多数の項目を検索する場合などです。リストからすべての赤いアイテムを抽出したい場合は、リストの一部を複数のスレッドで共有し、各部分からすべての赤いアイテムを最終的な結果リストに集めることができます。並行プログラミングの難しさは、実際の問題に対してこれを行う効率的な方法を見つけることにあります。
より低いレベルでは、データ依存性について話すことができます。特定の命令またはブロックは、そのブロックの計算結果を独自に使用する場合、前のブロックに依存します。だから(疑似コード):
Block one:
load r1 into r2
add r1 to r3 into r4
Block two:
load r4 into r1
add 3 to r4 into r4
ブロック 2 はブロック 1 に依存します。これらは順番に実行する必要があります。ここ:
Block one:
load r1 into r2
add r1 to r3 into r4
Block two:
load r1 into r3
add 3 to r1 into r1
そうではありません。これは同時実行に直接役立つわけではありませんが、ポイントをより具体的に示していることを願っています。また、並行性の処理における別の問題も示しています。抽象ブロック機能として、これら2つは並行して実行できますが、ここに示されている具体的な例では、同じレジスタの一部を読み書きしているため、コンパイラ/パイプライン/その他が必要ですそれらが一緒に実行されるように、より多くの作業を行います。これはすべて非常に複雑ですが、http://www.amazon.com/Computer-Architecture-Quantitative-Approach-Edition/dp/1558605967で美しくカバーされています。
マルチスレッドの恩恵を受けない他の部分は、プログラミング環境とマシンのアーキテクチャによって異なります。
パーセンテージを取得する方法については、実際のケースでは手を振っている可能性があります。正確な数値を取得できるとは思えません。コードを機能単位に分割し、それぞれの実行時間をプロファイリングすると、おおよそ適切な重み付けが得られます。次に、実行時間の 90% を占める 1 つの部分をマルチスレッドで改善できれば、「タスク」の 90% を改善できると言えます。
Amdahl は、すべての作業を 2 つのグループに分けています。完全に並列化できるグループと、まったく並列化できないグループです。
後者は、決して取り除くことのできない作品だと考えてください。リソースを追加する以前の完全なベイを取り除くことができます。
テキスト ファイルを読み取って 1 行ずつ処理する場合、ファイルを順番に読み取って行を解析する必要はありません。ただし、個々の行を並列化することはできます。ファイルの読み取りに 1 秒かかる場合、コードはそれより速く実行されることはありません。
実際のコードについては、プロファイラーを接続して、各部分に費やされた時間を確認できます。各パーツをいずれかのカテゴリに分類できれば幸いです。これが完了すると、スピードアップを簡単に見積もることができ、かなり正確になります。
マルチスレッドによって何が改善されるかを確認したい場合は、コードではなくアルゴリズムに注目する必要があります。
通常、並列アルゴリズムはゼロから並列として設計する必要があります。アルゴリズム自体ではなく、コードを「並列化」するのははるかに困難です。
メモリ アクセスの依存関係 (空間的な依存関係) を調べ、一連の操作 (時間的な依存関係) を調べ、コンピューター アーキテクチャを詳細に把握すると、タスクに適したアルゴリズムを構築する方法がわかります。
式自体によると - ウィキには非常に良い説明がありますhttp://en.wikipedia.org/wiki/Amdahl 's_law