皆さん、マルチプロセッサを意識したプログラミングってやったことありますか? 最近のコンピュータは複数のCPUもしくは、一つのCPUが複数の実行ユニットを持っている場合がほとんどです。ということで今回は、このことを利用したサンプルプログラムを紹介しようと思います。
タスクマネージャーを起動すると、以下のようになっていました。今回の例は、CPU(実行ユニット)が4個ある場合です。
これを見るとCPU0は何かしらの処理を実行しているため、CPU占有率が上がっているのが分かると思います。それに比べ、それ以外のCPUは占有率が低く、余裕があるように見受けられます。これを利用しない手はないと思うのです。
負荷のかかる重たい処理を実行する場合、既に占有率の上がっているCPU0で、その処理を実行すると、他の処理と競合してパフォーマンスが低下してしまいます。そうであれば、この処理を余裕のあるCPU1~CPU3のいずれかで、実行すれば、パフォーマンスが向上することは明らかです。
また、プライマリCPU0は、コンピュータの基本ソフトであるOSのカーネルなどが使用していますので、負荷のかかる処理は、CPU0を避けるように実装することが望ましいと思われます。
それでは、プログラム実行のCPUを指定するには、どうすればよいかというと、それは、Windows APIのSetProcessAffinityMask関数で簡単に指定することが可能です。
ソースコードが以下からダウンロード出来ますので、参考にしてみてください。ソースコードは、Microsoft社の製品 エクセル向けに書いたものなので、利用するには、ご使用のコンピュータに、エクセルがインストールされていることが、必須条件です。
以下がエクセルで動作しているサンプル画像です。
通常のシステム開発を行っていると、マルチプロセッサを意識して、プログラミングを行うことは、あまりないかと思われます。プロセッサを指定して、プログラムを動作させることができるということを知っていれば、何かのときに役に立つことがあるかもしれません。
一つの例として、負荷の大きい処理を実行するときには、余裕のあるCPUを選択するといったパフォーマンス改善(高速化)などが挙げられるでしょう。パフォーマンス改善には、このようなアプローチもあるということです。
私はシステムエンジニア時代に、NECのVALUMO(Value More)開発の一端で、CPUの縮退処理の開発経験がありました。その時に、初めて、マルチプロセッサを意識した開発を行ったのですが、非常に、特殊な開発案件だったので、少しだけ紹介します。
CPUの縮退とは、システムダウンにつながるCPU異常を監視し、異常を検知した場合に、システムダウンを回避するため、該当CPUを停止(片肺)させ、他のCPUで、そのCPUの肩代わりをさせるというものです。ですので、物理CPUの中に、動作が停止しているものが存在しますが、OSから見ると、他のCPUが肩代わりをしていますので、全てのCPUが正常に動作しているように見えます。
当時は、サーバの堅牢性が非常に重要視され、システムの冗長化や多重化などが、はやりで、非常に懐かしく思います。
作者は、本ソフトウェアの使用または使用不能から生じるコンピュータの故障、情報の消失、その他あらゆる直接的及び間接的被害に関して一切の責任を負いません。
ご使用にあたり、改善の要望、不具合の発生等ありましたら、画面下のアドレスまで、ご連絡頂きますよう、宜しくお願いいたします。ご面倒、ご不便をお掛けしますが、宜しくお願いいたします。