2010年9月13日月曜日

マルチスレッドによるマルチコア

前回ではプログラマが並列処理をコントロールする事により、大きな処理性能の向上が図れる事を説明しましたが、マルチコアCPUを利用する時にも同様の事が言えます。

マルチコアCPUとは、CPUの機能を一つのチップ上に複数持っているCPUの事です。
マルチコアCPUは搭載されているコアの分だけ並列にプログラムを実行させる事が可能で、搭載されているコアを休み無く動作させる事により性能の向上が可能です。

現在は組み込み機器にもLinuxを初めとしたマルチスレッドに対応したOSが採用されており、マルチスレッドの機能を利用する事により、マルチコアCPUの性能を引き出す事が可能です。

マルチスレッド

マルチスレッドと呼ばれるように、マルチスレッドはスレッドを複数扱う事になります。
マルチスレッドの機能を利用してプログラムを行う為に最低限覚える事は、スレッドの起動と終了待ちの2つだけです。

スレッドの起動で行える事は、C言語における関数や他のプログラム言語におけるサブルーチンを実行させる事と同様です。
通常の関数呼び出しと違う所は、関数内部の処理の実行が複数並列に行われる所です。
この関数を並列に実行するする仕組みを利用して、CPUに複数のプログラムを実行させます。
関数呼び出しを行う事がスレッドの起動に対応し、関数の実行待ちを行う事がスレッドの終了待ちに対応します。

同期処理

スレッドを複数同時に実行する事で、マルチコアCPUを効率良く扱う事が出来ますが、その時に幾つか制限があります。
複数スレッドの実行中は、他のスレッドが参照しているデータを書き換える事が出来ません。
実際には強引に書き換える事が可能ですが、OSの機能を利用した同期処理を行わない限り、実行結果が不定になってしまい、安全に実行する事が出来ません。

マルチスレッドに対応したOSには、スレッド間で同期を行う為の仕組みが用意されています。
標準的な物として、クリティカルセクションミューテックスと呼ばれる、プログラム実行の排他制御があります。
クリティカルセクションでは、プログラムが同時に実行される部分を制限でき、この機能によりお互いに参照しているデータが不正に書き換えられる事を防ぎます。

しかしクリティカルセクションを利用して、同時に実行されるプログラムを広範囲に制限してしまうと、同時に動作するCPUコアの数が減ってしまい、マルチコアCPUによる性能向上が出来なくなってしまいます。

ゲームエンジンでマルチコアCPUを利用して性能向上を行う場合、 同期処理による性能低下をいかにして防ぐかが課題になります。

0 件のコメント:

コメントを投稿