2

シングルスレッド CPLEX と Java (Linux 下) を使用して、線形プログラム (LP) をモデル化し、解決しています。私の目的は、並列スレッドで複数の小さな LP を解決することです。理想的には、各コアが 1 つの LP を個別に解決します。

問題は、2 つ以上の LP を並行して解くと、1 つの LP を解くよりもはるかに時間がかかることです。非常に単純なテストで、同じ LP を解決する複数の同じプロセスを同時に開始しました。単一のプロセスを開始する場合と複数のプロセスを開始する場合の実行時間の違いは非常に大きくなります。

  • 1工程:180秒
  • 2工程:225秒
  • 3工程:280秒

同様に、同じプロセスから複数のスレッドを開始して複数の LP を同時に解決するのは、単一の LP を解決するよりもはるかに時間がかかりました。

メモリ アクセスがボトルネックになるのではないかと考えましたが、メモリへの読み書きが頻繁に行われるコードをテストしたところ、同等のランタイムが得られました。

  • 1工程:87秒
  • 2工程:85秒
  • 3プロセス 88秒

遅さの原因は何ですか?

私がこれを実行しているマシンには、スワッピングを避けるために 6 つのコアと十分なメモリがあります。IBM ILOG Cplex ライブラリーはバージョン 12.5 です。

4

2 に答える 2

2

複数のスレッドを有効にしている場合、CPLEX は並行オプティマイザーを使用します。つまり、デュアル シンプレックスを 1 つのスレッドで実行し、残りの他のスレッドでバリア アルゴリズムを実行します。CPLEX は、最初に終了するアルゴリズムの答えを報告します。したがって、6 コアの場合、デュアル シンプレックスに 1 スレッド、バリアに 5 スレッドを使用する可能性があります。3 つの LP を同時に解決しようとすると、それらは互いにサイクルを盗んでいます。パラメーター RootAlg を 2 に設定することにより、デュアル シンプレックス (常に 1 つのスレッドのみを使用する) のみを使用できます。また、パラメーター AuxRootThreads を設定することもできます各 LP ソルブで使用されるスレッドの数を制限します。どのアルゴリズム (Primal、Dual、または Barrier) が問題に対してより適切に機能するかを確認する必要があります。複数のスレッドを利用できる Barrier が最適に機能する場合は、各モデルをシリアルに実行し、CPLEX に並列化を実行させる方がよい場合があります。

于 2013-06-13T04:38:57.930 に答える
0

まず、TJCrowderのコメントが正しいことを強調しておきます。一般的に言えば、実際のスピードアップは、マルチスレッド アプローチでは直線的ではありません。実際、次のことを考慮してください。1) 自分のマシンだけでなく、マシン上で実行される他のプロセスがある。2) CPU アーキテクチャは他のハードウェア (マザーボード、RAM など) と同様に非常に重要であり、これらはアルゴリズムのパフォーマンスに影響を与える可能性があります。

CPLEX に含まれるいくつかのオプションを試してみることをお勧めしますparallel mode switch

最後に、質問に関するもう 1 つの重要な考慮事項があります。実装が適切であると想定していますが、それに関する証拠はありません。

于 2013-06-12T07:53:19.233 に答える