web-dev-qa-db-ja.com

シングルスレッドプログラムで複数のコアを使用できますか?

タイトルがすべてを物語っています:単一のCPUコアを使用して複数のCPUコアを使用するように設計された古いプログラムを入手する方法はありますか?

12
Chris

残念ながら、単一のCPU用に作成されたレガシープログラムは、複数のCPUコアを強制的に使用することはできません。複数のCPUコアを使用するには、複数のスレッドが必要です。スレッドは互いに通信して、競合状態やその他の問題が発生しないようにする必要があります。古いアプリケーションは、アプリケーションの性質上、並列化が許可されている場合に限り、CPUコアを超えて使用することはできません。

16
bwDraco

それであなたの目標は何ですか?パフォーマンスの向上?悲しいことに、1コアのみを使用するように設計されたアプリケーションは、それ以上は使用しません。これが「マルチスレッド」アプリケーションのこの話のすべてです。

13
user76211

シングルコアを使用するように設計されたプログラムで複数のプロセッサを活用するには、少なくとも3つの手法があります。これらの技術の最も簡単な方法は、複数のコアを使用するか、少なくとも部分的にアプリケーションコードと並列に実行できるライブラリとシステムコードを使用することです。ガベージコレクションは、並列化できる機能の例であり、アプリケーションの実行と並行して実行できる場合があります。自動メモリ管理がなくても、メモリアロケータはメモリのセクションを使用可能としてマークするだけでなく、メモリ割り当て解除機能に並列処理の可能性があります。

2番目の手法は、バイナリ変換です。これは「アプリケーションの書き直し」と考えられるかもしれませんが、ソフトウェアによって行われ、ソースコードへのアクセスはありません。スレッドレベルの並列処理を生成することは、バイナリ変換を使用するほとんどの研究開発の主な目的ではないようです(これは、多くの場合、異なるISAでレガシーコードを実行し、ISA拡張を利用するか、特定のマイクロアーキテクチャー、および動的情報を使用して高品質のプロファイルに基づく最適化を提供します)が、その可能性は明らかです。

3番目の手法は、投機的なマルチスレッド化です。現在、ハードウェアで管理された投機的マルチスレッドをサポートするプロセッサー(私が知っているもの)はありません。ただし、ハードウェアトランザクショナルメモリの導入により、HTMを使用してメモリ使用の競合を検出できるため、ランタイムシステムにそのような実装を実装することはいくぶん実用的になります。ソフトウェアで管理された投機的マルチスレッドは、通常、いくつかのバイナリ変換を伴いますが、その投機的な性質により、別の手法を検討することは正当化されます。

これらの手法の実用性は、既存のシステムに関連するコスト(スレッド間の通信のコストとスレッドの生成のコストを含む)、それらが活用できる限られた並列処理、投資の制限(有益である重要なアプリケーション)によって制限されます。並列化は書き直される可能性が高く、多くのアプリケーションはそのような手法から利益を得ることはほとんどなく(特に、電力/熱制限により、単一コアを複数コアよりも高い周波数で実行できるため)、開発コストはかなり高くなります。しかし、これらの手法doが存在し、単一のコアを使用するように設計されたアプリケーションで複数のコアを使用することは理論的に可能です。

2
Paul A. Clayton

いいえ、できません。プログラムは、複数のコアを使用するように明示的に記述されています。複数のコアで作業を行うことは簡単ではありません。すべてのスレッドの同期が必要です。ボールを投げるように、他はキャッチし、1つはボールを磨き、1つは掃除し、1つはボールに十分な空気があるかどうかをチェックします。次に、各キャラクターが互いに独立してスレッドで実行されていると想像してください。誰かが投げられないときにボールをキャッチしようとします。または、誰かがボールをプレーしているときにボールを磨こうとします。または、ボールをキャッチして同時に投げようとする2人のキャラクター。クラッシュする方法はたくさんあります。したがって、プログラマーは、シングルコアアプリケーションを注意深く再設計して、複数のコアを利用できるようにする必要があります。

0
user36582