(57)【特許請求の範囲】
【請求項１】
マルチコアプロセッサのうちの一のコアから前記マルチコアプロセッサで共有する共有資源へのアクセスのアクセス量が所定量以上のときに、前記マルチコアプロセッサのうちの前記一のコアを除く他のコアから前記共有資源へのアクセスの前処理を検出する検出手段と、
前記検出手段により前記前処理が検出された場合、前記他のコアで実行中のタスクを他のタスクに切り替える制御手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
【請求項２】
マルチコアプロセッサのうちの一のコアから前記マルチコアプロセッサで共有する共有資源へのアクセスのアクセス量が所定量以上のときに、前記マルチコアプロセッサのうちの前記一のコアを除く他のコアから前記共有資源へのアクセスの前処理を検出する検出手段と、
前記検出手段により前記前処理が検出された場合、前記他のコアで実行中のタスクをストールさせる制御手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
【請求項３】
マルチコアプロセッサのうちの一のコアに、
前記マルチコアプロセッサのうちの前記一のコアを除く他のコアから前記マルチコアプロセッサで共有する共有資源へのアクセスのアクセス量が所定量以上のときに、前記一のコアから前記共有資源へのアクセスの前処理を検出する検出工程と、
前記検出工程により前記前処理が検出された場合、前記一のコアで実行中のタスクを他のタスクに切り替える制御工程と、
を実行させることを特徴とする制御プログラム。
【請求項４】
マルチコアプロセッサのうちの一のコアに、
前記マルチコアプロセッサのうちの前記一のコアを除く他のコアから前記マルチコアプロセッサで共有する共有資源へのアクセスのアクセス量が所定量以上のときに、前記一のコアから前記共有資源へのアクセスの前処理を検出する検出工程と、
前記検出工程により前記前処理が検出された場合、前記一のコアで実行中のタスクをストールさせる制御工程と、
を実行させることを特徴とする制御プログラム。
【請求項５】
マルチコアプロセッサのうちの一のコアが、
前記マルチコアプロセッサのうちの前記一のコアを除く他のコアから前記マルチコアプロセッサで共有する共有資源へのアクセスのアクセス量が所定量以上のときに、前記一のコアから前記共有資源へのアクセスの前処理を検出する検出工程と、
前記検出工程により前記前処理が検出された場合、前記一のコアで実行中のタスクを他のタスクに切り替える制御工程と、
を実行することを特徴とする制御方法。
【請求項６】
マルチコアプロセッサのうちの一のコアが、
前記マルチコアプロセッサのうちの前記一のコアを除く他のコアから前記マルチコアプロセッサで共有する共有資源へのアクセスのアクセス量が所定量以上のときに、前記一のコアから前記共有資源へのアクセスの前処理を検出する検出工程と、
前記検出工程により前記前処理が検出された場合、前記一のコアで実行中のタスクをストールさせる制御工程と、
を実行することを特徴とする制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、共有資源へのアクセスを制御するマルチコアプロセッサシステム、制御プログラム、および制御方法に関する。
【背景技術】
【０００２】
従来該実行終了時に大量のメモリアクセスを行うタスクが知られている。たとえば、レンダリングの処理に関するタスクが挙げられる（たとえば、下記特許文献１を参照。）。レンダリング処理とは、たとえば、３次元物体に対してカメラや光源の位置や方向を指定し、光の物理的な性質に基づいて描画を行うことである。【０００３】
マルチコアプロセッサで共有する共有メモリを有するマルチコアプロセッサシステムにおいては、たとえば、レンダリング処理を複数のタスクに分割して分散処理を行う。また、該マルチコアプロセッサシステムでは、該各タスクの処理終了時に各ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）のキャッシュに格納している演算結果を共有メモリに書き戻す処理が必要になる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００８−１３００９１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、マルチコアプロセッサシステムでは、上述したレンダリング処理の複数のタスクが負荷分散を考慮してタスク量が平均化されるように各ＣＰＵに割り当てられる。そのため、各ＣＰＵの処理が同時に終了することになるため、該タスクの処理終了時に共有メモリへのアクセスが複数のＣＰＵで競合する。【０００６】
共有メモリへのアクセスが複数のＣＰＵで同時に発生した場合、どのＣＰＵからのアクセスを許可するかを調停回路が調停する。調停回路は、たとえば、各ＣＰＵに順番にアクセス権を与えるラウンドロビン方式を用いて調停している。調停回路が共有メモリへのアクセスを調停することにより、該共有メモリのアクセスが競合した際のメモリアクセス性能はピーク時の３０［％］になることもあるため、各ＣＰＵの実行性能が低下する問題点があった。メモリアクセス性能とは、各ＣＰＵが共有メモリへのアクセスにかかるアクセス時間である。【０００７】
本発明は、上述した従来技術による問題点を解消するため、共有メモリへのアクセス時間を減少させることで、ＣＰＵの実行性能を向上させることができるマルチコアプロセッサシステム、制御プログラム、および制御方法を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一の観点によれば、マルチコアプロセッサのうちの一のコアが前記マルチコアプロセッサで共有する共有資源へアクセスしているときに、前記マルチコアプロセッサのうちの前記一のコアを除く他のコアから前記共有資源へのアクセスの前処理を検出し、前記前処理が検出された場合、前記他のコアで実行中のタスクを他のタスクに切り替えるマルチコアプロセッサシステム、制御プログラム、および制御方法が提供される。【０００９】
本発明の他の観点によれば、マルチコアプロセッサのうちの一のコアが前記マルチコアプロセッサで共有する共有資源へアクセスしているときに、前記マルチコアプロセッサのうちの前記一のコアを除く他のコアから前記共有資源へのアクセスの前処理を検出し、前記前処理が検出された場合、前記他のコアで実行中のタスクをストールさせるマルチコアプロセッサシステム、制御プログラム、および制御方法が提供される。
【発明の効果】
【００１０】
本マルチコアプロセッサシステム、制御プログラム、および制御方法によれば、共有メモリへのアクセス時間を減少させることで、ＣＰＵの実行性能を向上させることができるという効果を奏する。
【図面の簡単な説明】
【００１１】
【図１】本発明の一の例を示す説明図である。
【図２】本発明の他の一例を示す説明図である。
【図３】マルチコアプロセッサシステムのハードウェア例を示すブロック図である。
【図４】属性テーブル４００の一例を示す説明図である。
【図５】大量アクセス開始情報５００の一例を示す説明図である。
【図６】マルチコアプロセッサシステム３００の機能ブロック図である。
【図７】タスク２がＣＰＵ＃０にディスパッチされる例を示す説明図である。
【図８】タスク５がＣＰＵ＃１にディスパッチされる例を示す説明図である。
【図９】タスク７がＣＰＵ＃２にディスパッチされる例を示す説明図である。
【図１０】ＣＰＵ＃０が大量アクセスを開始する例を示す説明図である。
【図１１】ＣＰＵ＃１での大量アクセスの検出例を示す説明図である。
【図１２】ＣＰＵ＃１でタスクディスパッチを行う例を示す説明図である。
【図１３】スケジューラ３５１による制御処理手順の一例を示すフローチャート（その１）である。
【図１４】スケジューラ３５１による制御処理手順の一例を示すフローチャート（その２）である。
【図１５】属性チェンジャー３７１による制御処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１２】
以下に添付図面を参照して、本発明にかかるマルチコアプロセッサシステム、制御プログラム、および制御方法の好適な実施の形態を詳細に説明する。
【００１３】
図１は、本発明の一の例を示す説明図である。一のＣＰＵではタスクＡが実行中であり、他のＣＰＵではタスクＢが実行中である。他のＣＰＵのレディーキュー１２１にはタスクＣが積まれている。レディーキュー１２１は、周知のように他のＣＰＵに割り当てられたタスクのうち、実行可能状態であるタスクを管理するために該タスクのコンテキスト情報を保持する。他のＣＰＵは、レディーキュー１２１に登録されているタスクのコンテキスト情報を取り出すことで、該取り出したタスクを実行することができる。コンテキスト情報はプログラムの内部状態やプログラムがメモリ上のどこに配置されたかを示す情報である。
【００１４】
テーブル１０１はタスクＩＤの項目１０２と命令アドレスの項目１０３とを有している。テーブル１０１では、タスクごとに一のＣＰＵと他のＣＰＵとで共有する共有メモリへのアクセスを行う命令アドレスが保持されている。ここでは、一のＣＰＵと他のＣＰＵとのマルチコアプロセッサで共有する共有資源の一例として、共有メモリを挙げる。
【００１５】
また、アクセスフラグはいずれのＣＰＵが共有メモリへ先にアクセスしたかを示す情報である。たとえば、アクセスフラグの値が０の場合、一のＣＰＵが共有メモリへアクセスしていることを示す。アクセスフラグの値が０であることを、アクセスフラグの値が一のＣＰＵを示す値と称する。たとえば、アクセスフラグの値が１の場合、他のＣＰＵが共有メモリへアクセスしていることを示す。アクセスフラグの値が１であることを、アクセスフラグの値が他のＣＰＵを示す値と称する。たとえば、アクセスフラグの値が−の場合、一のＣＰＵと他のＣＰＵとのいずれのＣＰＵも共有メモリへアクセスしていないことを示す。
【００１６】
まず、一のＣＰＵが、たとえば、テーブル１０１に保持されているタスクＡが共有メモリへのアクセスを行う命令アドレスと一のＣＰＵのプログラムカウンタとの一致を該アクセスの前処理として検出する。そして、一のＣＰＵがアクセスフラグを確認することにより、アクセスフラグの値が−であるか否かを判断する。アクセスフラグの値は−であるため、一のＣＰＵがアクセスフラグを０に設定する。
【００１７】
つぎに、他のＣＰＵが、たとえば、テーブル１０１に保持されているタスクＢが共有メモリへのアクセスを行う命令アドレスと他のＣＰＵのプログラムカウンタとの一致を該アクセスの前処理として検出する。そして、他のＣＰＵがアクセスフラグを確認することにより、アクセスフラグの値が−であるか否かを判断する。アクセスフラグの値は０であるため、他のＣＰＵが共有メモリへ一のＣＰＵがアクセス中であると判断し、他のＣＰＵがタスクＢからレディーキュー１２１内のタスクＣへ切り替える。
【００１８】
そして、タスクＡの実行が終了すると、一のＣＰＵがアクセスフラグの値を−に設定する。つぎに、タスクＣの実行が終了すると、他のＣＰＵがレディーキュー１２１からタスクＢを取り出して実行する。そして、他のＣＰＵが、タスクＢのプログラムカウンタとテーブル１０１に保持されているタスクＢが共有メモリへのアクセスを行う命令アドレスとの一致を該アクセスの前処理として検出する。
【００１９】
そして、前処理が検出されると、他のＣＰＵがアクセスフラグを確認することにより、アクセスフラグの値が−であるか否かを判断する。さらに、アクセスフラグの値が−であるため、他のＣＰＵがアクセスフラグを１に設定し、タスクＢに共有メモリへのアクセスを開始させる。
【００２０】
図２は、本発明の他の一例を示す説明図である。まず、一のＣＰＵが、テーブル１０１に保持されているタスクＡが共有メモリへのアクセスを行う命令アドレスと一のＣＰＵのプログラムカウンタとの一致を該アクセスの前処理として検出する。そして、一のＣＰＵがアクセスフラグを確認し、アクセスフラグの値が−であるか否かを判断する。アクセスフラグの値が−であるため、一のＣＰＵが、アクセスフラグを０に設定する。
【００２１】
つぎに、他のＣＰＵが、テーブル１０１に保持されているタスクＢが共有メモリへのアクセスを行う命令アドレスと他のＣＰＵのプログラムカウンタとの一致を該アクセスの前処理として検出する。そして、他のＣＰＵがアクセスフラグを確認することにより、アクセスフラグの値が−であるか否かを判断する。アクセスフラグの値は０であるため、他のＣＰＵが共有メモリへ一のＣＰＵがアクセス中であると判断し、タスクＢをストールさせる。
【００２２】
そして、タスクＡの実行が終了すると、一のＣＰＵがアクセスフラグの値を−に設定する。図示しないが、たとえば、他のＣＰＵが、該タスクＡの実行の終了を検出し、タスクＢを復帰させてもよい。または、たとえば、他のＣＰＵが、あらたに他のタスクが割り当てられた場合に、タスクＢを復帰させて、レディーキューに登録させてもよい。
【００２３】
また、図１および図２で示したテーブル１０１ではタスクごとに１つの命令アドレスのみを保持しているため、該命令アドレスからタスクが終了するまでの区間のみに着目している。すなわち、ここでは、該命令アドレスで実行される処理からタスクが終了するまでを１つのアクセスとしている。これに限らず、たとえば、タスクＡの共有メモリへの各アクセスの開始命令アドレスから該アクセスの終了命令アドレスまでをテーブル１０１に登録してもよい。すなわち、該開始命令アドレスで実行される処理から該終了命令アドレスで実行される処理までが１つのアクセスとする。そして、一のＣＰＵで実行するタスクＡの共有メモリへのアクセスごとに他のＣＰＵで実行するタスクＢの共有メモリへのアクセスが競合しないように、一のＣＰＵがアクセスフラグを立ててもよい。
【００２４】
本実施の形態では、アクセス量が所定量以上であるアクセスが複数のＣＰＵで競合しない例を示す。アクセス量が所定量以上であるアクセスとは、アクセス密度（単位時間あたりのメモリアクセス回数）が一定の閾値を超えるアクセスを示している。アプリケーションの設計者が、アクセス密度を変化させて、アクセスが競合する場合のアクセス時間とアクセスが競合しない場合のアクセス時間とを測定する。
【００２５】
そして、アクセスが競合しない場合（タスクが順次メモリへアクセス）のアクセス時間が、アクセスが競合する場合のアクセス時間よりも小さくなるアクセス量を所定アクセス量（閾値）とする。また、各タスクの所定アクセス量以上となるアクセスについては測定済であるとして説明する。ここで、タスク処理中でメモリへのアクセス密度が所定アクセス量を超えるアクセスを大量アクセスと称する。
【００２６】
ここで、アクセス競合がある場合とアクセス競合が無い場合とでアクセス時間を比較する。アクセス競合時のメモリアクセス性能はアクセス競合が無い場合と比較して約３０［％］に低下すると言われている。上述のようにアクセスが複数のＣＰＵで競合すると、調停回路がアクセス権を調停する。よって、アクセス競合がある場合、調停時間やアクセス権の切り替えなどによって、アクセス時間が長くなる。
【００２７】
アクセス競合が無い場合の単位時間当たりのアクセスデータサイズをＸとする。アクセス競合時のメモリアクセス性能はアクセス競合がない場合と比較して約３０％に低下すると言われていることを考慮すると、アクセス競合時の単位時間当たりのアクセスデータサイズは０．３Ｘとなる。一のＣＰＵと他のＣＰＵとのそれぞれのＣＰＵがＹサイズのデータアクセスに要する時間は下記となる。
・アクセス競合が無い場合（順次メモリアクセスを行う場合）：時間Ｓ＝Ｙ／Ｘ＋Ｙ／Ｘ＝２Ｙ／Ｘ
・アクセス競合がある場合（同時にメモリアクセスを行う場合）：時間Ｐ＝Ｙ／０．３Ｘ＝３．３Ｙ／Ｘ
【００２８】
すなわち、アクセス競合がある場合のアクセス時間はアクセス競合が無い場合のアクセス時間と比較して１．６５倍（Ｐ／Ｓ）である。
【００２９】
（マルチコアプロセッサシステムのハードウェア）
図３は、マルチコアプロセッサシステムのハードウェア例を示すブロック図である。マルチコアプロセッサシステム３００は、ＣＰＵ＃０〜ＣＰＵ＃２と、共有メモリ３０３と、スヌープコントローラ３０１と、を有している。
【００３０】
ここで、ＣＰＵ＃０〜ＣＰＵ＃２では、たとえば、それぞれコアとレジスタとキャッシュとを有している。ＣＰＵ＃０のレジスタ３１１はＰＣ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）３３１を有し、ＣＰＵ＃１のレジスタ３１２はＰＣ３３２を有し、ＣＰＵ＃２のレジスタ３１３はＰＣ３３３を有している。
【００３１】
ＣＰＵ＃０はマスタＯＳであるＯＳ３４１を実行し、マルチコアプロセッサシステム３００の全体の制御を司る。ＯＳ３４１は、ソフトウェアの各プロセスをどのＣＰＵに割り当てるかを制御し、かつＣＰＵ＃０でのタスクの切り替えを制御する制御プログラムであるスケジューラ３５１を有している。レディーキュー３６１は、ＣＰＵ＃０に割り当てられタスクのうち、実行待ち状態であるタスクのコンテキスト情報を保持する。
【００３２】
ＣＰＵ＃１とＣＰＵ＃２とは、それぞれスレーブＯＳであるＯＳ３４２とＯＳ３４３とを実行している。ＯＳ３４２は、ＣＰＵ＃１に割り当てられたタスクの切り替えを制御する制御プログラムであるスケジューラ３５２を有している。レディーキュー３６２は、ＣＰＵ＃１に割り当てられたタスクのうち、実行待ち状態であるタスクのコンテキスト情報を保持する。ＯＳ３４３は、ＣＰＵ＃２に割り当てられたタスクの切り替えを制御する制御プログラムであるスケジューラ３５３を有している。レディーキュー３６３は、ＣＰＵ＃２に割り当てられタスクのうち、実行待ち状態であるタスクのコンテキスト情報を保持する。
【００３３】
また、ＣＰＵ＃０はキャッシュ３２１を有し、ＣＰＵ＃１はキャッシュ３２２を有し、ＣＰＵ＃２はキャッシュ３２３を有している。各キャッシュはスヌープコントローラ３０１を介して接続されている。各ＣＰＵのキャッシュが該キャッシュ自身および他のコアのキャッシュのラインの状態を監視し、他のコアのキャッシュと更新状態の情報を交換することにより、アクセスフラグのような共有データの更新を検出する。各キャッシュは更新を検出すると、スヌープコントローラ３０１を介して、未更新のデータをパージし、更新されたデータをキャッシュする。
【００３４】
各キャッシュが有しているアクセスフラグは各キャッシュで共有の共有データであり、アクセスフラグはいずれのＣＰＵが共有メモリ３０３へ先にアクセスしたかを示す情報である。たとえば、アクセスフラグが０の場合、ＣＰＵ＃０が共有メモリ３０３へ大量アクセスしていることを示す。アクセスフラグの値が０であることを、アクセスフラグの値がＣＰＵ＃０を示す値と称する。たとえば、アクセスフラグが１の場合、ＣＰＵ＃１が共有メモリ３０３へ大量アクセスしていることを示す。アクセスフラグの値が１であることを、アクセスフラグの値がＣＰＵ＃１を示す値と称する。アクセスフラグが２の場合、ＣＰＵ＃２が共有メモリ３０３へ大量アクセスしていることを示す。アクセスフラグの値が２であることを、アクセスフラグの値がＣＰＵ＃２を示す値と称する。アクセスフラグの値が−の場合、いずれのＣＰＵも共有メモリ３０３へアクセスしていないことを示す。
【００３５】
また、各ＣＰＵと共有メモリ３０３とは、バス３０２を介して接続されている。共有メモリ３０３は、たとえば、マルチコアプロセッサに共有されるメモリである。共有メモリ３０３は、たとえば、属性テーブル４００と、タスクテーブル３８１と、大量アクセス開始情報５００と、ブートプログラムと、アプリケーションソフトウェアと、ＯＳ３４１〜ＯＳ３４３と、を有している。
【００３６】
共有メモリ３０３は、具体的には、たとえば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）と、フラッシュＲＯＭなどを有している。たとえば、フラッシュＲＯＭがブートプログラムを記憶し、ＲＯＭがアプリケーションソフトウェアを記憶し、ＲＡＭがＣＰＵ＃０〜ＣＰＵ＃２のワークエリアとして使用される。共有メモリ３０３に記憶されているプログラムは、各ＣＰＵにロードされることで、コーディングされている処理を該各ＣＰＵに実行させることとなる。
【００３７】
タスクテーブル３８１とは、ソフトウェアのプロセスや関数がどのＣＰＵに割り当てられているか、各ＣＰＵがどのソフトウェアのプロセスや関数を実行中であるかを示す情報である。
【００３８】
図４は、属性テーブル４００の一例を示す説明図である。属性テーブル４００では、各タスクの属性について記述されている。属性テーブル４００では、タスクＩＤの項目４０１と、属性の項目４０２と、を有している。タスクＩＤの項目４０１にはタスクの名称が保持され、属性の項目４０２には各タスクの属性が保持されている。ここで、属性の項目４０２には、アクセスか通常のいずれかが保持される。アクセスとは、タスクが共有メモリ３０３へ大量にアクセスしている状態を示し、通常とは、タスクが共有メモリ３０３へ大量にアクセスしていない状態を示す。
【００３９】
また、タスクＩＤの項目４０１にタスクの名称が保持されていないタスクは属性が未付加なタスクとする。本実施の形態では、タスクはタスク１〜タスク９までとすると、タスク１〜６およびタスク９は属性が付加されているタスクであり、タスク７およびタスク８は属性が未付加なタスクである。
【００４０】
図５は、大量アクセス開始情報５００の一例を示す説明図である。大量アクセス開始情報５００は、大量アクセス状態に遷移する命令アドレスをタスクのタスクＩＤごとに保持するテーブルである。
【００４１】
大量アクセス開始情報５００は、タスクＩＤの項目５０１と、開始アドレスの項目５０２とを有している。タスクＩＤの項目５０１にはタスクの名称が保持される。開始アドレスの項目５０２には大量アクセス状態に遷移する命令アドレスが保持される。
【００４２】
（マルチコアプロセッサシステム３００の機能ブロック図）
図６は、マルチコアプロセッサシステム３００の機能ブロック図である。マルチコアプロセッサシステム３００は、検出部６０１と、検出部６０２と、検出部６０３と、制御部６１１と、制御部６１２と、制御部６１３と、を有している。
【００４３】
検出部６０１と検出部６０２と検出部６０３とは後述する属性チェンジャーと称するプログラムとして記憶装置内に記憶されている。該各ＣＰＵが該属性チェンジャーを記憶装置からロードし、該属性チェンジャー内にコーディングされている処理を実行する。
【００４４】
制御部６１１と制御部６１２と制御部６１３とは、それぞれスケジューラ３５１と、スケジューラ３５２と、スケジューラ３５３として記憶装置内に記憶されている。該各ＣＰＵが各スケジューラを記憶装置からロードし、スケジューラ内にコーディングされている処理を実行する。ここでは、ＣＰＵ＃０上で動作する検出部６０１と制御部６１１を例に挙げて説明する。
【００４５】
検出部６０１は、マルチコアプロセッサのうちの該検出部６０１を実行するＣＰＵ＃０を除く他のコアがマルチコアプロセッサで共有する共有資源へアクセスしているときに、ＣＰＵ＃０から共有資源へのアクセスの前処理を検出する。
【００４６】
制御部６１１は、検出部６０１により前処理が検出された場合、ＣＰＵ＃０で実行中のタスクを他のタスクに切り替える。
【００４７】
また、制御部６１１は、検出部６０１により前処理が検出された場合、ＣＰＵ＃０で実行中のタスクをストールさせる。
【００４８】
また、検出部６０１は、該他のコアから共有資源へのアクセス量が所定量以上のときに、ＣＰＵ＃０から共有資源へのアクセスの前処理を検出する。ここでは、所定量とは上述した所定アクセス量である。
【００４９】
また、検出部６０１は、該他のコアから共有資源へアクセスしているときに、ＣＰＵ＃０から共有資源へのアクセス量が所定量以上であるアクセスの前処理を検出する。
【００５０】
ＣＰＵ＃１上で動作する検出部６０２および制御部６１２と、ＣＰＵ＃２上で動作する検出部６０３および制御部６１３とは、それぞれＣＰＵ＃０上で動作する検出部６０１および制御部６１１と同一の処理であるため、説明を省略する。
【００５１】
以上を踏まえ、図を用いて詳細に説明する。
【００５２】
図７は、タスク２がＣＰＵ＃０にディスパッチされる例を示す説明図である。まず、スケジューラ３５１が、（１）タスク２をＣＰＵ＃０にディスパッチすることにより、ＣＰＵ＃０へのタスクのディスパッチを検出することとする。そして、スケジューラ３５１が、（２）ディスパッチされたタスク２の属性を属性テーブル４００から取得することにより、タスク２の属性をチェックする。
【００５３】
タスク２の属性は通常であるため、スケジューラ３５１が、（３）アクセスフラグの値がＣＰＵ＃０を示す値であるか否かを判断する。ここでは、アクセスフラグの値が−であるため、いずれのＣＰＵも示していないので、スケジューラ３５１は、属性チェンジャー３７１が起動済か否かを判断する。属性チェンジャー３７１は起動されていないため、スケジューラ３５１が、（４）属性チェンジャー３７１を起動する。
【００５４】
属性チェンジャー３７１は、スケジューラ３５１により起動されると、大量アクセス開始情報５００から、実行中のタスク２が大量アクセス状態に遷移する命令アドレスを取得する。そして、属性チェンジャー３７１は、取得した命令アドレスとＣＰＵ＃０のＰＣ３３１の値とを比較することにより、タスク２の大量アクセス開始を監視する。
【００５５】
図８は、タスク５がＣＰＵ＃１にディスパッチされる例を示す説明図である。ここで、ＣＰＵ＃０のレディーキュー３６１にはタスク１とタスク３とが積まれている。そして、スケジューラ３５１が（１）タスク５をＣＰＵ＃１にディスパッチすると、スケジューラ３５２が（２）該ディスパッチを検出する。
【００５６】
そして、スケジューラ３５２が、（３）ディスパッチされたタスク５の属性を属性テーブル４００から取得することにより、タスク５の属性をチェックする。タスク５の属性は通常状態であるため、スケジューラ３５２が、（４）アクセスフラグの値がＣＰＵ＃１を示す値であるか否かを判断する。ここでは、アクセスフラグの値が−であり、いずれのＣＰＵも示していないので、スケジューラ３５２は、属性チェンジャー３７２が起動済か否かを判断する。属性チェンジャー３７２は起動されていないため、スケジューラ３５２が、（５）属性チェンジャー３７２を起動する。
【００５７】
属性チェンジャー３７２は、スケジューラ３５２により起動されると、大量アクセス開始情報５００から、実行中のタスク５が大量アクセス状態に遷移する命令アドレスを取得する。そして、属性チェンジャー３７２は、取得した命令アドレスとＣＰＵ＃１のＰＣ３３２の値とを比較することにより、タスク５の大量アクセス開始を監視する。
【００５８】
図９は、タスク７がＣＰＵ＃２にディスパッチされる例を示す説明図である。ここで、ＣＰＵ＃１のレディーキュー３６２にはタスク４とタスク６とが積まれている。そして、スケジューラ３５１が（１）タスク７をＣＰＵ＃２にディスパッチすると、スケジューラ３５３が（２）該ディスパッチを検出する。
【００５９】
そして、スケジューラ３５３が、（３）ディスパッチされたタスク７の属性を属性テーブル４００から取得することにより、タスク７の属性をチェックする。タスク７の属性は属性テーブル４００に登録されていないため、属性未付加である。そして、スケジューラ３５３が、（４）アクセスフラグの値がＣＰＵ＃２を示す値であるか否かを判断する。ここでは、アクセスフラグの値が−であり、いずれのＣＰＵも示していない。つぎに、スケジューラ３５３は、属性チェンジャーが起動済か否かを判断する。属性チェンジャーは起動されておらず、スケジューラ３５３は、属性チェンジャーを起動しない。
【００６０】
図１０は、ＣＰＵ＃０が大量アクセスを開始する例を示す説明図である。上述のように属性チェンジャー３７１は、取得した命令アドレスとＣＰＵ＃０のＰＣ３３１の値とを比較することにより、タスク２の大量アクセス開始を監視する。そして、属性チェンジャー３７１は、（１）取得した命令アドレスとＣＰＵ＃０のＰＣ３３１の値との一致を検出することにより、共有メモリ３０３へのアクセス量が所定量以上であるアクセスの前処理を検出することとする。
【００６１】
属性チェンジャー３７１は、（２）アクセスフラグを、ＣＰＵ＃０を示す値に設定する。属性チェンジャー３７１は、（３）属性テーブル４００内のタスクＩＤの項目４０１がタスク２を保持する属性の項目４０２を通常からアクセスに変更する。そして、属性チェンジャー３７１は（４）属性チェンジャー３７１を停止する。
【００６２】
また、スヌープコントローラ３０１は、＜１＞ＣＰＵ＃０のキャッシュ３２１内のアクセスフラグの変更を検出すると、＜２＞スヌープによりＣＰＵ＃１のキャッシュ３２２およびＣＰＵ＃２のキャッシュ３２３内のアクセスフラグを更新する。アクセスフラグのアドレス空間は常に全ＣＰＵのキャッシュ上に配置される。たとえば、全ＣＰＵのキャッシュ上にロック領域が設けられ、該ロック領域にアクセスフラグのアドレス空間が配置される。
【００６３】
図１１は、ＣＰＵ＃１での大量アクセスの検出例を示す説明図である。上述のように属性チェンジャー３７２は、取得した命令アドレスとＣＰＵ＃１のＰＣ３３２の値とを比較することにより、タスク５の大量アクセス開始を監視する。そして、属性チェンジャー３７２は、検出部６０２により、（１）取得した命令アドレスとＣＰＵ＃１のＰＣ３３２の値との一致を検出することにより、共有メモリ３０３へのアクセス量が所定量以上であるアクセスの前処理を検出することとする。
【００６４】
属性チェンジャー３７２は、（２）アクセスフラグが−であるか否かを判断する。アクセスフラグが０であるため、属性チェンジャー３７２は（３）スケジューラ３５２に他のタスクへのディスパッチ要求を通知する。
【００６５】
図１２は、ＣＰＵ＃１でタスクディスパッチを行う例を示す説明図である。そして、スケジューラ３５２が、制御部６１２により、ディスパッチ要求を受け付けると、（１）タスク５からタスク６にディスパッチする。また、属性チェンジャー３７２は停止する。
【００６６】
そして、スケジューラ３５２がタスク６をディスパッチすることにより、タスク６のディスパッチを検出することとして、図８で示したようにタスク５がディスパッチされた場合と同様の処理をスケジューラ３５２が実施する。
【００６７】
また、本実施の形態では、上述のようにアクセス量が所定量以上であるアクセスが複数のＣＰＵで競合しない例を示した。これに限らず、たとえば、大量アクセスであるか否かに関係なく１つのＣＰＵが共有メモリ３０３へアクセスしているときに、他のＣＰＵから共有メモリ３０３へアクセス量が所定量以上であるアクセスの前処理を検出し、アクセスが競合しないようにしてもよい。また、たとえば、１つのＣＰＵが共有メモリ３０３へアクセス量が所定量以上であるアクセスを実行しているときに、大量アクセスであるか否かに関係なく他のＣＰＵから共有メモリ３０３へのアクセスの前処理を検出して、アクセスが競合しないようにしてもよい。
【００６８】
（マルチコアプロセッサシステム３００による制御処理手順）
つぎに、マルチコアプロセッサシステム３００による制御処理手順について説明する。ここでは、ＣＰＵ＃０で動作するスケジューラ３５１と属性チェンジャー３７１を例に挙げて説明するが、他のＣＰＵで動作するスケジューラと属性チェンジャーも同一処理である。
【００６９】
図１３および図１４は、スケジューラ３５１による制御処理手順の一例を示すフローチャートである。まず、スケジューラ３５１が、タスクのディスパッチを検出、または他のタスクへのディパッチ要求を検出したか否かを判断する（ステップＳ１３０１）。スケジューラ３５１が、タスクのディスパッチを検出および他のタスクへのディパッチ要求を検出していないと判断した場合（ステップＳ１３０１：Ｎｏ）、ステップＳ１３０１へ戻る。
【００７０】
スケジューラ３５１が、タスクのディスパッチを検出したと判断した場合（ステップＳ１３０１：ディスパッチ）、ディスパッチされたタスクの属性をチェックする（ステップＳ１３０２）。スケジューラ３５１が、ディスパッチされたタスクの属性が属性未付加であると判断した場合（ステップＳ１３０２：属性未付加）、アクセスフラグの値が自ＣＰＵを示す値であるか否かを判断する（ステップＳ１３０３）。
【００７１】
スケジューラ３５１が、アクセスフラグの値が自ＣＰＵを示す値であると判断した場合（ステップＳ１３０３：Ｙｅｓ）、アクセスフラグの値を解除値に設定する（ステップＳ１３０４）。ここでは、−を解除値と称する。スケジューラ３５１が、アクセスフラグの値が自ＣＰＵを示す値でないと判断した場合（ステップＳ１３０３：Ｎｏ）、またはステップＳ１３０４のつぎに、属性チェンジャー３７１が起動済か否かを判断する（ステップＳ１３０５）。
【００７２】
スケジューラ３５１が、属性チェンジャー３７１が起動済であると判断した場合（ステップＳ１３０５：起動済）、属性チェンジャー３７１の停止要求を通知（図１５のステップＳ１５０３へ）する（ステップＳ１３０６）。そして、ステップＳ１３０６のつぎに、ステップＳ１３０１へ戻る。一方、スケジューラ３５１が、属性チェンジャー３７１が起動済でないと判断した場合（ステップＳ１３０５：停止中）、ステップＳ１３０１へ戻る。
【００７３】
スケジューラ３５１が、ディスパッチされたタスクの属性が通常であると判断した場合（ステップＳ１３０２：通常）、アクセスフラグの値が自ＣＰＵを示す値か否かを判断する（ステップＳ１３０７）。スケジューラ３５１が、アクセスフラグの値が自ＣＰＵを示す値であると判断した場合（ステップＳ１３０７：Ｙｅｓ）、アクセスフラグの値を解除値に設定する（ステップＳ１３０８）。スケジューラ３５１が、アクセスフラグの値が自ＣＰＵを示す値でないと判断した場合（ステップＳ１３０７：Ｎｏ）、またはステップＳ１３０８のつぎに、属性チェンジャー３７１が起動済か否かを判断する（ステップＳ１３０９）。
【００７４】
スケジューラ３５１が、属性チェンジャー３７１が起動済でないと判断した場合（ステップＳ１３０９：停止中）、属性チェンジャー３７１の起動要求を通知（ステップＳ１５０１へ）する（ステップＳ１３１０）。スケジューラ３５１が、属性チェンジャー３７１が起動済であると判断した場合（ステップＳ１３０９：起動済）、大量アクセス開始情報５００の再取得の要求を属性チェンジャー３７１に通知（図１５のステップＳ１５０３へ）する（ステップＳ１３１１）。そして、ステップＳ１３１０またはステップＳ１３１１のつぎに、ステップＳ１３０１へ戻る。
【００７５】
ステップＳ１３０１において、スケジューラ３５１が、他のタスクのディスパッチ要求を検出した場合（ステップＳ１３０１：ディスパッチ要求）、制御部６１１により、レディーキュー３６１内の他のタスクにディスパッチする（ステップＳ１３１６）。
【００７６】
また、ステップＳ１３０２において、スケジューラ３５１が、ディスパッチされたタスクの属性がアクセスであると判断した場合（ステップＳ１３０２：アクセス）、アクセスフラグをチェックする（ステップＳ１３１２）。そして、スケジューラ３５１が、アクセスフラグの値が解除値であると判断した場合（ステップＳ１３１２：解除値）、アクセスフラグの値を、自ＣＰＵを示す値に設定する（ステップＳ１３１３）。
【００７７】
スケジューラ３５１が、アクセスフラグが自ＣＰＵを示していると判断した場合（ステップＳ１３１２：自ＣＰＵ）、またはステップＳ１３１３のつぎに、属性チェンジャー３７１が起動済であるか否かを判断する（ステップＳ１３１４）。スケジューラ３５１が、属性チェンジャー３７１が起動済であると判断した場合（ステップＳ１３１４：起動済）、属性チェンジャー３７１の停止要求を属性チェンジャー３７１に通知（図１５のステップＳ１５０３へ）する（ステップＳ１３１５）。
【００７８】
ステップＳ１３１２において、スケジューラ３５１が、アクセスフラグが他ＣＰＵを示していると判断した場合（ステップＳ１３１２：他ＣＰＵ）、ステップＳ１３１６へ移行する。そして、ステップＳ１３１４において、スケジューラ３５１が、属性チェンジャー３７１が起動済でないと判断した場合（ステップＳ１３１４：停止中）、ステップＳ１３１５、またはステップＳ１３１６のつぎに、ステップＳ１３０１へ戻る。
【００７９】
図１５は、属性チェンジャー３７１による制御処理手順の一例を示すフローチャートである。まず、属性チェンジャー３７１が、スケジューラ３５１から起動要求ありか否かを判断し（ステップＳ１５０１）、起動要求がないと判断した場合（ステップＳ１５０１：Ｎｏ）、ステップＳ１５０１へ戻る。つぎに、属性チェンジャー３７１が、起動要求がありと判断した場合（ステップＳ１５０１：Ｙｅｓ）、大量アクセス開始情報５００を取得する（ステップＳ１５０２）。
【００８０】
そして、属性チェンジャー３７１が、大量アクセスの前処理を検出、停止要求を検出、または大量アクセス開始情報５００の再取得要求を検出したか否かを判断する（ステップＳ１５０３）。属性チェンジャー３７１が、大量アクセスの前処理の検出と、停止要求の検出と、大量アクセス開始情報５００の再取得要求の検出とのいずれも検出していないと判断した場合（ステップＳ１５０３：Ｎｏ）、ステップＳ１５０３に戻る。
【００８１】
属性チェンジャー３７１が、大量アクセス開始情報５００の再取得要求を検出したと判断した場合（ステップＳ１５０３：大量アクセス開始情報の再取得要求）、ステップＳ１５０２へ戻る。属性チェンジャー３７１が、検出部６０１により、大量アクセスの前処理を検出したと判断した場合（ステップＳ１５０３：大量アクセスの前処理）、検出部６０１により、アクセスフラグの値が自ＣＰＵを示す値または解除値であるか否かを判断する（ステップＳ１５０４）。
【００８２】
属性チェンジャー３７１が、アクセスフラグの値が自ＣＰＵを示す値または解除値であると判断した場合（ステップＳ１５０４：Ｙｅｓ）、実行中のタスクの属性をアクセスに変更する（ステップＳ１５０５）。そして、属性チェンジャー３７１が、アクセスフラグの値を、自ＣＰＵを示す値に設定し（ステップＳ１５０６）、属性チェンジャー３７１を停止し（ステップＳ１５０８）、ステップＳ１５０１へ戻る。属性チェンジャー３７１を停止するとは、具体的には、たとえば、属性チェンジャー３７１を実行待機状態にさせることを示している。
【００８３】
属性チェンジャー３７１が、停止要求を検出したと判断した場合（ステップＳ１５０３：停止要求）、ステップＳ１５０８へ移行する。また、属性チェンジャー３７１が、アクセスフラグの値が自ＣＰＵを示す値および解除値でないと判断した場合（ステップＳ１５０４：Ｎｏ）、ディスパッチ要求をスケジューラ３５１へ通知（ステップＳ１３０１へ）し（ステップＳ１５０７）、ステップＳ１５０８へ移行する。アクセスフラグの値が自ＣＰＵを示す値および解除値でない場合とは、他のＣＰＵが大量アクセスを行っていることを示している。
【００８４】
以上説明したように、マルチコアプロセッサシステム、制御プログラム、および制御方法によれば、一のＣＰＵが共有資源へアクセスしているときに、他のＣＰＵから共有資源へのアクセスの前処理を検出する。そして、他のＣＰＵで実行中のタスクを他のタスクに切り替える。これにより、複数のＣＰＵで共有資源へのアクセスが競合しないので、調停回路によるアクセスの調停が不要となる。したがって、一のＣＰＵのアクセスを高速化させることができ、一のＣＰＵの実効性能を向上させることができる。
【００８５】
また、一のＣＰＵが共有資源へアクセス量が所定量以上であるアクセスを実行しているときに、他のＣＰＵから共有資源へのアクセスの前処理を検出すると、他のＣＰＵで実行中のタスクを他のタスクに切り替える。これにより、大量アクセスが発生しているときに、他のＣＰＵからのアクセスが競合しないため、マルチコアプロセッサシステムの実行性能が向上する。
【００８６】
また、一のＣＰＵが共有資源へアクセスしているときに、アクセス量が所定アクセス量以上である他のＣＰＵから共有資源へのアクセスの前処理を検出し、他のＣＰＵで実行中のタスクを他のタスクに切り替える。これにより、複数のＣＰＵで共有資源への大量のアクセスが競合しないため、マルチコアプロセッサシステムの実行性能が向上する。
【００８７】
また、以上説明したように、マルチコアプロセッサシステム、制御プログラム、および制御方法によれば、一のＣＰＵが共有資源へアクセスしているときに、他のＣＰＵから共有資源へのアクセスの前処理を検出する。そして、他のＣＰＵで実行中のタスクをストールさせる。これにより、複数のＣＰＵで共有資源へのアクセスが競合しないので、調停回路によるアクセスの調停が不要となる。したがって、一のＣＰＵのアクセスを高速化させることができ、一のＣＰＵの実効性能を向上させることができる。
【００８８】
また、一のＣＰＵが共有資源へアクセス量が所定量以上であるアクセス実行しているときに、他のＣＰＵから共有資源へのアクセスの前処理を検出すると、他のＣＰＵで実行中のタスクをストールさせる。これにより、大量アクセスが発生しているときに、他のＣＰＵからのアクセスが競合しないため、マルチコアプロセッサシステムの実行性能が向上する。
【００８９】
また、一のＣＰＵが共有資源へアクセスしているときに、アクセス量が所定アクセス量以上である他のＣＰＵから共有資源へのアクセスの前処理を検出すると、他のＣＰＵで実行中のタスクをストールさせる。これにより、複数のＣＰＵで共有資源への大量のアクセスが競合しないため、マルチコアプロセッサの実行性能が向上する。
【符号の説明】
【００９０】
３００  マルチコアプロセッサシステム
３０３  共有メモリ
６０１，６０２，６０３  検出部
６１１，６１２，６１３  制御部
【図１】
0005397546.tif 000002
【図２】
0005397546.tif 000003
【図３】
0005397546.tif 000004
【図４】
0005397546.tif 000005
【図５】
0005397546.tif 000006
【図６】
0005397546.tif 000007
【図７】
0005397546.tif 000008
【図８】
0005397546.tif 000009
【図９】
0005397546.tif 000010
【図１０】
0005397546.tif 000011
【図１１】
0005397546.tif 000012
【図１２】
0005397546.tif 000013
【図１３】
0005397546.tif 000014
【図１４】
0005397546.tif 000015
【図１５】
0005397546.tif 000016