以下に添付図面を参照して、この発明にかかるマルチコアプロセッサシステム、マルチコアプロセッサシステムの制御方法および制御プログラムの好適な実施の形態を詳細に説明する。
図1は、本実施の形態にかかるスケジューリング処理の一例を示す説明図である。本実施の形態では、マルチコアプロセッサシステム100に備えられた複数のプロセッサによって、複数の処理を並列に実行することができる。したがって、マルチコアプロセッサシステム100では、アプリケーションの中から並列に実行可能な処理群(例えば、並列タスク)を抽出して、効率的な並列処理を行うことができる。
また、本実施の形態では、実行対象となる処理に実行順序に関する優先度を、高優先度と低優先度とに設定することによって、再利用性の高いデータを選別してキャッシュメモリに配置することができる。優先度は、処理を実行させた際に一旦キャッシュメモリに格納したデータへアクセスする頻度や、デッドライン時間に基づいて設定されている。各タスクの優先度の設定内容はタスクテーブル111に記憶されている。なお、図1以降、高優先度のタスクを表すブロックを、低優先度のタスクを表すブロックよりも大きく表示する。
したがって、マルチコアプロセッサシステム100のスケジューラ110は、並列実行させる処理に設定されている優先度を参照して、各処理を実行する際にアクセスされるデータ(以下、「共有データ」と呼ぶ)をそれぞれ、最適なメモリ領域に配置する。また、スケジューラ110は、複数のキャッシュメモリに同一の共有データが配置されている場合に、優先度に応じて共有データを同期させるキャッシュコヒーレンシとして、どのような手法を用いるかを選択する。
具体的には、左側のマルチコアプロセッサシステム100のように、同一優先度が設定された並列に実行可能な処理を各CPUによって同時に実行する場合、スケジューラ110は、高優先度の処理の共有データをアクセス速度の速いメモリ領域から優先的に配置する。例えば、高優先度に設定されている並列可能なタスク#0,1およびタスク#3,4の共有データは、キャッシュL1$から順に、アクセス速度の速いメモリ領域に配置される。そして、低優先度に設定されたタスク#2およびタスク#5の共有データについては、高優先度の処理の共有データが配置された後に、残りのメモリに配置される。
一方、右側のマルチコアプロセッサシステム100のように、優先度の異なる並列に実行可能な処理を各CPUによって同時に実行する場合も、スケジューラ110は、左側のマルチコアプロセッサシステム100と同様に、高優先度に設定された処理の共有データをキャッシュL1$へ配置する。その後、スケジューラ110は、残りのメモリに、低優先度に設定されたタスク#2およびタスク#3の共有データを配置する。
また、左側のマルチコアプロセッサシステム100の場合、スケジューラ110は、通常のキャッシュメモリに新たな値が書き込まれたタイミングでキャッシュコヒーレンシを行う。一方、右側のマルチコアプロセッサシステム100の場合、スケジューラ110は、あるキャッシュメモリ(例えば、キャッシュL1$0)に、新たな値が書き込まれた後、CPUから新たな値の書き込みが反映されていないキャッシュメモリ(キャッシュL1$1)への読み込みが発生したタイミングでキャッシュコヒーレンシを行う。
このように、本実施の形態にかかるマルチコアプロセッサシステム100は、利用頻度の高い共有データを、アクセス速度の速いキャッシュメモリに優先的に配置するため、処理速度を向上させることができる。また、低優先度に設定された処理の共有データは、CPUからのアクセス要求が発生するまで、キャッシュコヒーレンシによる同期処理が延期される。したがって、再利用性のない共有データをキャッシュメモリに書き込むなど、処理性能の低下の原因となる動作を回避することができる。以下には、本実施の形態にかかるマルチコアプロセッサシステム100の詳細な構成と処理手順について説明する。
(階層的なメモリ構成)
図2は、階層的なメモリ構成の一例を示す説明図である。図2に例示したように、本実施の形態にかかるマルチコアプロセッサシステム100は、複数種類のメモリ領域を備えている。各メモリ領域は、それぞれプロセッサからのアクセス速度やメモリ容量が異なるため、それぞれ用途に応じたデータが格納される。
図2のように、マルチコアプロセッサシステム100の各プロセッサ(CPU#0,CPU#1)には、キャッシュL1$(各プロセッサに搭載されたキャッシュメモリ)、キャッシュL2$(スヌープ120に搭載されたキャッシュメモリ)、メモリ140およびファイルシステム150という4種類のメモリ領域が用意されている。
各プロセッサと接続関係が近い上位のメモリ領域ほど、アクセス速度が速く、メモリ容量が小さい。反対に、各プロセッサとの接続関係が遠い下位のメモリ領域ほど、アクセス速度が遅く、メモリ容量が大きい。したがって、マルチコアプロセッサシステム100では、図1にて説明したように、優先的に処理したいタスクが利用する共有データや、利用頻度の高い共有データを上位のメモリに配置する。
(マルチタスク処理)
図3は、マルチタスク処理の一例を示す説明図である。本実施の形態にかかるマルチコアプロセッサシステム100におけるマルチタスク処理とは、複数のタスクが複数のプロセッサによって並列に実行される処理を意味する。
例えば、図3では、マルチコアプロセッサシステム100の実行対象となるタスクとしてタスク#0〜タスク#5が用意されている。そして、スケジューラ110の制御によって、CPU#0とCPU#1とは、それぞれ、ディスパッチされたタスクを実行する。スケジューラ110は、複数のタスクの中から実行対象となるタスクをタイムスライシングなどで適宜切り替えながら各タスクを並列に実行させる。
(キャッシュコヒーレンシ)
次に、本実施の形態にかかるマルチコアプロセッサシステム100のスヌープ120によって実行されるキャッシュコヒーレンシの手順について説明する。図1にて説明したように、スヌープ120は、スケジューラ110からの指示に応じて、通常のキャッシュコヒーレンシと、低優先度並列タスクにおけるキャッシュコヒーレンシのいずれかのコヒーレンス方式が設定される。
<通常のキャッシュコヒーレンシ(write時更新)>
図4〜7は、通常のキャッシュコヒーレンシの手順を示す説明図である。図4に例示したマルチコアプロセッサシステム100では、並列タスクを実行するCPU#0およびCPU#1のキャッシュメモリ(キャッシュL1$0およびキャッシュL1$1)に、実行対象のタスクの記述400に基づいて、最新データが格納される。
その後、図5のように、マルチコアプロセッサシステム100の1つのCPUが、記述400の変数aの中身を書き換えたとする。例えば、図5では、CPU#0によって、キャシュL1$0の変数aの値が書き換えられている。すると、同じデータが格納されているキャッシュL1$1の変数aは古いデータとなり、同じ変数aであっても異なる値となってしまう。
そこで、通常のキャッシュコヒーレンシの場合、古いデータが格納されているキャッシュL1$1の変数aの値は、まず、図6のように、記述400に基づいて、パージされる。
その後、図7のように、スヌープ120のバスを介して、キャッシュL1$0の変数aの値は、キャッシュL1$1の変数aの値として格納される。以上説明したように、通常のキャッシュコヒーレンシの場合、図4〜7に例示した処理を施すことによって、キャッシュL1$0とキャッシュL1$1との一貫性が保たれる。
<低優先度並列タスクにおけるキャッシュコヒーレンシ(read時更新)>
図8は、低優先度並列タスクにおけるキャッシュコヒーレンシの手順を示す説明図である。図8は、低優先度に設定された並列タスクをマルチコアプロセッサシステム100によって実行させる場合のコヒーレンシの手順を表している。
まず、マルチコアプロセッサシステム100において、CPU#0とCPU#1とは並列タスクを実行しており、キャッシュL1$0とキャッシュL1$1には同じデータが配置されている(ステップS801)。
その後、マルチコアプロセッサシステム100のCPU#0が変数aの中身を書き換えると(ステップS802)、キャッシュL1$1の変数aは、パージされる(ステップS803)。このように、低優先度並列タスクにおけるキャッシュコヒーレンシの場合も、キャシュメモリに格納されている変数aの書き換えを検出して、古いデータがパージされるまでは、通常のキャッシュコヒーレンシと同じ手順が行われる。
その後、マルチコアプロセッサシステム100のCPU#1によって、変数aへアクセスする処理が実行された場合、スヌープ120は、バスを介して、キャッシュL1$0に格納されている最新の変数aの値を、キャッシュL1$1に格納する(ステップS804)。
以上説明したように、低優先度並列タスクにおけるキャッシュコヒーレンシでは、CPU#1によって最新の書き換え内容が反映されていないキャッシュL1$1の変数aへのアクセス要求が発生した際に、スヌープ120が制御され、コヒーレンスがとられる。したがって、通常のキャッシュコヒーレンシのような冗長なバストランザクションを回避することができる。
上述したように、通常のキャッシュコヒーレンシでは、変数aが更新されたタイミングで動作を開始する。それに対して、低優先度並列タスクにおけるキャッシュコヒーレンシでは、CPU#0によって、キャッシュL1$0の変数aが更新された後、CPU#1によって変数aへの読み込み要求が発生すると、はじめて動作を開始する。具体的には、スヌープ120が、最新の変数aが配置されているキャッシュL1$0の変数aの値を読み込み、読み込んだ値を、キャッシュL1$1の変数aとして配置する。
また、図8に例示したステップS804では、キャッシュL1$0にCPU#0のアクセス対象となるデータが配置されていたが、キャッシュL1$0によって実行されるタスクによっては、他のメモリ領域に格納されているデータがアクセス対象となる場合もある。例えば、CPU#0が、キャッシュL2$やメモリ140やファイルシステム150に配置されているデータへアクセスする場合も想定される。そのような場合には、スヌープ120は、各データ領域から対象となるデータを読み出してキャシュメモリL1$に配置することができる。
以下には、図1に示した本実施の形態にかかるスケジューリング処理を実現するマルチコアプロセッサシステム100のスケジューラ110の機能的構成と、動作内容について説明する。
(スケジューラの機能的構成)
図9は、スケジューラの機能的構成を示すブロック図である。図9において、マルチコア901は、n個のCPU(Central Processing Unit)を備え、マルチコアプロセッサシステム100の全体の制御を司る。マルチコア901とは、コアが複数搭載されたプロセッサまたはプロセッサ群である。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
そして、スケジューラ110は、判断部1001と、第1配置部1002と、第2配置部1003と、第3配置部1004と、特定部1005と、抽出部1006と、割当部1007と、を含む構成である。判断部1001〜割当部1007は、具体的には、例えば、マルチコアプロセッサシステム100の他のメモリ1008(CPUに搭載されたキャッシュメモリ以外のメモリ)に記憶されたプログラムをマルチコア901の中の特定のCPUに実行させることにより、その機能を実現する。
判断部1001は、マルチコアプロセッサシステム100において、実行対象となる処理(以下、「実行対象処理」と呼ぶ)に設定されている優先度がしきい値以上か否かを判断する機能を有する。具体的には、判断部1001は、マルチコアプロセッサシステム100の各プロセッサ(CPU#0〜CPU#n)に割り当てて実行させる処理群のうち各プロセッサに割り当てられる実行対象処理の優先度が、しきい値以上か否かを判断する。判断部1001による判断結果は、一旦、他のメモリ1008などの記憶領域に記憶される。
優先度は、実行対象処理のシミュレーションによって得られる動作結果に基づいて設定される。例えば、各実行対象処理のデッドラインを比較して、デッドラインまでの時間が短い実行対象処理ほど、優先度が高くなるように設定してもよい。本実施の形態にかかるスケジューラ110は、優先度が高く設定されている実行対象処理の共有データを、一旦、アクセス速度の速いメモリ(キャッシュL1$や、キャッシュL2$)に配置すると、処理が終了するまでロック状態に保つ。したがって、優先度が高く設定されている実行対象処理は、他の実行対象処理よりも優先的に実行される。
また、他にも、動作結果を参照して、キャッシュメモリに配置した共有データの更新回数が多い実行対象処理ほど優先度が高くなるように設定してもよい。本実施の形態にかかるスケジューラ110は、再利用性の高い共有データを優先的に各プロセッサのキャッシュメモリ(キャッシュL1$)に配置するため、キャッシュメモリの利用効率を高い値に維持することができる。
また、判断部1001において判断基準となるしきい値は、調整可能である。そして、判断部1001は、各実行対象処理について、設定されている優先度がしきい値以上であれば、高優先度の実行対象処理とし、設定されている優先度がしきい値に満たなければ、低優先度の実行対象処理とする。したがって、実行対象となるアプリケーションに応じて最適な値を設定することができる。また、実行対象処理の単位としては、タスク、プロセス、スレッドなど、任意の単位を選択することができる。本実施の形態では、一例として、タスクを実行対象処理の単位として説明を行う。
第1配置部1002は、判断部1001の判断結果に応じて、各CPUに搭載されたキャッシュメモリへデータを配置する機能を有する。具体的には、第1配置部1002は、判断部1001によって、実行対象処理のうち、しきい値以上の優先度であると判断された高優先度の実行対象処理が実行時にアクセスする共有データを、対象となるCPUのキャッシュメモリに配置する。
例えば、高優先度の実行対象処理であるタスクAが、マルチコア901の中のCPU#1によって実行される場合、タスクAが実行時にアクセスする共有データは、第1配置部1002によって、キャッシュメモリ1に配置される。同様に、高優先度の実行対象処理であるタスクBが、マルチコア901の中のCPU#0によって実行される場合、タスクBが実行時にアクセスする共有データは、第1配置部1002によって、キャッシュメモリ0に配置される。
また、アプリケーション1000によっては、実行対象処理の中に、判断部1001によって、高優先度の実行対象処理が存在しないと判断されることがある。このような場合にキャッシュメモリを空の状態で放置すると、キャッシュメモリの利用効率が低下してしまう。そこで、第1配置部1002は、高優先度の実行対象処理以外の処理(例えば、後述する低優先度の実行対象処理)であっても、各CPUに搭載されたキャッシュメモリへ共有データを配置する。その後、高優先度の実行対象処理が現れた場合、第1配置部1002は、優先的に高優先度の処理の共有データを対象となるCPUのキャッシュメモリに配置する。
また、第1配置部1002は、上述したように、高優先度の実行対象処理の共有データを、対象となるプロセッサのキャッシュメモリに配置する際に、高優先度の実行対象処理の実行が終了するまで、共有データの上書きを禁止(ロック状態)にすることもできる。したがって、第1配置部1002は、高優先度の実行対象処理の共有データに対する、再利用性のないデータによる上書きを防ぐことができる。
第2配置部1003は、判断部1001の判断結果に応じて、各プロセッサのキャッシュメモリよりもアクセス速度の遅い他のメモリ1008に、データを配置する機能を有する。具体的には、第2配置部1003は、判断部1001によって、しきい値以上の優先度でないと判断された低優先度の実行対象処理が実行時にアクセスする共有データを、他のメモリ1008に配置する。
なお、図2にて説明したように、キャッシュメモリ以外の他のメモリ1008は、アクセス速度と、メモリ容量に応じて階層的に複数種類のメモリが用意されている。したがって、第2配置部1003は、アクセス速度の高いメモリの順に配置可能な容量分のデータを順次格納する。例えば、図9の場合、キャッシュL2$→メモリ140→ファイルシステム150の順序でデータが配置される。また、データも、事前のシミュレーションから特定した更新頻度が高いデータが優先的にアクセス速度の速いメモリに配置される。
第3配置部1004は、マルチコア901からアクセス要求のあった共有データを、要求元のCPUに搭載されているキャッシュメモリに配置する機能を有する。具体的には、第3配置部1004は、マルチコア901の中のいずれかのCPU(例えば、CPU#1)においてメモリ1008に配置された共有データへのアクセス要求が発生した場合に、メモリ1008に配置された共有データを、CPU#1のキャッシュメモリ1に配置する。
特定部1005は、判断部1001によって実行対象処理の優先度が、しきい値以上か否かの判断が行われると、マルチコア901の各CPUのキャッシュメモリの中の書き換え可能な領域の容量を特定する機能を有する。書き換え可能な領域とは、すなわち、上書き可能な領域を意味する。
したがって、実行済の処理の共有データが配置されている領域や、低優先度の処理の共有データが配置されている領域は、上書き可能なため、書き換え可能な領域として特定される。特定部1005による特定結果は、一旦、他のメモリ1008などの記憶領域に記憶される。
また、第1配置部1002は、特定部1005によって特定された書き換え可能な領域の容量に応じて、配置処理を調整することもできる。例えば、書き換え可能な領域の容量が高優先度の実行対象処理が実行時にアクセスする共有データの容量よりも小さい場合、第1配置部1002は、共有データをすべてキャッシュメモリに配置することはできない。そこで、第1配置部1002は、共有データのうち、更新頻度が高いデータの順にキャッシュメモリに配置可能な容量分配置する。そして、第2配置部1003は、キャッシュメモリに配置できなかった共有データを他のメモリ1008領域に配置する。
また、反対に、書き換え可能な領域の容量が、高優先度の実行対象処理が実行時にアクセスする共有データの容量よりも大きくなる可能性もある。このような場合、第1配置部1002は、まず、通常通り高優先度の実行対象処理が実行時にアクセスする共有データをキャッシュメモリに配置する。その後、第1配置部1002は、低優先度の実行対象処理が実行時にアクセスする共有データのうち、更新頻度が高いデータの順にキャッシュメモリの中の空き容量に配置する。
抽出部1006は、アプリケーション1000に含まれる実行対象処理のうち、特定の条件を満たす処理を抽出する機能を有する。具体的には、抽出部1006は、実行対象処理のうち、実行時にアクセスするデータが共通する処理(例えば並列タスク)を抽出する。実行時にアクセスするデータが共通するか否かは、各実行対象処理に設定されている共有データの識別子を参照する(例えば、後述する図13にて説明する共有データID)。抽出部1006による抽出結果は、一旦、メモリ1008などの記憶領域に記憶される。
割当部1007は、実行対象処理をマルチコア901の各CPUに割り当てる機能を有する。割当部1007は、スケジューラ110からの指示がなければ、各実行対象処理を、事前に設定されている依存関係および実行順序と、現在の各CPUの処理負荷とに基づいて、最適なCPUに割り当てる。
また、割当部1007は、抽出部1006によって抽出された処理が存在する場合には、共有データが共通する処理同士として抽出された各処理をマルチコア901の中の同一のCPUに割り当てる。さらに、割当部1007は、抽出部1006によって抽出された処理のうち、同一の優先度が設定されている処理を、マルチコア901の中の同一のCPU(例えば、CPU#1など)に割り当てることもできる。
以下には、マルチコアプロセッサシステム100が、実行対象処理の一例として、アプリケーション100を構成する並列タスクを各CPUによって並列に実行する場合について説明する。
(共有データの配置処理)
図10は、共有データの配置処理の手順を示すフローチャートである。図10のフローチャートは、共有データをいずれのキャッシュメモリ(キャッシュL1$やキャッシュL2$)に配置するかを決定する手順を表している。図10の各処理を実行することによって、各タスクを実行する際に利用する共有データをキャッシュコヒーレンシ処理の内容に対応した適切なキャッシュメモリに配置することができる。
図10において、スケジューラ110には、実行対象となるタスクが順次入力される。したがって、スケジューラ110は、まず、実行対象となるタスクが高優先度タスクか否かを判断する(ステップS1001)。ステップS1001において、実行対象となるタスクが高優先度タスクであると判断された場合(ステップS1001:Yes)、スケジューラ110は、実行対象となるタスクの全共有データサイズが、キャッシュL1$サイズよりも小さいか否かを判断する(ステップS1002)。
ステップS1002において、全共有データサイズが、キャッシュL1$サイズよりも小さいと判断された場合(ステップS1002:Yes)、スケジューラ110は、全共有データをL1$に配置して(ステップS1003)、一連の処理を終了する。すなわち、スケジューラ110は、ステップS1003によって、実行対象となるタスクが高優先度タスクであり、かつ、実行対象のタスクの全共有データがCPUのキャッシュメモリに格納可能であれば、全共有データをアクセス速度の速いキャッシュL1$に配置する。
ステップS1002において、全共有データサイズが、キャッシュL1$サイズよりも小さくないと判断された場合(ステップS1002:No)、スケジューラ110は、全共有データをキャッシュL1$に配置することはできない。したがって、スケジューラ110は、実行対象のタスクの共有データのうち、更新頻度の高い順番にキャッシュL1$,L2$に配置する(ステップS1004)。すなわち、スケジューラ110は、ステップS1004によって、共有データのうち更新頻度の高いデータから順番にキャッシュL1$に配置し、キャッシュL1$の容量がなくなると、続いて、残りの共有データのうち更新頻度の高いデータから順番にキャッシュL2$に配置する。
以上説明したステップS1002〜S1004の処理は、高優先度タスクの共有データを配置する場合の手順を表している。一方、高優先度タスク以外のタスク(低優先度のタスク)の共有データは、更新頻度大となるデータを対象に、キャシュL1$の空領域に配置される。
ステップS1001において、実行対象となるタスクが高優先度タスクではないと判断された場合(ステップS1001:No)、スケジューラ110は、共有データのうち、更新頻度の高いデータを対象として配置処理を行う。まず、スケジューラ110は、実行対象のタスクの共有データのうち、更新頻度大の全共有データサイズが未ロックのキャッシュL1$サイズよりも小さいか否かを判断する(ステップS1005)。未ロックのキャッシュL1$サイズとは、キャッシュL1$の全領域のうち、既に他の実行対象のタスクの共有データが配置されているロック領域以外の領域の容量を意味する。
ステップS1005において、更新頻度大の全共有データサイズが未ロックのキャッシュL1$サイズよりも小さいと判断された場合(ステップS1005:Yes)、スケジューラ110は、更新頻度大の全共有データをキャッシュL1$に配置できると判断する。したがって、スケジューラ110は、更新頻度大の共有データをキャッシュL1$に配置して(ステップS1006)、一連の処理を終了する。
一方、更新頻度大の全共有データサイズが未ロックのキャッシュL1$サイズよりも小さくはないと判断された場合(ステップS1005:No)、スケジューラ110は、更新頻度大の全共有データをキャッシュL1$に配置できない。したがって、スケジューラ110は、実行対象のタスクの共有データのうち、更新頻度の高いデータを順番に、キャッシュL1$,L2$へ配置する(ステップS1007)。すなわち、スケジューラ110は、ステップS1004と同様に、共有データのうち、更新頻度の高いデータから順番にキャッシュL1$へ配置する。そして、キャッシュL1$の容量がなくなると、スケジューラ110は、続いて、残りの共有データのうち更新頻度の高いデータから順番にキャッシュL2$へ配置する。
以上説明したように、低優先度タスクの共有データの場合、スケジューラ110は、高優先度タスクの共有データが配置されていないメモリ領域に、低優先度タスクの共有データを効率的に配置することができる。たとえ、アクセス速度の速いメモリ領域(例えば、キャッシュL1$)に配置されても、高優先度タスクの共有データを配置する場合と異なり、低優先度タスクの共有データはロックされていないため、高優先度タスクの処理を邪魔するような事態を防ぐことができる。
(タスクテーブル作成処理)
図11は、タスクテーブル作成処理の手順を示すフローチャートである。図11のフローチャートは、マルチコアプロセッサシステム100によって実行させるアプリケーションを構成するタスクのシミュレーションを行い、シミュレーション結果に基づいて、タスクの優先度を表すタスクテーブル111を作成する手順を表している。図11の各処理を実行することによって、スケジューラ110が、各タスクの共有データを適切に配置するために必要な、タスクテーブル111を作成することができる。
図11において、スケジューラ110は、まず、実行対象の各タスク中の各データサイズの解析を行う(ステップS1101)。続いて、スケジューラ110は、各タスクのデッドライン解析を行う(ステップS1102)。さらに、スケジューラ110は、タスク間のデータ依存解析を行う(ステップS1103)。以上説明したステップS1101〜S1103によって、スケジューラ110は、各タスクの構成を特定するために必要なデータを取得できる。ステップS1101〜S1103によって取得されたデータは、タスクテーブル111に格納され、後述する優先度を設定するためのシミュレーションに利用される。
続いて、スケジューラ110は、各タスクの中に未シミュレーションの並列タスクが存在するか否かを判断する(ステップS1104)。ステップS1104において、未シミュレーションの並列タスクが存在すると判断された場合(ステップS1104:Yes)、スケジューラ110は、未シミュレーションの並列タスクのいずれか1組の並列タスクのシミュレーションを実行する(ステップS1105)。
その後、スケジューラ110は、依存解析のあるデータの更新頻度を測定し(ステップS1106)、依存関係のあるデータの更新頻度がしきい値よりも大きいか否かを判断する(ステップS1107)。ステップS1107は、優先度の設定が必要か否かを判断するための処理である。
ステップS1107において、依存関係のあるデータの更新頻度がしきい値よりも大きい場合(ステップS1107:Yes)、スケジューラ110は、タスクテーブル111に格納されているデッドラインを基に優先度を設定する(ステップS1108)。一方、依存関係のあるデータの更新頻度がしきい値よりも大きくはない場合(ステップS1107:No)、一旦キャッシュに格納されても更新頻度が低いため、スケジューラ110は、優先度を決定せずに、ステップS1109の処理に移行する。
次に、スケジューラ110は、処理中の並列タスクをシミュレーション済タスクに設定し(ステップS1109)、ステップS1104の処理に戻り、未シミュレーションの並列タスクが存在するか否かを判断する。
ステップS1104において、未シミュレーションの並列タスクが存在すると判断される限り、スケジューラ110は、ステップS1105〜S1109の処理によってシミュレーションを繰り返して、並列タスクの優先度を設定する。ステップS1104において、未シミュレーションの並列タスクが存在しないと判断されると(ステップS1104:No)、スケジューラ110は、すべての並列タスクのシミュレーションが終了したため、一連の処理を終了する。
以上説明したように、スケジューラ110は、図11の各処理を実行することによって、タスクテーブル111を作成することができる。なお、上述したタスクテーブル作成処理は、スケジューラ110が実行主体となっているが、他のコンパイラやシミュレータが実行主体となって事前に実行しておいてもよい。
例えば、ステップS1101〜S1103による解析は、一般的なコンパイラによって実行することができる。また、ステップS1101〜S1103による解析結果を利用したステップS1105におけるシミュレーションも、各タスクを実行した場合の実行時間や更新回数を見積もる公知のシミュレータによって実行することができる(例えば、特開2000−276381参照。)。
図12は、タスクテーブルのデータ構造例を示すデータテーブルである。また、図13は、タスクテーブルの設定例を示すデータテーブルである。図12のデータテーブル1200は、図11にて説明したタスクテーブル作成処理によって作成されたタスクテーブル111のデータ構造例を表している。
タスクテーブル111は、図12のデータテーブル1200のように、タスク情報を表す下記の情報群のフィールドと、共有データ情報を表す下記の情報群のフィールドとから構成されている。なお、タスクテーブル111のうち、タスク名、タスクID、デッドラインなど、値が空白のフィードは、タスク毎に異なる値が入力される。また、優先度やコヒーレンスモードなど、値が○/×のように二値となっているフィールドは、二値のいずれかの値が入力される。
<タスク情報>
・タスク名 :(タスクの名称)
・タスクID :(タスクの識別子)
・デッドライン :(ステップS1102の解析結果)
・優先度 :高/低(ステップS1108の設定内容)
・コヒーレンスモード :Write時更新/read時更新
・他のCPUへのfork:許可/不許可
<共有データ情報>
・共有データ名 :(データの名称)
・共有データID :(データのID)
・更新回数 :(ステップS1106の測定結果)
・配置されるキャッシュレベル:L1(キャッシュL1$)/L2(キャッシュL2$)
・データサイズ :(ステップS1101の解析結果)
上記のタスク情報のうち、コヒーレンスモード、他のCPUへのforkおよび配置されるキャッシュレベルは、タスク実行時に決定される。具体的には、コヒーレンスモード、他のCPUへのforkは、後述する図14〜17によって説明されるタスク実行処理によって決定される。また、配置されるキャッシュレベルは、上述の図10によって説明した共有データの配置処理によって決定される。なお、タスクテーブル111の具体的な数値が設定された、データテーブル1200を図13に例示している。
(タスク実行処理)
図14〜17は、タスク実行処理の手順を示すフローチャートである。図14〜17のフローチャートは、スケジューラ110が、実行対象となる並列タスクを各プロセッサに実行させる際の手順を表している。図14〜17の各処理を実行することによって、実行対象となる並列タスクは、タスクテーブル111に設定されている優先度や、実行中の他の並列タスクの優先度に応じたコヒーレンス手法に基づいて実行される。
図14において、スケジューラ110は、まず、実行対象のタスクにおいて状態遷移が発生したか否かを判断する(ステップS1401)。ステップS1401における状態遷移とは、「タスク生成」、「タスク終了」および「タスクスイッチ」を意味する。したがって、ステップS1401において、状態遷移が発生したと判断された場合、スケジューラ110は、さらに、上記の3種類の中のいずれの状態になったかを判断する。
ステップS1401において、スケジューラ110は、状態遷移が発生するまで待機状態となる(ステップS1401:Noのループ)。ステップS1401において、状態遷移のうち、タスク生成が発生したと判断された場合(ステップS1401:Yesタスク生成)、スケジューラ110は、実行対象のタスクが並列タスクか否かを判断する(ステップS1402)。
ステップS1402において、実行対象のタスクが並列タスクであると判断された場合(ステップS1402:Yes)、スケジューラ110は、新たに生成された並列タスクが、Masterスレッドか否かを判断する(ステップS1403)。Masterスレッドとは、優先的に実行されるスレッドである。
ステップS1403において、新たに生成された並列タスクが、Masterスレッドであると判断された場合(ステップS1403:Yes)、スケジューラ110は、さらに、新たに生成された並列タスクが、高優先度タスクか否かを判断する(ステップS1404)。ステップS1404において、高優先度タスクか否かは、タスクテーブル111を参照して判断することができる。
ステップS1404において、新たに生成された並列タスクが、高優先度タスクであると判断された場合(ステップS1404:Yes)、スケジューラ110は、さらに、CPUにおいて高優先度タスクを実行中か否かを判断する(ステップS1405)。
ステップS1405において、高優先度タスクを実行中であると判断された場合(ステップS1405:Yes)、スケジューラ110は、実行対象のタスクを実行に移すための準備処理を行う。すなわち、スケジューラ110は、実行中の並列タスクを、並列スレッドを実行中のCPUの中で負荷最小のCPUにmigration(データ移行)し、実行中に新たなスレッドの他のCPUへのfork(新たなスレッドのコピー生成)を禁止する(ステップS1406)。
さらに、スケジューラ110は、ステップS1406において、migrationしたタスクの共有データを配置したキャッシュ領域を、ロックする(ステップS1407)。そして、スケジューラ110は、migrationしたタスクを逐次実行し(ステップS1408)、新たに生成された並列タスクにおいてスレッドの他のCPUへのforkを禁止し、負荷最小のCPUに割り当てる(ステップS1409)。
その後、スケジューラ110は、新たに生成された並列タスクの共有データを配置したキャッシュ領域をロックし、タスクの実行を開始する(ステップS1410)。ステップS1410の処理が終了すると、スケジューラ110は、ステップS1401の処理に戻り、新たに状態遷移が発生するまで待機状態となる。
また、ステップS1403において、新たに生成された並列タスクがMasterスレッドではないと判断された場合(ステップS1403:No)、スケジューラ110は、スレッドのforkが禁止されているか否かを判断する(ステップS1411)。ステップS1403において、判断基準となっているスレッドとは、新たに生成されたタスクを構成するスレッドである。
ステップS1403において、新たに生成されたタスクのスレッドのforkが禁止されていると判断された場合(ステップS1411:Yes)、スケジューラ110は、新たに生成されたタスクをMasterスレッドが実行されるCPUと同じCPUにキューイングする(ステップS1412)。ステップS1412の処理によってキューイングされたタスクは、キューイング先のCPUによって、現在実行中のタスクの終了後に実行される。スケジューラ110は、ステップS1412の処理が終了すると、ステップS1401の処理に戻り、新たに状態遷移が発生するまで待機状態となる。
また、スケジューラ110は、新たに生成されたタスクが並列タスクではないと判断された場合(ステップS1402:No)、または、スレッドのforkが禁止されていないと判断された場合(ステップS1411:No)、タスクを負荷最小のCPUにキューイングする(ステップS1413)。ステップS1413によってキューイングされるタスクは、ステップS1401によって新たに生成されたと判断されたタスクである。スケジューラ110は、ステップS1413の処理が終了すると、ステップS1401の処理に戻り、新たに状態遷移が発生するまで待機状態となる。
図15のフローチャートは、ステップS1401において、タスク終了が発生したと判断された場合(1401:Yesタスク終了)と、タスクスイッチが発生したと判断された場合(ステップS1401:Yesタスクスイッチ)とにおけるスケジューラ110の処理を表している。
図15において、スケジューラ110は、まず、ステップS1401において、タスク終了が発生したと判断された場合(1401:Yesタスク終了)、ロックしていた並列タスクの共有データを配置したキャッシュ領域を、開放する(ステップS1501)。
その後、スケジューラ110は、実行待ちのタスクがあるか否かを判断する(ステップS1502)。ステップS1502において、実行待ちのタスクがあると判断された場合(ステップS1502:Yes)、スケジューラ110は、ステップS1503に移行して、実行待ちのタスクを実行するための処理を行う。一方、ステップS1502において、実行待ちのタスクがないと判断された場合(ステップS1502:No)、スケジューラ110は、図14のステップS1401の処理に戻り、次の状態遷移が発生するまで待機状態となる。
一方、ステップS1401において、タスクスイッチが発生したと判断された場合(1401:Yesタスクスイッチ)、スケジューラ110は、タスクの実行権を渡すのが低優先度の並列タスクか否かを判断する(ステップS1503)。なお、ステップS1502において、実行待ちのタスクがあると判断された場合(ステップS1502:Yes)も、スケジューラ110は、ステップS1503の判断処理を行う。
ステップS1503において、タスクの実行権を渡すのが低優先度の並列タスクであると判断された場合(ステップS1503:Yes)、スケジューラ110は、低優先度の並列タスクを実行する際のキャッシュコヒーレンス方式を採用する。すなわち、スケジューラ110は、CPUのキャシュコヒーレンス方式を、他のCPUがデータにアクセスしたときにスヌープ機構が動作するモードに設定する(ステップS1504)。
ステップS1503において、タスクの実行権を渡すのが低優先度の並列タスクではないと判断された場合(ステップS1503:No)、または、ステップS1504の処理が終了すると、スケジューラ110は、実行対象となるタスクの実行を開始する(ステップS1505)。ステップS1505によってタスクが実行されると、スケジューラ110は、ステップS1401の処理に戻り、次のタスクの状態遷移が発生するまで待機状態となる。
図16のフローチャートは、ステップS1404において、新たに生成された並列タスクが、高優先度タスクではないと判断された場合(ステップS1404:No)のスケジューラ110の処理を表している。
図16において、スケジューラ110は、まず、ステップS1404にて新たに生成された並列タスクが、高優先度タスクではないと判断された場合(ステップS1404:No)、高優先度タスクを実行中か否かを判断する(ステップS1601)。なお、ステップS1601では、新たに生成されたタスクを実行させるCPUにおいて、現在、高優先度タスクが実行されているか否かを判断する。
ステップS1601において、高優先度タスクを実行中であると判断された場合(ステップS1601:Yes)、スケジューラ110は、低優先度の並列タスクを実行する際のキャッシュコヒーレンス方式を採用する。すなわち、スケジューラ110は、実行中の並列タスクのキャシュコヒーレンス方式を、他のCPUがデータにアクセスするときにスヌープ120のスヌープ機構が動作するモードに設定する(ステップS1602)。
その後、スケジューラ110は、実行対象となるタスクを負荷最小のCPUにキューイングして(ステップS1603)、ステップS1401の処理に移行する。ステップS1603において、キューイングされたタスクは、現在実行中のタスクが終了した後、実行される。負荷最小のCPUとは、キューイング済のタスクの処理量が最小のCPUを意味する。なお、ステップS1401に移行したスケジューラ110は、次に遷移状態が発生するまで待機状態となる。
ステップS1601において、高優先度タスクを実行中ではないと判断された場合(ステップS1601:No)、スケジューラ110は、高優先度の並列タスクを実行する際のキャッシュコヒーレンス方式を採用する。すなわち、スケジューラ110は、実行中の並列タスクを、並列タスクに含まれる並列スレッドを実行中の他のCPUの中で負荷最小のCPUにmigrationし、実行中に並列タスクに含まれる新たなスレッドの他のCPUへのforkを禁止する(ステップS1604)。
さらに、スケジューラ110は、ステップS1604において、migrationしたタスクを逐次実行させる(ステップS1605)。そして、スケジューラ110は、新たに生成された並列タスクにおいて、並列タスクに含まれるスレッドの他のCPUへのforkを禁止し、負荷最小のCPUにキューイングする(ステップS1606)。
ステップS1606によって、キューイングされたタスクは、現在実行中のタスクが終了した後、実行される。また、ステップS1606が終了すると、スケジューラ110は、ステップS1401の処理に移行して、新たな状態遷移が発生するまで待機状態となる。
図17のフローチャートは、ステップS1405において、新たに生成された並列タスクが、高優先度タスクを実行中ではないと判断された場合(ステップS1405:No)のスケジューラ110の処理を表している。
図17において、スケジューラ110は、まず、ステップS1405にて対象となるCPUが高優先度タスクを実行中ではないと判断された場合(ステップS1405:No)、新たに生成されたタスクを負荷最小のCPUに割り当てる(ステップS1701)。
そして、スケジューラ110は、新たに生成された並列タスクが逐次実行ではデッドライン制約を満たさないか否かを判断する(ステップS1702)。ステップS1702において、スケジューラ110は、タスクテーブル111に設定されているデッドライン制約に基づいてデットライン制約を満たさないか否かの判断を行う。
ステップS1702において、デッドライン制約を満たさないと判断された場合(ステップS1702:Yes)、スケジューラ110は、さらに、現在低優先度の並列タスクを実行中か否かを判断する(ステップS1703)。
ステップS1703において、低優先度の並列タスクが実行中と判断された場合(ステップS1703:Yes)、スケジューラ110は、低優先度の並列タスクを実行する際のキャッシュコヒーレンス方式を採用する。すなわち、スケジューラ110は、実行中の並列タスクのコヒーレンス方式を、他のCPUがデータにアクセスした時にスヌープ機構が動作するモードに設定する(ステップS1704)。
ステップS1704の処理が終了すると、スケジューラ110は、新たに生成された並列タスクの共有データを配置したキャシュ領域をロックする(ステップS1705)。また、ステップS1703において、低優先度の並列タスクを実行中ではないと判断された場合(ステップS1703:No)、スケジューラ110は、通常のコヒーレンス方式を採用するため、ステップS1704の処理を行わずに、ステップS1705の処理に移行する。
ステップS1705の処理が終了すると、スケジューラ110は、新たに生成された並列タスクの実行を開始させ(ステップS1706)、ステップS1401の処理に戻り、次のタスクの状態遷移が発生するまで待機状態となる。
一方、ステップS1702において、デッドライン制約を満たすと判断された場合(ステップS1702:No)、スケジューラ110は、新たに生成された並列タスクの共有データを配置したキャッシュ領域を、ロックする(ステップS1707)。
そして、スケジューラ110は、新たに生成された並列タスクの逐次実行を開始させる(ステップS1708)。その後、スケジューラ110は、ステップS1401の処理に戻り、次のタスクの状態遷移が発生するまで待機状態となる。
以上説明したように、スケジューラ110は、並列タスクとして特定された各タスクにそれぞれ、どのような優先度(高優先度/低優先度)が設定されているか、さらに、並列タスク同士が同一の優先度であるかに応じて、最適なCPUに実行されるようにスケジューリングすることができる。また、スケジューラ110は、各タスクの優先度に応じて共有データのキャッシュコヒーレンス方式を設定するため、キャッシュメモリ(キャッシュL1$)の利用効率の低下を防ぐことができる。
(適用例)
次に、本実施の形態にかかるスケジューリング処理を通信機器に適用させた場合の動作例について説明する。具体的には、スマートフォンなどの携帯型の通信機器と、サーバなどの固定型の通信機器とによってそれぞれ実行される並列タスクについて説明する。
<同一優先度の並列タスクの場合>
図18は、同一優先度の並列タスクの実行例を示す説明図である。図18では、スマートフォン1801は、他のスマートフォン1802とWLAN(Wireless LAN)の規格に準拠した通信を行っている。さらに、スマートフォン1801は、サーバ1803ともLTE(Long Term Evolution)の規格に準拠した通信を行っている。
WLANの規格に沿ったタスク(WLAN#0,1)と、LTEの規格に沿ったタスク(LTE#0,1)は、共にリアルタイム制約があるため高優先度タスクとなる。したがって、スマートフォン1801は、WLAN#0,1およびLTE#0,1を、同一優先度の並列タスクとして実行する。スマートフォン1801のスヌープ120では、同一優先度の並列タスクが実行されるため、通常のキャッシュコヒーレンシを行うスヌープ方式が採用される。
<優先度の異なる並列タスクの場合>
図19は、優先度の異なる並列タスクの実行例を示す説明図である。図19では、スマートフォン1801が、サーバ1803とLTEの規格に準拠した通信を行っている。また、スマートフォン1801では、通信を必要としないドライバのアプリケーションについてのタスク(driver#0,1)が実行されている。
スマートフォン1801によって実行されているドライバのアプリケーションは、リアルタイム制約が設けられていないため、低優先度タスクとなる。したがって、スマートフォン1801は、LTE#0,1を、高優先度の並列タスクとして実行し、driver#0,1を、低優先度の並列タスクとして実行する。優先度の異なる並列タスクが実行されるため、スマートフォン1801のスヌープ120では、LTE#0,1に対して低優先度並列タスクにおけるキャッシュコヒーレンシを行うスヌープ方式が採用される。
以上説明したように、マルチコアプロセッサシステム、マルチコアプロセッサシステムの制御方法および制御プログラムによれば、利用頻度の高い共有データを、アクセス速度の速いキャッシュメモリに優先的に配置するため、処理速度を向上させることができる。
また、低優先度に設定された処理の共有データの場合、CPUからのアクセス要求が発生するまで、キャッシュコヒーレンシによる同期処理を延期する。すなわち、再利用性のない共有データをキャッシュメモリに書き込むといった、マルチコアプロセッサシステムの処理性能の低下の原因となる処理を回避することができる。したがって、並列処理およびマルチタスク処理が実行される場合であっても、キャッシュの利用効率を高めてマルチコアプロセッサシステムの処理能力を向上させることができる。
また、高優先度タスクがなく、キャッシュメモリに空き領域がある場合には、低優先度タスクの共有データを、各CPUのキャッシュメモリに配置してもよい。したがって、高優先後タスクが存在しない場合であっても、キャッシュメモリを効率的に利用させることができる。
さらに、キャッシュメモリに配置した高優先度タスクの実行時にアクセスされる共有データは、高優先度タスクが終了するまでロックされるように設定してもよい。共有データをロックすることによって、タスクスイッチが発生しても、他のタスクの共有データによって高優先度タスクの共有データが書き換えられてしまうような事態を防ぎ、高優先度タスクを効率的に実行させることができる。
また、高優先度タスクが実行時にアクセスする共有データが、キャッシュメモリの容量よりも大きく、キャッシュメモリに配置しきれない場合には、キャッシュメモリ以外のメモリ領域のうち、アクセス速度の速いメモリ領域に共有データを配置してもよい。また、共有メモリを配置する際に、複数のメモリ領域が存在する場合には、アクセス速度の早いメモリから順番に共有データを配置する。したがって、高優先度タスクの共有データを優先的にアクセス速度の速いメモリ領域に配置するため、効率的な処理を期待することができる。
さらに、高優先度タスクが実行時にアクセスする共有データが、キャッシュメモリの容量よりも小さく、キャッシュメモリに余裕がある場合には、余った領域に低優先度タスクの共有データを配置してもよい。余った領域に低優先度タスクの共有データを配置することによって、キャッシュメモリの空き容量を防ぎ、高い利用効率を維持することができる。
また、各CPUのキャシュメモリの他のメモリ領域として、複数のメモリ領域が用意されている場合には、アクセス速度の速いメモリ領域から順番に共有データを配置してもよい。優先度にかかわらず、各タスクの共有データをアクセス速度の速いメモリ領域に優先的に配置することによって、各タスクを効率的に実行させることができる。
さらに、実行対象となるタスクの中から並列タスクを抽出して、同一のプロセッサに割り当ててもよい。さらに、並列タスクのうち優先度も同一の並列タスクを抽出して同一のプロセッサに割り当ててもよい。優先度が同一の並列タスクが同一のプロセッサに割り当てられることによって、一旦キャシュメモリに配置した共有データを効率的に利用することができる。
なお、本実施の形態で説明したマルチコアプロセッサシステムの制御方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーションなどのコンピュータで実行することにより実現することができる。本マルチコアプロセッサシステムの制御プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVDなどのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本マルチコアプロセッサシステムの制御プログラムは、インターネットなどのネットワークを介して配布してもよい。