スレッドを使用した並列行列マルチの概念について、誰かが私を案内してくれませんか。行列の各行に 1 つのスレッドまたはプロセスを割り当てました。しかし、CPU が 4 つしかないマシンにはあまりにも多くのスレッドが作成されました。スレッドまたはプロセスが 8 などの特定の数に制限されているかどうか、各スレッドに複数の行を計算させる方法、およびどの行がどのスレッドによって実行されたかを追跡する方法を理解できません。A[40][50]*B[50][60] があるとします。40 のスレッドを作成したくありません。行数に等しいのではなく、5 つのスレッドだけにするために、このコードにどのような変更が必要でしょうか。
1 に答える
スレッドは、プロセッサで使用可能な実行コアの数に基づいて特定の数に制限されません。プロセス モニター/タスク マネージャー ウィンドウを見てください。任意の時点で、数十のプロセスで数千のスレッドが実行されています。同時に実行できるのはほんの一握りですが、スレッド スケジューラの仕事は、実行の準備ができているスレッドに優先順位を付けて CPU をビジー状態に保つことです。
新しいスレッドの作成に関連するオーバーヘッドがあります。作成された新しいスレッドごとにかなりの量のメモリとシステム リソースを割り当てる必要があるため、独自のプロセスで何千ものスレッドを作成したくありません。実行する小さな小さなタスクがたくさんある場合は、スレッド プールを使用して、スレッドを作成するコストを削減できます。ただし、マトリックスのユース ケースでは、スレッド プールは必要ありません。
使用するスレッドの数を決定し、作業をその数のブロックに分割するだけです。5 つのスレッドを使用する場合は、行列の行数を 5 で割り、各スレッドに開始する行と消費する行数を伝えます。すべてのスレッドが同じ数の行を処理すると仮定しないでください。最後のブロックを終了する必要がありますが、行の総数が 5 の偶数倍でない場合、多くの行が残っているため、5 未満になる可能性があります。
N 行 (N は実行時に動的に決定される) の行列の場合、N / 5 行のブロックを各スレッドに発行し、残りをキャッチするために N mod 5 のブロックを 1 つ発行します。(わかりました、それは6スレッドですが、大丈夫です)