クアッドコアプロセッサのすべてのコアを使用するために、コードで変更する必要があるのは、マルチスレッドのサポートを追加することですか、それともOS自体によって処理されます。私はFreeBSDを持っており、使用している言語はC++です。アプリケーションに完全なCPUサイクルを少なくとも90%与えたい。
7 に答える
何らかの形の並列処理が必要です。マルチスレッドまたはマルチプロセッシングで問題ありません。
通常、複数のスレッドは、複数のプロセスよりも処理が簡単です(共有データにアクセスできるため)。ただし、通常、複数のスレッドは、複数のプロセスよりも処理が困難です(共有データにアクセスするため)。そして、はい、私はこれを意図的に書きました。
SIMDシナリオがある場合は、 OpenMPを検討するというNinefingersの提案も非常に優れています。(SIMDの意味がわからない場合は、以下のNinefingersの役立つコメントを参照してください。)
C ++のマルチスレッドアプリケーションの場合、クアッドコアマシンの可能性を最大限に引き出すのに役立つBoost.Threadをお勧めします。
コードの変更に関しては、可能な限り不変にすることを検討することをお勧めします。スレッド間の状態遷移は、デバッグがはるかに困難です。予期しない方法で発生する可能性のあることがたくさんあります。このSOスレッドを参照してください。
ここで言及されていないもう1つのオプションは、スレッド化は別として、FreeBSD8システムにインストールし-fopenmp
たライブラリとライブラリを介して利用できるOpenMPの使用です。libgomp
これらは#pragma
、特定のループを並列化するためのディレクティブを提供しますが、ステートメントなど、つまり並列化できるビットを提供します。それはあなたのためにスレッド化とCPUの関連付けを処理します。これは一般的な解決策であるため、並列化するのに最適な方法ではない可能性があることに注意してください。ただし、特定のルーチンを並列化することはできます。
これを見てください:https ://computing.llnl.gov/tutorials/openMP/
スレッド/プロセス自体の使用に関しては、特定のルーチンと作業方法がそれに役立ちます。タスクをそのような方法に分割できますか?プロセスをfork()するか、スレッドを作成するのは理にかなっていますか?その場合はそうしますが、そうでない場合は、アプリケーションを強制的にマルチスレッド化しようとしないでください。私が通常挙げる例は、最大公約数アルゴリズムです。これは、従来の実装では常に前のステップに依存しているため、並列化するのは困難です。
また、特定のアルゴリズムでは、並列処理の値が小さい場合、並列化が実際には遅くなることもよく知られています。これは、ジョブの完了が速くても、フォークと結合(スレッドまたはプロセス)に関連する時間コストが実際に発生するためです。シリアル実装の時間を上回ります。
私はあなたの唯一のオプションはいくつかのスレッドを実行することだと思います。アプリケーションがシングルスレッドの場合、(一度に)コアの1つでのみ実行されますが、スレッドがさらにある場合は、それらを同時に実行できます。
スレッド化を使用して、並列処理のサポートをアプリケーションに追加する必要があります。
並列処理をサポートしたら、スレッドをCPUコアに割り当てるのはOS次第です。
アプリケーションに少なくとも 90% の完全な CPU サイクルを与えたいと考えています。
なんで?あなたのチップは十分に熱くありませんか?
真剣に、世界の専門家がアプリケーションを並列化し、4 つのコアすべての 90% を使用するように 負荷分散するには、数百時間とは言わないまでも数十時間かかります。CPU はすでに支払われており、使用するかどうかに関係なく同じコストがかかります。(実際には、電気的に言えば、使用しない場合は、実行するのにわずかに費用がかかります。)あなたの時間はどれくらいの価値がありますか? 300 ドルの費用がかかり、ほとんどの時間アイドル状態になっている可能性があるリソースをより効果的に使用するために、何時間投資しても構わないと思っていますか?
並列処理によって高速化することは可能ですが、人間の時間ではコストがかかります。それを正当化するには正当な理由が必要です。(方法を学ぶことは十分な理由です。)
私が知っている並列プログラミングに関する優れた本はすべて、C++ 以外の言語に関するものであり、それには正当な理由があります。並列処理に関する興味深いものが必要な場合は、pH の Implicit Parallel ProgramminまたはML の Concurrent ProgrammingまたはFortress Projectをチェックしてください。
最初に確認すべきことは、アプリケーションとそのアルゴリズムが並列実行に適しているかどうか (または、独立して処理できるシリアル タスクのセットとして実行できる可能性があるかどうか) です。そうでない場合は、マルチスレッド化や並列プロセスへの分割が難しくなり、動作方法の変更を検討する必要がある場合があります。
並列処理のメリットが得られることを確認したら、複数のプロセスまたはスレッドを使用するオプションを選択できます。どちらを選択するかは、アプリケーションの性質と、並列プロセスがどの程度独立しているかによって大きく異なります。スレッドは同じプロセスにあるため、スレッド間のデータの調整と共有は簡単ですが、開発とデバッグはかなり困難です。
Boost.Thread は、マルチスレッド ルートを使用する場合に適したライブラリです。