LU分解などを実行するプログラムを作成する必要があります。問題は、ロードされた行列をルートプロセスから他のプロセスに分散するための好ましい方法がわからないことです。状況によっては簡単なアルゴリズムを作成できますが、任意の数のプロセスで機能するソリューションが本当に必要です。
このプレゼンテーション(スライド18) によると、粗粒度の分布が望ましいです。
ここで、1つのプロセスまたは2つのプロセスを使用できることがわかります(3つまたは4つは「細かすぎる」)。しかし、2つのプロセスで正しい方法は何ですか?マトリックスを行または列で分割する必要がありますか?
この場合、それはさらに問題があります。 2つのプロセス間で値を均等に分配することはできません。このように配布したとしても:
P1: 2 8 3 4
P2: 5 1 6 2 5
対称分布を完全に混乱させます。
次に、3つのプロセスを使用すると、例1とまったく同じ状況になります-行または列?
したがって、ポイントは均等な分布にあるため、完全に任意の数のプロセスに対してこれを行う方法はないと思います。これに対するアプローチは何ですか?
問題を十分に明確に説明できたと思います。そうでない場合は、コメントを残してください。質問を改善します。
タスクを並行して実行するときに一般的に使用される別のソリューションは、次のとおりです。
最初の要素を最初のプロセスに、2番目の要素を2番目のプロセスに、...そしてnを与えることから始めます。th nへの要素th 処理する。
処理された要素の1つが指定された要素のタスクを完了すると、次の要素を処理するタスクが与えられます。
要素がなくなり、すべてのプロセスが終了すると、作業は完了です。
これにより、要素の数は無関係になります。特に、タスクがまったく同じ期間かかるかどうか確信が持てない場合を対象とします。
2つのプロセスと9つのタスクがあり、最初のプロセスに11のタスクを割り当て、他のプロセスに6つのタスクを与える場合があります。これは、最初のプロセスに与えられたタスクの一部が単純だったか、最初のプロセスで使用可能なCPUサイクルが多かったためです。
同じ問題(タスクの期間が異なる)は、並列コンピューティングが必要なほとんどの状況に当てはまります。たとえば、個々のタスクが異なるマシンに与えられたマップリデュースなどです(1つのマシンが他のマシンよりもはるかに強力なハードウェアを備えている場合はどうなりますか?)
多くの場合、解決策は多くの並列タスクを持つことです。 2つのタスクがあり、一方が他方よりも時間がかかる場合、できることは何もありません。 20のタスクがあり、1つに時間がかかる場合は、長時間実行されるタスクを処理しないプロセスまたはマシンに追加のタスクを与えることで補うことができます。
これは、常に同じ時間がかかるタスクでも機能します。これは、対称的な分散が適している状況です。あなたの例では、各タスクに1秒かかると想像してください。次に、配布:
P1: 2 8 3 4
P2: 5 1 6 2 5
つまり、5秒かかるプロセス全体で、P1
1秒間に処理能力が浪費されるため、不適切な場合があります(無駄な処理能力の11.1%)。一方、タスクが2倍近くある場合:
P1: 2 8 3 4 1 9 8 8 4
P2: 5 1 6 2 5 6 3 1 4 1
次にP1
10秒のうち1秒を無駄にしますが、これはわずかに優れています(5.3%の無駄)。ここで、2つのプロセス間で分割する1501の同等に高速なタスク(<0.1%)があると想像してください。対称的でなくても、分散は非常にうまく機能します。