タイトルはそれをすべて言っています:単一のCPUコアを使用して複数のCPUコアを使用するように設計された古いプログラムを取得する方法はありますか?
タイトルはそれをすべて言っています:単一のCPUコアを使用して複数のCPUコアを使用するように設計された古いプログラムを取得する方法はありますか?
回答:
残念ながら、単一のCPU用に作成されたレガシープログラムが複数のCPUコアを使用することを強制することはできません。複数のCPUコアを使用するには、複数のスレッドが必要です。これらのスレッドは、競合状態やその他の問題が発生しないようにしながら、互いに通信する必要があります。古いアプリケーションは、アプリケーションの性質上、並列化が許可されている場合にのみ書き換えられない限り、CPUコア以上を使用することはできません。
あなたの目標は何ですか?パフォーマンスが向上しましたか?悲しいことに、1つのコアのみを使用するように設計されたアプリケーションは、それ以上使用しません。これが、「マルチスレッド」アプリケーションの話です。
単一のコアを使用するために設計されたプログラムで複数のプロセッサを活用するための少なくとも3つの手法があります。これらの手法の中で最も簡単なのは、複数のコアを使用するか、少なくとも部分的にアプリケーションコードと並行して実行できるライブラリとシステムコードを使用することです。ガベージコレクションは、並列化できる機能の例であり、アプリケーションの実行と並行して実行できる場合があります。自動メモリ管理がなくても、メモリアロケータはメモリのセクションを使用可能としてマークするだけでは済まないため、メモリの割り当て解除関数に並列処理の可能性があります。
2番目の手法はバイナリ変換です。これは「アプリケーションの書き換え」と見なされる場合がありますが、ソフトウェアによって、ソースコードにアクセスすることなく行われます。スレッドレベルの並列処理の生成は、バイナリ変換を使用するほとんどの研究開発の主な目標ではなかったようです(多くの場合、異なるISAでのレガシーコードの実行、ISA拡張機能の活用、特定のマイクロアーキテクチャの最適化、および動的情報を使用した高度な提供品質プロファイルに基づく最適化)、しかしその可能性は明らかです。
3番目の手法は投機的マルチスレッドです。現在、ハードウェア管理の投機的マルチスレッドをサポートしているプロセッサ(私が知っている)はありません。ただし、ハードウェアトランザクションメモリの導入により、HTMを使用してメモリ使用の競合を検出できるため、ランタイムシステムにそのような実装を実装する方が多少実用的です。ソフトウェア管理の投機的マルチスレッドには通常、バイナリ変換が含まれますが、投機的な性質は別の手法を検討することを正当化します。
これらの手法の実用性は、既存のシステムに関連するコスト(スレッド間および生成スレッドの通信コストを含む)、利用可能な制限された並列性、および投資利益率の制限(有益な重要なアプリケーション)によって制限されます並列化は書き直される可能性が高いため、多くのアプリケーションはそのような手法の恩恵をほとんど受けません(特に、電力/熱の制限により、単一のコアを複数のコアよりも高い周波数で実行できるため)。開発コストは非常に高くなります。しかし、これらの手法は存在し、理論的には、単一のコアを使用するように設計されたアプリケーションで複数のコアを使用することが可能です。
いいえ、できません。プログラムは、複数のコアを使用するように明示的に記述されています。複数のコアでジョブを実行することは簡単ではありません。すべてのスレッドの同期が必要です。ボールを投げる、キャッチする、ボールを磨く、掃除する、ボールに十分な空気があるかどうかをチェックするなどです。ここで、各キャラクターが互いに独立してスレッドで実行されていると想像してください。誰かが投げられないときにボールをキャッチしようとします。または、誰かがボールがプレーされているときにボールを磨こうとします。または、2人のキャラクターが同時にボールをキャッチして投げようとします。クラッシュする方法はたくさんあります。そのため、プログラマは、複数のコアを活用できるように、シングルコアアプリケーションを慎重に再設計する必要があります。