(57)【要約】  コアによるデバイスに対するアクセス競合が発生する場合に、処理性能を維持しつつ消費電力を削減する。ＣＰＵ（＃０）は、検出部（３０７）によってデバイス群（２０５）内のデバイス（＃Ｈ０）に対してアクセス競合を発生させる特定のコア群となるＣＰＵ（＃０）とＣＰＵ（＃１）を検出する。検出後、ＣＰＵ（＃０）は、特定部（３０９）によって、デバイス群（２０５）内のデバイス（＃Ｈ０）に対するアクセス競合の状態を特定する。特定後、ＣＰＵ（＃０）は、クロック周波数テーブル（３０１）から、デバイス（＃Ｈ０）に対するアクセス競合の状態に応じたデバイス（＃Ｈ０）のクロック周波数とＣＰＵ（＃０）、ＣＰＵ（＃１）のクロック周波数とを抽出する。抽出後、ＣＰＵ（＃０）は、デバイス（＃Ｈ０）のクロック周波数にてデバイス（＃Ｈ０）を動作させ、また、特定のコア群のクロック周波数にてＣＰＵ（＃０）、ＣＰＵ（＃１）を動作させる。
2012086040.tif 000002
【特許請求の範囲】
【請求項１】
複数のＣＰＵと、
デバイスと、
前記デバイスをアクセスするＣＰＵの数に対して消費電力が最小となるクロック周波数および電圧が格納されるメモリと、
前記デバイスをアクセスするＣＰＵの数が変化するとき、前記ＣＰＵの数に対応する前記クロック周波数および前記電圧を前記メモリから読み出して、前記デバイスをアクセスするＣＰＵに前記クロック周波数および前記電圧を設定する電力制御ユニットと
を含むことを特徴とするマルチコアプロセッサシステム。
【請求項２】
前記メモリは、
前記デバイスをアクセスするＣＰＵの数に対して消費電力が最小となる前記デバイスのクロック周波数および電圧と前記デバイスをアクセスするＣＰＵのクロック周波数および電圧とが格納され、
前記電力制御ユニットは、
前記デバイスをアクセスするＣＰＵの数が変化するとき、前記ＣＰＵの数に対応する前記デバイスのクロック周波数および電圧と前記デバイスをアクセスするＣＰＵのクロック周波数および電圧とを前記メモリから読み出して、前記デバイスに前記デバイスのクロック周波数および電圧を設定し、前記デバイスをアクセスするＣＰＵに前記デバイスをアクセスするＣＰＵのクロック周波数および電圧を設定すること
を特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項３】
前記クロック周波数および前記電圧は、前記複数のＣＰＵの数、前記デバイスをアクセスするＣＰＵの数、前記複数のＣＰＵのうちの少なくとも一のＣＰＵの消費電力、および前記デバイスの消費電力に基づいて算出されること
を特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項４】
前記クロック周波数および前記電圧は、前記デバイスをアクセスするＣＰＵの処理性能を維持するための下限値より大きいこと
を特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項５】
前記デバイスへのアクセスは、競合アクセスおよび排他アクセスを含むこと
を特徴とする請求項１乃至請求項４の何れか一に記載のマルチコアプロセッサシステム。
【請求項６】
コンピュータが、
複数のＣＰＵがデバイスにアクセスするときの消費電力が最小となるときのクロック周波数および電圧をメモリから読み出し、
前記デバイスにアクセスするＣＰＵに前記クロック周波数および前記電圧を設定すること
を特徴とするマルチコアプロセッサシステムの電力制御方法。
【請求項７】
前記メモリから前記クロック周波数および前記電圧を読み出す処理は、
前記デバイスをアクセスするＣＰＵの数に対して消費電力が最小となる前記デバイスのクロック周波数および電圧と前記デバイスをアクセスするＣＰＵのクロック周波数および電圧を読み出し、
前記クロック周波数および前記電圧を設定する処理は、
前記デバイスに前記デバイスのクロック周波数および電圧を設定し、前記デバイスをアクセスするＣＰＵに前記デバイスをアクセスするＣＰＵのクロック周波数および電圧を設定すること
を特徴とする請求項６に記載のマルチコアプロセッサシステムの電力制御方法。
【請求項８】
前記メモリは、前記デバイスをアクセスするＣＰＵの数に対して消費電力が最小となるクロック周波数および電圧を格納すること
を特徴とする請求項６に記載の電力制御方法。
【請求項９】
前記複数のＣＰＵは前記デバイスに競合してアクセスすること
を特徴とする請求項６乃至請求項８の何れか一に記載の電力制御方法。
【請求項１０】
前記複数のＣＰＵは前記デバイスに排他的にアクセスすること
を特徴とする請求項６乃至請求項８の何れか一に記載の電力制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、電力を制御するマルチコアプロセッサシステム、および電力制御方法に関する。
【背景技術】
【０００２】
近年、１つのシステム内に、複数のコアを有するマルチコアプロセッサシステムの形態を採用する機器が増加している。マルチコアプロセッサシステムでは、複数のコアが同時に動作するため、複数のコアが同一のデバイスにアクセスする可能性がある。このようなデバイスに対するアクセス競合が発生した場合、マルチコアプロセッサシステムでは、ハードウェアによる調停方法、またはソフトウェアによる調停方法が行われてきた。【０００３】
ハードウェアによる調停方法は、たとえば、調停回路を用いる方法である。調停回路が、たとえば、デバイスの一つであるメモリの入出力ポートに設置されており、複数のコアからのメモリに対するアクセスに対して調停を行う。ハードウェアによる調停方法では、コアで実行するソフトウェアが特に調停を行わなくとも、ハードウェアが調停を行う。具体的に、調停を行うハードウェアは、特定のコアが調停対象デバイスに対するアクセス権を取得した後、他のコアから調停対象デバイスへのアクセス要求を受けた場合、特定のコアがアクセスを完了してアクセス権を解放するまで、他のコアを待機させる。【０００４】
また、ソフトウェアによる調停方法は、たとえば、マルチコアプロセッサシステム用のＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）が提供する排他制御の機能を利用して、ソフトウェアが同一時間に調停対象デバイスに１つのコアがアクセスするように調停する方法である。ソフトウェアによる調停方法が適用される場合として、たとえば、メモリ上の同じ箇所に複数のコアがアクセスする場合である。または、ＤＭＡＣ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ  Ｃｏｎｔｒｏｌｌｅｒ）やディスプレイ等の描画デバイス、といった周辺デバイスを、複数のコアが同時にアクセスする場合である。【０００５】
しかし、ハードウェアまたはソフトウェアによる調停方法のいずれの方法を行っても、アクセス権を確保できなかったコアは特定のコアがアクセス権を解放するまで待機するため、マルチコアプロセッサシステムの処理性能が低下していた。したがって、アクセス競合そのものを回避し、処理性能の低下を防ぐ技術が開示されている。【０００６】
たとえば、ハードウェアによる調停方法に対して、ＯＳのスケジューリングにより、メモリアクセスを頻繁に行う処理同士を同時に実行しないようにスケジューリングする技術が開示されている。また、ソフトウェアによる調停方法に対して、並行処理を行う処理に対し、アクセス権の獲得に失敗しても、状態遷移を待機状態にせず、実行可能状態とすることで、状態遷移の回数を減らし、状態遷移に伴うオーバーヘッドを減らす技術が開示されている（たとえば、下記特許文献１、２を参照。）。【０００７】
また、近年、クロック周波数と電圧を変更して、低消費電力を実現するＤＶＦＳ（Ｄｙｎａｍｉｃ  Ｖｏｌｔａｇｅ  ａｎｄ  Ｆｒｅｑｕｅｎｃｙ  Ｓｃａｌｉｎｇ）という技術が開示されている。具体的に、ＤＶＦＳは、マルチコアプロセッサシステムを電力ドメインという単位で区切り、ドメイン単位でクロック周波数と電圧を変更する。ＤＶＦＳを利用することにより、負荷の低いコアのクロック周波数と電圧を落として消費電力を下げる効果、または負荷の高いコアのクロック周波数と電圧を上げてマルチコアプロセッサシステムの処理性能を向上させる効果を生むことが可能である（たとえば、下記特許文献３、４を参照。）。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２０００−１４８７１２号公報
【特許文献２】特開平６−１６１８７２号公報
【特許文献３】特開２００６−２９３７６８号公報
【特許文献４】特開２００３−２５６０６９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、上述した従来技術において、特許文献１、２にかかる技術では、競合の発生、またはオーバーヘッドを削減できず、性能低下が発生してしまうケースも存在するという問題があった。たとえば、実行可能な処理群のうち、全ての処理がメモリアクセスを頻繁に行う処理である場合、マルチコアプロセッサシステムは、どのようにスケジューリングしても、アクセス競合が発生し、処理性能の低下が発生する。また、特許文献３、４にかかる技術において、ＤＶＦＳ技術を競合発生時に適用しようとする場合、負荷の低い箇所の処理能力を下げる方向と、負荷の高い箇所の処理能力を上げる方向という２つの方向のいずれか一方を選択しなければならないという問題があった。【００１０】
本発明は、上述した従来技術による問題点を解消するため、コアによるデバイスに対するアクセス競合が発生する場合に、処理性能を維持しつつ消費電力を削減できるマルチコアプロセッサシステム、および電力制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上述した課題を解決し、目的を達成するため、開示のマルチコアプロセッサシステムは、複数のＣＰＵと、デバイスと、デバイスにアクセスするＣＰＵの数に対して消費電力が最小となるクロック周波数および電圧が格納されるメモリと、デバイスにアクセスするＣＰＵの数が変化するとき、ＣＰＵの数に対応するクロック周波数および電圧をメモリから読み出して、デバイスにアクセスするＣＰＵにクロック周波数および電圧を設定する電力制御ユニットとを含む。
【発明の効果】
【００１２】
本マルチコアプロセッサシステム、および電力制御方法によれば、コアによるデバイスに対するアクセス競合が発生する場合に、処理性能を維持しつつ消費電力を削減できるという効果を奏する。
【図面の簡単な説明】
【００１３】
【図１】図１は、実施の形態１におけるマルチコアプロセッサシステム１００のアクセス競合時の動作を示す説明図である。
【図２】図２は、マルチコアプロセッサシステム１００のハードウェアを示すブロック図である。
【図３】図３は、実施の形態１におけるマルチコアプロセッサシステム１００の機能を示すブロック図である。
【図４】図４は、マルチコアプロセッサシステム１００の消費電力の計算例を示す説明図である。
【図５】図５は、ハードウェアによる調停を受けるデバイス＃Ｓ０への動作シーケンスを示す説明図である。
【図６】図６は、ハードウェアによる調停を受けるデバイス＃Ｈ０のクロック周波数を上げた場合の動作シーケンスを示す説明図である。
【図７】図７は、ソフトウェアによる調停を受けるデバイス＃Ｓ０の動作シーケンスを示す説明図である。
【図８】図８は、ソフトウェアによる調停を受けるデバイス＃Ｓ０のクロック周波数を上げた場合の動作シーケンスを示す説明図である。
【図９】図９は、ハードウェアによる調停を受けるデバイス群２０５のクロック周波数の変化に伴う消費電力量の説明図である。
【図１０】図１０は、ソフトウェアによる調停を受けるデバイス群２０６のクロック周波数の変化に伴う消費電力量の説明図である。
【図１１】図１１は、消費電力量の変化例と、実施の形態１におけるクロック周波数テーブル３０１の記憶内容の一例を示す説明図である。
【図１２】図１２は、デバイス＃Ｈ０に対する競合発生時におけるＣＰＵとクロック周波数を示す説明図である。
【図１３】図１３は、実施の形態１におけるスケジューリング部３０３の処理を示すフローチャート（その１）である。
【図１４】図１４は、実施の形態１におけるスケジューリング部３０３の処理を示すフローチャート（その２）である。
【図１５】図１５は、実施の形態１における排他制御部３０４の利用開始処理を示すフローチャートである。
【図１６】図１６は、実施の形態１における排他制御部３０４の利用解放処理を示すフローチャートである。
【図１７】図１７は、実施の形態１におけるＤＶＦＳ制御部３０５の処理を示すフローチャート（その１）である。
【図１８】図１８は、実施の形態１におけるＤＶＦＳ制御部３０５の処理を示すフローチャート（その２）である。
【図１９】図１９は、実施の形態２におけるクロック周波数テーブル１９０１の記憶内容の一例を示す説明図である。
【図２０】図２０は、ＣＰＵｓ１０５およびデバイス群２０５のクロック周波数の設定例を示す説明図である。
【図２１】図２１は、実施の形態２におけるスケジューリング部３０３の処理を示すフローチャート（その２）である。
【図２２】図２２は、実施の形態２におけるＤＶＦＳ制御部３０５の処理を示すフローチャート（その２）である。
【発明を実施するための形態】
【００１４】
以下に添付図面を参照して、開示のマルチコアプロセッサシステム、および電力制御方法の好適な実施の形態を詳細に説明する。
【００１５】
（マルチコアプロセッサシステム１００の動作）
図１は、実施の形態１におけるマルチコアプロセッサシステム１００のアクセス競合時の動作を示す説明図である。符号１０１で示すブロック図は、マルチコアプロセッサシステム１００内の、２つのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）がアクセス競合を起こしている状態を示している。また、符号１０２で示すブロック図は、マルチコアプロセッサシステム１００内の、３つのＣＰＵがアクセス競合を起こしている状態を示している。
【００１６】
また、マルチコアプロセッサシステム１００には、複数のＣＰＵが含まれるＣＰＵｓ１０５、ＣＰＵｓ１０５からアクセス可能な記憶装置であるメモリ１０６、消費電力を管理する電力制御ユニット（以下、ＰＭＵ（Ｐｏｗｅｒ  Ｍａｎａｇｅｍｅｎｔ  Ｕｎｉｔ）と表す）１０７が含まれる。各部は、バス１０８によって接続されている。ＣＰＵｓ１０５には、ＣＰＵ＃０〜ＣＰＵ＃３が含まれる。なお、ＣＰＵｓ１０５には、２以上のＣＰＵが含まれていてもよい。また、ＰＭＵ１０７は、ＣＰＵｓ１０５、メモリ１０６に対して、クロック線１０９＃０〜クロック線１０９＃４を経由して、クロックを供給している。なお、マルチコアプロセッサシステム１００のハードウェアの詳細については、図２にて後述する。
【００１７】
また、グラフ１０３は、メモリ１０６に対するアクセス競合発生時に、ＣＰＵｓ１０５のクロック周波数と消費電力の関係を示したグラフである。また、グラフ１０４は、メモリ１０６に対するアクセス競合発生時に、メモリ１０６のクロック周波数と消費電力の関係を示したグラフである。グラフ１０３、グラフ１０４は、横軸がＣＰＵｓ１０５やメモリ１０６のクロック周波数、縦軸が消費電力を示している。
【００１８】
グラフ１０３では、アクセス競合発生時のＣＰＵ数に応じたＣＰＵｓ１０５のクロック周波数と消費電力の関係を示している。たとえば、アクセス競合中のＣＰＵ数が２である場合、ＰＭＵ１０７がＣＰＵｓ１０５のうち、アクセス競合中のＣＰＵのクロック周波数を標準値＝１０００［ＭＨｚ］から、５００［ＭＨｚ］まで落とす場合を想定する。このとき、クロック周波数を落としてもメモリ１０６の処理性能がボトルネックとなっており処理時間が変わらない場合、マルチコアプロセッサシステム１００の処理能力を落とさずに消費電力を下げることができる。
【００１９】
なお、アクセス競合中のＣＰＵ数が２である場合に、ＣＰＵｓ１０５のうち、アクセス競合中のＣＰＵのクロック周波数を５００［ＭＨｚ］より低く設定すると、処理能力の低下に伴い、メモリ１０６の処理性能がボトルネックでなくなる場合を想定している。たとえば、アクセス競合中のＣＰＵのクロック周波数を２５０［ＭＨｚ］に設定した場合、１０００［ＭＨｚ］で実行したときより処理時間が長くなってしまい、マルチコアプロセッサシステム１００の処理能力が低下してしまう。
【００２０】
同様に、アクセス競合中のＣＰＵ数が３である場合は、ＰＭＵ１０７がＣＰＵｓ１０５のうち、アクセス競合中のＣＰＵのクロック周波数を標準値＝１０００［ＭＨｚ］から、２５０［ＭＨｚ］までクロック周波数を落とすことを想定する。クロック周波数を落としても、メモリ１０６の処理性能がボトルネックとなっておりアクセス競合が解消する時間が変わらない場合、マルチコアプロセッサシステム１００の性能を落とさずに消費電力を下げることができる。
【００２１】
グラフ１０４では、アクセス競合発生時のＣＰＵ数に応じたメモリ１０６のクロック周波数と消費電力の関係を示している。メモリ１０６のクロック周波数を増加すると、メモリ１０６の消費電力が増大する要素もあるが、一方、アクセス競合が解消する時間が短くなり、アクセスに伴うＣＰＵｓ１０５、メモリ１０６の稼働時間が短くなるため、消費電力が減少する要素もある。
【００２２】
グラフ１０４の例では、たとえば、アクセス競合中のＣＰＵ数が２である場合、ＰＭＵ１０７がメモリ１０６のクロック周波数を標準値＝４００［ＭＨｚ］から、６００［ＭＨｚ］に上げたときに、消費電力が最も小さくなることを示している。同様に、アクセス競合中のＣＰＵ数が３である場合、ＰＭＵ１０７がメモリ１０６のクロック周波数を８００［ＭＨｚ］に上げたときに、消費電力が最も小さくなることを示している。
【００２３】
以上の点より、本実施の形態における電力制御方法は、アクセス競合時に、クロック周波数の変更に伴う消費電力量が、ＣＰＵｓ１０５のうちアクセス競合を起こしたＣＰＵ数によって異なることに着目している。たとえば、アクセス競合中のＣＰＵ数が２である符号１０１に示すブロック図では、ＰＭＵ１０７が、ＣＰＵｓ１０５のうちＣＰＵ＃０、ＣＰＵ＃１のクロック周波数を５００［ＭＨｚ］に下げ、メモリ１０６のクロック周波数を６００［ＭＨｚ］に上げる。これにより、マルチコアプロセッサシステム１００は、アクセス競合中のＣＰＵ数が２の場合において、消費電力を最も削減することができる。
【００２４】
同様に、アクセス競合中のＣＰＵ数が３である符号１０２に示すブロック図では、ＰＭＵ１０７が、ＣＰＵｓ１０５のうちＣＰＵ＃０〜ＣＰＵ＃２のクロック周波数を２５０［ＭＨｚ］に下げ、メモリ１０６のクロック周波数を８００［ＭＨｚ］に上げる。これにより、マルチコアプロセッサシステム１００は、アクセス競合中のＣＰＵ数が３の場合において、消費電力を最も削減することができる。
【００２５】
（マルチコアプロセッサシステム１００のハードウェア）
図２は、マルチコアプロセッサシステム１００のハードウェアを示すブロック図である。マルチコアプロセッサシステム１００は、ＣＰＵｓ１０５と、メモリ１０６と、ＰＭＵ１０７と、デバイス群２０５、デバイス群２０６、を含む。
【００２６】
ここで、ＣＰＵｓ１０５は、マルチコアプロセッサシステム１００の全体の制御を司る。また、ＣＰＵｓ１０５は、シングルコアのプロセッサを並列して接続した全てのＣＰＵを指している。ＣＰＵｓ１０５は、ＣＰＵ＃０〜ＣＰＵ＃Ｎを含む。Ｎは１以上の整数である。ＣＰＵ＃０〜ＣＰＵ＃Ｎは、それぞれ専用のキャッシュメモリを有してもよい。また、マルチコアプロセッサシステムとは、コアが複数搭載されたプロセッサを含むコンピュータのシステムである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、シングルコアのプロセッサであるＣＰＵが並列されている形態を例にあげて説明する。
【００２７】
メモリ１０６は、ＣＰＵｓ１０５からアクセス可能な記憶装置である。たとえば、メモリ１０６には、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０１と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０２と、フラッシュＲＯＭコントローラ２０３と、フラッシュＲＯＭ２０４と、を含む。
【００２８】
ＲＯＭ２０１は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０２は、ＣＰＵｓ１０５のワークエリアとして使用される。フラッシュＲＯＭコントローラ２０３は、ＣＰＵｓ１０５の制御に従ってフラッシュＲＯＭ２０４に対するデータのリード／ライトを制御する。フラッシュＲＯＭ２０４は、フラッシュＲＯＭコントローラ２０３の制御で書き込まれたデータを記憶する記録媒体である。データの具体例としては、マルチコアプロセッサシステム１００を使用するユーザがデバイス群２０５、デバイス群２０６を通して取得した画像データ、映像データなどや、または本実施の形態である電力制御方法を実行するプログラムが格納されていてもよい。また、フラッシュＲＯＭ２０４は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００２９】
デバイス群２０５、デバイス群２０６は、ＣＰＵｓ１０５からアクセス可能なデバイス群である。デバイス群２０５、デバイス群２０６は、たとえば、ユーザに対するインターフェイスとして、ディスプレイ、キーボードなどが挙げられる。ディスプレイは、たとえば、ＴＦＴ（Ｔｈｉｎ  Ｆｉｌｍ  Ｔｒａｎｓｉｓｔｏｒ）液晶ディスプレイなどを採用することができる。また、デバイス群２０５、デバイス群２０６には、外部との通信を行う周辺デバイスとして、通信デバイスなどが含まれていてもよい。
【００３０】
また、デバイス群２０５は、ハードウェアで調停するデバイス群であり、デバイス＃Ｈ０〜デバイス＃ＨＭを含む。Ｍは０以上の整数である。同様に、デバイス群２０６は、ソフトウェアで調停するデバイス群であり、デバイス＃Ｓ０〜デバイス＃ＳＬを含む。Ｌは０以上の整数である。また、ＣＰＵｓ１０５のうち２以上のＣＰＵが、デバイス群２０５内のデバイスに同時にアクセスする場合に、アクセス競合が発生している。デバイス群２０５内のデバイスにアクセスするＣＰＵの数を競合アクセス数Ｃｈと定義する。同様に、ＣＰＵｓ１０５のうち２以上のＣＰＵが、デバイス群２０６のデバイスに同時に排他アクセス要求を行った場合、ＯＳ等によるソフトウェアによって調停が行われている。デバイス群２０６内のデバイスに排他アクセス要求するＣＰＵの数を排他アクセス数Ｃｓと定義する。
【００３１】
ＰＭＵ１０７は、マルチコアプロセッサシステム１００の電源を管理する装置である。具体的に、ＰＭＵ１０７は、図２にて図示していないが、ＣＰＵｓ１０５、メモリ１０６、デバイス群２０５、デバイス群２０６に対して、クロック線を経由してクロックを供給し、電源線を経由して、電源電圧を供給する。なお、ＰＭＵ１０７はＤＶＦＳ制御に対応しており、ＣＰＵ＃０、…、ＣＰＵ＃Ｎ、メモリ１０６、デバイス＃Ｈ０、…、デバイス＃ＨＭ、デバイス＃Ｓ０、…、デバイス＃ＳＬ、バス１０８は独立した電力ドメインで区切られている。また、ＰＭＵ１０７は、ＣＰＵｓ１０５、メモリ１０６、デバイス群２０５、デバイス群２０６に供給されているクロック周波数と電圧を変更することが可能である。
【００３２】
なお、メモリ１０６に関しては、図２上ではデバイス群２０５、デバイス群２０６とは別に図示されているが、図３以降の説明では、メモリ１０６をデバイス群２０５内の１つのデバイスとしてもよい。理由として、メモリ１０６はメモリコントローラというハードウェアによって調停されるため、マルチコアプロセッサシステム１００は、デバイス群２０５として扱うことができるためである。また、メモリ１０６内の一部のアドレス空間において、ＯＳの機能による排他制御を行う場合、マルチコアプロセッサシステム１００は、そのアドレス空間について、デバイス群２０６内の１つのデバイスとして扱ってもよい。
【００３３】
（マルチコアプロセッサシステム１００の機能）
図３は、実施の形態１におけるマルチコアプロセッサシステム１００の機能を示すブロック図である。マルチコアプロセッサシステム１００は、スケジューリング部３０３と、排他制御部３０４と、ＤＶＦＳ制御部３０５と、を含む。この制御部となる機能（スケジューリング部３０３〜ＤＶＦＳ制御部３０５）は、記憶装置に記憶されたプログラムをＣＰＵ＃０〜ＣＰＵ＃Ｎのいずれかが実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図２に示したメモリ１０６に含まれるＲＯＭ２０１、ＲＡＭ２０２、フラッシュＲＯＭ２０４などである。
【００３４】
また、メモリ１０６は記憶部３０６を含み、スケジューリング部３０３は検出部３０７を含み、排他制御部３０４は検出部３０８を含み、ＤＶＦＳ制御部３０５は特定部３０９、特定部３１０、抽出部３１１、制御部３１２を含む。なお、図３では、スケジューリング部３０３と、排他制御部３０４と、ＤＶＦＳ制御部３０５がＣＰＵ＃０の機能として図示されているが、ＣＰＵ＃０以外のＣＰＵ＃１〜ＣＰＵ＃Ｎも、同機能を含んでもよい。
【００３５】
記憶部３０６は、デバイスにアクセスするＣＰＵの数であるアクセス数に応じて、消費電力量を最小にするＣＰＵのクロック周波数とデバイスのクロック周波数とが格納されたクロック周波数テーブル３０１を記憶する。また、クロック周波数テーブル３０１は、デバイス＃Ｈ０〜デバイス＃ＨＭ、デバイス＃Ｓ０〜デバイス＃ＳＬそれぞれに存在し、クロック周波数テーブル３０１＃Ｈ０〜クロック周波数テーブル３０１＃ＳＬと表記する。また、クロック周波数テーブル３０１は、ＣＰＵのクロック周波数が安定動作可能な最低電圧の値を格納していてもよい。さらに、クロック周波数テーブル３０１は、デバイスのクロック周波数が安定動作可能な最低電圧の値を格納していてもよい。
【００３６】
また、記憶部３０６は、ＣＰＵｓ１０５、デバイス群２０５、デバイス群２０６それぞれのクロック周波数の標準値が格納されているクロック周波数標準値テーブル３０２を記憶する。また、クロック周波数標準値テーブル３０２は、ＣＰＵｓ１０５、デバイス群２０５、デバイス群２０６のクロック周波数が安定可能な最低電圧の値を格納していてもよい。クロック周波数テーブル３０１とクロック周波数標準値テーブル３０２は、メモリ１０６に格納されている。クロック周波数テーブル３０１とクロック周波数標準値テーブル３０２は書き換えを行わないため、たとえば、ＲＯＭ２０１内に存在してもよい。クロック周波数テーブル３０１、クロック周波数標準値テーブル３０２の詳細は、図１１にて後述する。
【００３７】
また、アプリ＃Ｈ０、アプリ＃Ｓ０は、ＣＰＵ＃０で実行されるアプリケーションソフトウェア（以下、「アプリ」と記述）であり、アプリ＃Ｈ１、アプリ＃Ｓ１は、ＣＰＵ＃１で実行されるアプリである。また、アプリ＃Ｈ０、アプリ＃Ｈ１は、デバイス群２０５内のデバイス＃Ｈ０に頻繁にアクセスするアプリであると想定し、アプリ＃Ｓ０は、排他制御部３０４を経由してデバイス群２０６内のデバイス＃Ｓ０にアクセスするアプリであると想定する。また、アプリ＃Ｓ１も、ＣＰＵ＃１内にある排他制御部を経由してデバイス＃Ｓ０にアクセスするアプリであると想定する。
【００３８】
スケジューリング部３０３は、実行可能なアプリの一つを、ＣＰＵ＃０に割り当てる機能を有する。たとえば、スケジューリング部３０３は、アプリ＃Ｈ０やアプリ＃Ｓ０をＣＰＵ＃０に割り当てる。なお、割り当てられたアプリの情報は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０２といった記憶領域に記憶される。また、スケジューリング部３０３は、アプリを割り当てる際に、デバイス群２０５内の対象デバイスに対してアクセス競合を発生させるＣＰＵ群を検出する。
【００３９】
排他制御部３０４は、アプリからデバイス群２０６への利用要求に対して排他制御を提供する機能を有する。たとえば、排他制御部３０４は、アプリ＃Ｓ０からのデバイス＃Ｓ０への利用要求に応じて利用許可を与える。また、排他制御部３０４は、アプリ＃Ｓ０からの対象デバイスの利用要求時に他のアプリが対象デバイスの利用許可を有している場合に、アプリ＃Ｓ０を許可待ちとし、実行可能な他のアプリに切り替えるようにスケジューリング部３０３に要求する。また、排他制御部３０４は、利用権の取得時、または解放時に、デバイス群２０６内の対象アドレスに排他アクセス要求するＣＰＵ群を検出する。
【００４０】
ＤＶＦＳ制御部３０５は、スケジューリング部３０３、排他制御部３０４からの検出に応じてアクセス競合の状態を特定し、クロック周波数テーブル３０１から消費電力量が最小となるＣＰＵのクロック周波数と対象デバイスのクロック周波数を抽出する。抽出後、ＤＶＦＳ制御部３０５は、ＰＭＵ１０７を、対象デバイスにアクセス中のＣＰＵに抽出されたＣＰＵのクロック周波数で動作するように制御する。また、ＤＶＦＳ制御部３０５は、ＰＭＵ１０７を、対象デバイスに抽出されたデバイスのクロック周波数で動作するように制御する。
【００４１】
検出部３０７は、デバイス群２０５内の対象デバイスに対してアクセス競合を発生させる特定のコア群を検出する機能を有する。たとえば、検出部３０７は、アプリ＃Ｈ０が割り当てられたＣＰＵ＃０とアプリ＃Ｈ１が割り当てられたＣＰＵ＃１を検出する。なお、検出された結果となる検出されたＣＰＵの識別情報は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０２といった記憶領域に記憶される。
【００４２】
検出部３０８は、デバイス群２０６内の対象デバイスに対して排他アクセスを要求する特定のコア群を検出する。たとえば、検出部３０７は、デバイス＃Ｓ０への排他アクセスを要求するアプリ＃Ｓ０が割り当てられたＣＰＵ＃０とデバイス＃Ｓ０への排他アクセスを要求するアプリ＃Ｓ１が割り当てられたＣＰＵ＃１を検出する。なお、検出された結果となる検出されたＣＰＵの識別情報は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０２といった記憶領域に記憶される。
【００４３】
特定部３０９は、デバイス群２０５内の対象デバイスに対するアクセス競合の状態を特定する機能を有する。具体的に、特定部３０９は、対象デバイスに対してアクセスするＣＰＵの数である競合アクセス数Ｃｈを特定する。たとえば、検出部３０７が、デバイス＃Ｈ０に対してアクセスするＣＰＵ＃０とＣＰＵ＃１を検出した状態を想定する。このとき、特定部３０９は、デバイス＃Ｈ０に対するアクセス競合の状態が、競合アクセス数Ｃｈ＝２である状態として特定する。なお、競合アクセス数は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０２といった記憶領域に記憶される。
【００４４】
特定部３１０は、デバイス群２０６内の対象デバイスに対する排他アクセスの状態を特定する機能を有する。具体的に、特定部３１０は、対象デバイスに対して排他アクセスを要求するＣＰＵの数である排他アクセス数Ｃｓを特定する。たとえば、検出部３０８が、デバイス＃Ｓ０に対して排他アクセスを要求するＣＰＵ＃０とＣＰＵ＃１を検出した状態を想定する。このとき、特定部３１０は、デバイス＃Ｓ０に対する排他アクセスの状態が、排他アクセス数Ｃｓ＝２である状態として特定する。なお、排他アクセス数は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０２といった記憶領域に記憶される。
【００４５】
抽出部３１１は、記憶部３０６によって記憶されたクロック周波数テーブル３０１から、特定部３０９によって特定された対象デバイスに対するアクセス競合の状態に応じた対象デバイスのクロック周波数と特定のコア群のクロック周波数とを抽出する機能を有する。
【００４６】
たとえば、特定部３０９が、デバイス＃Ｈ０に対するアクセス競合の状態として、競合アクセス数Ｃｈ＝２を特定した状態を想定する。このとき、抽出部３１１は、クロック周波数テーブル３０１＃Ｈ０の競合アクセス数Ｃｈ＝２となるレコードを抽出する。これにより、抽出部３１１は、抽出されたレコード内に含まれるデバイス＃Ｈ０のクロック周波数と、特定のＣＰＵ群のクロック周波数を抽出したことになる。たとえば、抽出したレコード内には、デバイス＃Ｈ０のクロック周波数として４００［ＭＨｚ］、特定のＣＰＵ群となる、ＣＰＵ＃０、ＣＰＵ＃１のクロック周波数として５００［ＭＨｚ］が格納されている。
【００４７】
また、抽出部３１１は、記憶部３０６によって記憶されたクロック周波数テーブル３０１から、特定部３１０によって特定された対象デバイスに対する排他アクセスの状態に応じた対象デバイスのクロック周波数を抽出する機能を有する。たとえば、特定部３１０が、デバイス＃Ｓ０に対する排他アクセスの状態として、排他アクセス数Ｃｓ＝２を特定した状態を想定する。このとき、抽出部３１１は、クロック周波数テーブル３０１＃Ｓ０の排他アクセス数Ｃｓ＝２となるレコードを抽出する。これにより、抽出部３１１は、レコード内に含まれるデバイス＃Ｓ０のクロック周波数と、特定のＣＰＵ群のクロック周波数を抽出したことになる。
【００４８】
また、抽出部３１１は、クロック周波数テーブル３０１にクロック周波数に対応する電圧が格納されている場合、デバイスのクロック周波数と対応する電圧、ＣＰＵ群のクロック周波数と対応する電圧を抽出してもよい。なお、デバイスのクロック周波数とＣＰＵのクロック周波数は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０２といった記憶領域に記憶される。
【００４９】
制御部３１２は、抽出部３１１によって抽出された対象デバイスのクロック周波数にて対象デバイスを動作させ、また、抽出部３１１によって抽出された特定のコア群のクロック周波数にて特定のコア群を動作させる機能を有する。たとえば、制御部３１２は、デバイス＃Ｈ０を４００［ＭＨｚ］にて動作させ、ＣＰＵ＃０とＣＰＵ＃１を５００［ＭＨｚ］にて動作させる。
【００５０】
なお、具体的なクロック周波数の制御方法は、たとえば、制御部３１２が、対象デバイス、またはＣＰＵが属する電力ドメインと、クロック周波数の値をＰＭＵ１０７に通知することである。また、通知方法としては、たとえば、制御部３１２が、ＰＭＵ１０７内の設定レジスタに、前述した電力ドメインの識別情報とクロック周波数の値を書き込むこと等が挙げられる。
【００５１】
また、制御部３１２は、抽出部３１１がクロック周波数に対応した電圧も併せて抽出した場合、対象デバイス、または特定のコア群を、抽出したクロック周波数と電圧で動作させてもよい。
【００５２】
このように、実施の形態１におけるマルチコアプロセッサシステム１００は、複数のコアのうち、デバイスに対してアクセス競合を発生させる特定のコア群を検出する。また、マルチコアプロセッサシステム１００は、デバイスに少なくとも２以上のコアがアクセス競合する状態ごとに、デバイスのクロック周波数と、コア群のクロック周波数と、を記憶する。なお、デバイスのクロック周波数は、デバイスの処理速度を非アクセス競合時以上にさせるクロック周波数である。また、コア群のクロック周波数は、処理速度が非アクセス競合時以上となるデバイスに対してアクセス競合を維持しつつコア数に対応するコア群の処理速度を非アクセス競合時以下にさせるクロック周波数である。
【００５３】
続けて、マルチコアプロセッサシステム１００は、検出された特定のコア群によって、デバイスに対するアクセス競合の状態を特定する。特定後、マルチコアプロセッサシステム１００は、記憶されたデバイスのクロック周波数とコア群のクロック周波数とから、特定されたデバイスに対するアクセス競合の状態に応じたデバイスのクロック周波数と特定のコア群のクロック周波数とを抽出する。抽出後、マルチコアプロセッサシステム１００は、抽出されたデバイスのクロック周波数にてデバイスを動作させ、抽出された特定のコア群のクロック周波数にて特定のコア群を動作させる。
【００５４】
図４は、マルチコアプロセッサシステム１００の消費電力の計算例を示す説明図である。マルチコアプロセッサシステム１００全体の消費電力は、下記（１）式にて計算できる。
【００５５】
【数１】
2012086040.tif 000003
【００５６】
ここで、Ｐはマルチコアプロセッサシステム１００全体の消費電力、ＮはＣＰＵｓ１０５内の最大のＣＰＵ番号を示している。Ｍはハードウェアで調停するデバイス群２０５内の最大のデバイス番号、Ｌはソフトウェアで調停するデバイス群２０６内の最大のデバイス番号を示している。また、Ｐxxx（ｆxxx）は、それぞれの電力ドメインで、ｆxxxのクロック周波数を設定したときの消費電力を示している。ｘｘｘに該当するＣＰＵｉは、ＣＰＵｓ１０５のうちｉ番目のＣＰＵを、ＭＥＭはメモリ１０６を、ＢＵＳはバス１０８を、ＤＥＶｉはｉ番目のデバイス群２０５、デバイス群２０６を、ＰＭＵはＰＭＵ１０７を示している。
【００５７】
ＤＶＦＳ制御により、ＰＭＵ１０７以外は個別にクロック周波数を設定できるため、電力ドメインごとに設定されたクロック周波数での消費電力の合計が、マルチコアプロセッサシステム１００全体の消費電力になる。なお、電圧に関しては、設定されたクロック周波数で安定動作する最低電圧を設定すればよいため、クロック周波数が決定されると、電圧も一意に決定されることになる。本実施の形態におけるマルチコアプロセッサシステム１００は、ＣＰＵｓ１０５のうちアクセス競合中のＣＰＵのクロック周波数を下げるか、または、メモリ１０６、デバイス群２０５、デバイス群２０６のうち、競合クロック周波数を上げるか、を行う。以下、図５〜図９にて、ハードウェアによる調停の動作、ソフトウェアによる調停の動作について詳細に説明する。
【００５８】
図５は、ハードウェアによる調停を受けるデバイス＃Ｓ０への動作シーケンスを示す説明図である。図５では、ＣＰＵ＃０とＣＰＵ＃１が、デバイス＃Ｈ０を同時に利用する場合を想定している。符号５０１に示す説明図では、ＣＰＵ＃０とＣＰＵ＃１のクロック周波数を変化させない場合の動作を示しており、符号５０２に示す説明図では、ＣＰＵ＃０とＣＰＵ＃１のクロック周波数を低下させた場合の動作を示している。また、ＣＰＵ＃０とＣＰＵ＃１で実行されるアプリには、デバイス＃Ｈ０に頻繁にアクセスするという情報がメモリ１０６内に記憶されている。また、ＣＰＵ＃０で実行するアプリをアプリ０、ＣＰＵ＃１で実行するアプリをアプリ１と想定する。
【００５９】
ここで、デバイス＃Ｈ０に頻繁にアクセスするアプリとは、単位時間あたりに特定の閾値以上デバイス＃Ｈ０にアクセスするアプリである。たとえば、特定の閾値は、１秒間に１０００回以上といった記述を設定する。たとえば、マルチコアプロセッサシステム１００は、音声を再生するオーディオデバイスに対して、音声ファイルを再生・編集するプロセス内の音楽再生を行う音声再生アプリを、頻繁にアクセスするアプリとして設定してもよい。また、音声ファイルをブラウジングするブラウザアプリも、ユーザの操作に対応する操作音を出力する場合オーディオデバイスを利用することになる。しかし、操作音は、再生時間が短く短時間あたりのアクセス回数が閾値を超えないため、マルチコアプロセッサシステム１００は、オーディオデバイスを、頻繁にアクセスするアプリとして設定しない。
【００６０】
初めに、符号５０１で示す動作について説明を行う。時刻ｔ1の時点で、ＣＰＵ＃０、ＣＰＵ＃１が、それぞれアプリ０、アプリ１を実行開始する。また、時刻ｔ1にて、ＣＰＵ＃０がアプリ０の要求によりデバイス＃Ｈ０に対して利用要求を通知する。デバイス＃Ｈ０は、ＣＰＵ＃０以外の他のＣＰＵから利用されていないので、時刻ｔHD2にて利用許可をＣＰＵ＃０に通知する。ＣＰＵ＃０は、時刻ｔ1〜時刻ｔHD2となる利用許可を受け取る間、許可待ち状態となり、停止している。
【００６１】
利用許可を受け取ったＣＰＵ＃０は、ハードウェアが処理を行った後、時刻ｔHD3にてデバイス＃Ｈ０のデータを読み込む読込要求を通知する。なお、ハードウェアの処理とは、ＣＰＵのメモリ１０６等から読み込んだ命令セット以外のハードウェアの処理である。命令セット以外のハードウェアの処理とは、たとえば、メモリ１０６の調停を行うメモリコントローラの処理、または、ＣＰＵｓ１０５のキャッシュメモリ間の整合性をとるキャッシュコヒーレンシ機構の処理等である。
【００６２】
読込要求を受け取ったデバイス＃Ｈ０は、読込処理を実行し、時刻ｔHD5にて処理結果をＣＰＵ＃０に通知する。ＣＰＵ＃０は、時刻ｔHD3〜時刻ｔHD5となる処理結果を受け取る間、データ待ち状態となり、停止している。
【００６３】
また、時刻ｔHD4にて、ＣＰＵ＃１がデバイス＃Ｈ０に対して利用要求を通知する。デバイス＃Ｈ０は、読込処理を完了する時刻ｔHD6にて、利用許可をＣＰＵ＃１に通知する。また、ＣＰＵ＃１は、時刻ｔHD4〜時刻ｔHD6となる利用許可を受け取る間、許可待ち状態となり、停止している。
【００６４】
また、利用許可を受け取ったＣＰＵ＃１は、時刻ｔHD7にてデバイス＃Ｈ０のデータを読み込む読込要求を通知する。読込要求を受け取ったデバイス＃Ｈ０は、読込処理を実行し、時刻ｔHD9にて処理結果をＣＰＵ＃１に通知する。また、時刻ｔHD8にて、ＣＰＵ＃０がデバイス＃Ｈ０に対して利用要求を通知する。このとき、デバイス＃Ｈ０は、読込処理が完了後の時刻ｔHD10にて、利用許可をＣＰＵ＃０に通知する。利用許可を受け取ったＣＰＵ＃０は、時刻ｔHD11にてデバイス＃Ｈ０に対して読込要求を通知する。
【００６５】
なお、ＣＰＵｓ１０５と、デバイス群２０５、デバイス群２０６とのデータ送受信は、バス１０８の電気信号を用いている。ＣＰＵｓ１０５のうちいずれかのＣＰＵが、デバイス群２０５に要求を通知した場合、デバイス群２０５から要求に対する応答の信号を受けるまで、ＣＰＵの動作が停止することになる。図５において、ＣＰＵ＃０は時刻ｔHD5〜時刻ｔHD8にて、アプリ０を実行している。
【００６６】
次に、符号５０２で示す動作について説明を行う。時刻ｔ1の時点で、ＣＰＵ＃０、ＣＰＵ＃１が、それぞれアプリ０、アプリ１を実行開始する。アプリを実行する際、マルチコアプロセッサシステム１００は、同一デバイスに対して頻繁にアクセスするアプリを実行するＣＰＵのクロック周波数を低下させる。具体的に、マルチコアプロセッサシステム１００は、ＣＰＵ＃０、ＣＰＵ＃１のクロック周波数を低下させる。
【００６７】
符号５０２での時刻ｔ1〜時刻ｔHD3におけるＣＰＵ＃０は、デバイス＃Ｈ０に依存する処理と、メモリコントローラまたはキャッシュコヒーレンシ機構といったＣＰＵのクロック周波数に影響しない処理であるため、符号５０１で示した処理時間に変更がない。ＣＰＵ＃１の動作については、ＣＰＵ＃１のクロック周波数が低下しているためアプリ１の処理が遅くなり、デバイス＃Ｈ０に利用要求を通知する時刻が、符号５０１で示した時刻ｔHD4よりも後の時刻である時刻ｔHD4’となる。
【００６８】
しかしながら、図５のように、複数のＣＰＵが１つのデバイスに頻繁にアクセスする場合、デバイスからの応答待ちがボトルネックとなるため、許可待ち状態の時間が短くなるだけで、マルチコアプロセッサシステム１００の処理性能は低下しない。符号５０２での例にて、ＣＰＵ＃１が時刻ｔHD4’にて利用要求の通知後に利用許可を受ける時刻は、ＣＰＵ＃０の読込処理に対する時刻ｔHD5の後である時刻ｔHD6であり、符号５０１で示す動作と同じタイミングである。したがって、マルチコアプロセッサシステム１００の処理性能は変わらない。
【００６９】
また、ＣＰＵ＃０は、時刻ｔHD5以降でアプリ０を続行する。ＣＰＵ＃０のクロック周波数は、符号５０１で動作したクロック周波数より低下しているためアプリ０の処理が遅くなり、デバイス＃Ｈ０への利用要求の時刻が、符号５０１で示した時刻ｔHD8よりも後の時刻である時刻ｔHD8’となる。利用要求の時刻が遅れても、デバイス＃Ｈ０から利用許可を受ける時刻は時刻ｔHD10のままであり、符号５０１で示す動作と同じタイミングであるため、マルチコアプロセッサシステム１００の処理性能は変わらない。
【００７０】
このように、マルチコアプロセッサシステム１００は、マルチコアプロセッサシステム１００全体の処理性能を維持しつつハードウェア調停を行うデバイスを利用しているＣＰＵのクロック周波数を、特定のクロック周波数まで落とすことができる。特定のクロック周波数とは、たとえば、符号５０２の例では、ＣＰＵ＃１によるアプリ１の利用要求を通知する時刻ｔHD4’が時刻ｔHD5と一致する状態となるクロック周波数である。
【００７１】
この特定のクロック周波数より下げた場合、デバイス＃Ｈ０のＣＰＵ＃１への利用許可の通知が、時刻ｔHD6より遅くなるため、マルチコアプロセッサシステム１００の処理性能が低下することになる。したがって、競合中のＣＰＵのクロック周波数が特定のクロック周波数に設定された状態が、マルチコアプロセッサシステム１００の処理性能を落とさずに最も消費電力を削減できる状態となる。
【００７２】
なお、マルチコアプロセッサシステム１００の処理性能を落とさないクロック周波数の範囲については、デバイス群２０５をＣＰＵｓ１０５で同時利用させて、同時利用数とクロック周波数とを変化させ、処理性能が低下していないかを判断する。処理性能が低下していない場合、マルチコアプロセッサシステム１００は、処理性能が低下しなかったときの同時利用数とクロック周波数を周波数テーブルに記憶する。
【００７３】
図６は、ハードウェアによる調停を受けるデバイス＃Ｈ０のクロック周波数を上げた場合の動作シーケンスを示す説明図である。図６では、符号５０１の状態から、デバイス＃Ｈ０のクロック周波数を上げて、処理速度を速くした状態である。また、図６にて、アプリ０、アプリ１の開始時刻は、図５で示した時刻ｔ1と同時刻である。
【００７４】
また、デバイス＃Ｈ０のクロック周波数を上げた場合の調停のシーケンスは、符号５０１で示した調停のシーケンスと各処理が実行される時刻を除いて等しくなる。具体的には、図６で示す時刻ｔHU2〜時刻ｔHU11を、時刻ｔHD2〜時刻ｔHD11に置き換えることで、図６で示すシーケンスと符号５０１で示したシーケンスは、処理が実行される時刻を除いて等しい。したがって、図６における各時刻におけるＣＰＵ＃０、ＣＰＵ＃１、デバイス＃Ｈ０の処理内容の説明は、符号５０１で示す対応する時刻での処理と等しいため、説明を省略する。下記説明では、デバイス＃Ｈ０の処理速度が速くなったことにより、処理を行う時刻が変更される箇所について説明を行う。
【００７５】
デバイス＃Ｈ０は、クロック周波数が上がったことにより処理速度が速くなる。図６の例では、時刻ｔHU3にてＣＰＵ＃０が読込要求を行うと、デバイス＃Ｈ０は、図５で示した時刻ｔHD5より早い時刻である時刻ｔHU5にて読込処理を完了して処理結果を通知する。さらに、デバイス＃Ｈ０は、時刻ｔHD6より早い時刻である時刻ｔHU6にて利用許可をＣＰＵ＃１に通知する。
【００７６】
続けて、ＣＰＵ＃１は、時刻ｔHU7にて、デバイス＃Ｈ０に読込要求を通知する。読込要求を受け取ったデバイス＃Ｈ０は、読込処理を実行し、時刻ｔHU9にて処理結果をＣＰＵ＃１に通知する。デバイス＃Ｈ０のクロック周波数が上がっているため、デバイス＃Ｈ０は、読込処理を、時刻ｔHD7〜時刻ｔHD9より短い時間となる時刻ｔHU7〜時刻ｔHU9で完了する。
【００７７】
また、ＣＰＵ＃０は、時刻ｔHU8にて利用要求をデバイス＃Ｈ０に通知する。通知を受けたデバイス＃Ｈ０は、読込処理が完了後の時刻ｔHU10にて、利用許可をＣＰＵ＃０に通知する。利用許可を受け取ったＣＰＵ＃０は、時刻ｔHU11にてデバイス＃Ｈ０に対して読込要求を通知する。このとき、許可待ち時間となる時刻ｔHU8〜時刻ｔHU10は、符号５０１で示したＣＰＵ＃０の許可待ち時間となる時刻ｔHD8〜時刻ｔHD10より短くなる。
【００７８】
このように、デバイス＃Ｈ０のクロック周波数を上げたことでデバイス＃Ｈ０の消費電力は増加するが、マルチコアプロセッサシステム１００全体の処理時間が短くなるため、マルチコアプロセッサシステム１００の消費電力量を小さくすることができる。なお、具体的な消費電力量の計算例は、図９にて後述する。
【００７９】
図７は、ソフトウェアによる調停を受けるデバイス＃Ｓ０の動作シーケンスを示す説明図である。図７では、ＣＰＵ＃０がアプリ０を実行し、ＣＰＵ＃１が、アプリ１、アプリ２を時分割で実行している。また、アプリ０〜アプリ２は、デバイス＃Ｓ０を利用するアプリであると想定する。さらに、ＣＰＵｓ１０５がデバイス＃Ｓ０にアクセスする場合に、ＯＳの排他アクセスを実現するライブラリを用いて調停を行うことを想定する。排他アクセスを実現するライブラリとしては、ミューテックス、セマフォ等が存在する。
【００８０】
また、ＯＳの動作としては、様々な実装形態が存在する。たとえば、一つのＣＰＵで実行しているＯＳが、他のＣＰＵ全てを管理してもよい。または、ＯＳがＣＰＵｓ１０５の各々で実行され、そのうち特定のＯＳが、他のＣＰＵで実行するＯＳを管理してもよい。どのような実装であっても、マルチコアプロセッサシステム１００で実行中のアプリのうち、１つのアプリにデバイスへの排他アクセスを許可するため、図７では、ＯＳを１つに纏めて表示している。
【００８１】
時刻ｔS1では、ＣＰＵ＃０がアプリ０を実行し、ＣＰＵ＃１がアプリ１を実行している。アプリ２は割当待ち状態である。時刻ｔS2にて、アプリ０は、デバイス＃Ｓ０の利用要求をＯＳに通知する。利用要求を受け取ったＯＳは、時刻ｔS2の時点で他のアプリがデバイス＃Ｓ０を利用していないと判断し、時刻ｔS3にて、アプリ０に利用許可を通知する。
【００８２】
なお、ソフトウェアで調停する場合は、ハードウェアで調停する場合と異なり、利用許可を受けたアプリは、複数回デバイスを利用することができる。また、利用許可を受けたアプリは、デバイスに処理要求を通知した後も自身の処理を継続することが可能である。もし、利用許可を受けたアプリがデバイスの処理結果を受け取ってない時点で自身の処理にてデバイスの処理結果を用いたい場合、利用許可を受けたアプリは、デバイスの処理結果を受け取るまで待つ。最終的に、利用許可を受けたアプリは、デバイスの利用が終了した後にＯＳに開放通知を行いデバイスの利用終了を宣言する。
【００８３】
時刻ｔS3にて利用許可を受け取ったアプリ０は、時刻ｔS4にて、処理要求の一つである読込要求をデバイス＃Ｓ０に通知し、自身の処理を続行する。アプリ０は、時刻ｔS7にて、自身の処理の続行中に読込処理の結果を待つため、処理待ち状態になる。
【００８４】
また、時刻ｔS5にて、アプリ１が利用要求をＯＳに通知する。アプリ１からの利用要求を受けたＯＳは、時刻ｔS5の時点で他のアプリがデバイス＃Ｓ０を利用していると判断し、アプリ１を許可待ち状態に設定する。また、ＯＳは、時刻ｔS6にて、許可待ち状態となったアプリ１の代わりに実行するアプリを決定するためスケジュール処理を行う。スケジュール処理を行った結果、ＯＳは、アプリ２をＣＰＵ＃１に実行させる。
【００８５】
時刻ｔS4にて読込要求を受け取ったデバイス＃Ｓ０は、時刻ｔS8にて処理結果を通知する。処理結果を受け取ったアプリ０は、時刻ｔS9にて、再びデバイス＃Ｓ０に対して読込要求を通知し、時刻ｔS12にて処理待ち状態になる。
【００８６】
また、時刻ｔS10にて、アプリ２が利用要求をＯＳに通知する。アプリ２からの利用要求を受けたＯＳは、時刻ｔS10の時点で他のアプリがデバイス＃Ｓ０を利用していると判断する。また、ＯＳは、時刻ｔS11にて、アプリ２の代わりに実行するアプリを決定するためスケジュール処理を行う。スケジュール処理を行った結果、ＣＰＵ＃１に実行させるアプリがないと判断したＯＳは、ＣＰＵ＃１の動作を停止させる。
【００８７】
時刻ｔS9にて読込要求を受け取ったデバイス＃Ｓ０は、時刻ｔS13にて処理結果を通知する。処理結果を受け取った後、アプリ０は、時刻ｔS14にてデバイス＃Ｓ０の解放通知をＯＳに通知する。解放通知を受け取ったＯＳは、時刻ｔS15にて、許可待ちとなっているアプリのうち、最初に許可待ちとなったアプリ１に停止解除を通知しつつ、デバイス＃Ｓ０の利用許可を通知する。停止解除とデバイス＃Ｓ０の利用許可を受け取ったアプリ１は、処理を続行する。アプリ２は許可待ち状態となる。
【００８８】
図８は、ソフトウェアによる調停を受けるデバイス＃Ｓ０のクロック周波数を上げた場合の動作シーケンスを示す説明図である。図８では、図７のデバイス＃Ｓ０のクロック周波数を上げて、処理速度を速くした状態である。また、図８にて、アプリ０〜アプリ２の開始時刻は、図７で示した時刻ｔS1と同時刻である。
【００８９】
また、デバイス＃Ｓ０のクロック周波数を上げた場合の調停のシーケンスは、図７で示した調停のシーケンスと各処理が実行される時刻を除いて等しくなる。具体的には、図８で示す時刻ｔSU8〜時刻ｔSU15を、時刻ｔS8〜時刻ｔS15に置き換えることで、図８で示すシーケンスと図７で示したシーケンスは、処理が実行される時刻を除いて等しくなる。したがって、図８における各時刻におけるアプリ０〜アプリ２、ＯＳ、デバイス＃Ｈ０の処理内容の説明は、図７で示す対応する時刻での処理と等しいため、説明を省略する。下記説明では、デバイス＃Ｓ０の処理速度が速くなったことにより、処理を行う時刻が変更される箇所について説明を行う。
【００９０】
デバイス＃Ｓ０は、時刻ｔS2による利用要求にて、クロック周波数が上がったことにより処理速度が速くなる。図８の例では、時刻ｔS4にてアプリ０が読込要求を行うと、デバイス＃Ｓ０は、図７で示した時刻ｔS8より早い時刻である時刻ｔSU8にて読込処理を完了して処理結果をアプリ０に通知する。これにより、時刻ｔS7〜時刻ｔSU8となるアプリ０の処理待ち時間が、図７での処理待ち状態の時間となる時刻ｔS7〜時刻ｔS8よりも短くなる。
【００９１】
同様に、時刻ｔSU9にてアプリ０が再度読込要求を行うと、デバイス＃Ｓ０は、時刻ｔSU13にて読込処理を完了して処理結果をアプリ０に通知する。これにより、時刻ｔSU12〜時刻ｔSU13となるアプリ０の処理待ち時間が、図７での処理待ち状態の時間となる時刻ｔS12〜時刻ｔS13よりも短くなる。また、時刻ｔS5〜時刻ｔSU15となるアプリ１の許可待ち状態の時間と動作停止中の時間が、図７での許可待ち状態の時間と動作停止中の時間である時刻ｔS5〜時刻ｔS15よりも短くなる。
【００９２】
このように、デバイス＃Ｓ０のクロック周波数を上げたことでデバイス＃Ｓ０の消費電力は増加するが、マルチコアプロセッサシステム１００全体の処理時間が短くなるため、マルチコアプロセッサシステム１００の消費電力量を小さくすることができる。なお、具体的な消費電力量の計算例は、図１０にて後述する。
【００９３】
図９は、ハードウェアによる調停を受けるデバイス群２０５のクロック周波数の変化に伴う消費電力量の説明図である。図９では、ＣＰＵ＃ｘ〜ＣＰＵ＃ｙのＣｈ個のＣＰＵが、デバイス＃Ｈｚに頻繁にアクセスするアプリを実行中であると想定する。初めに、ＣＰＵｓ１０５のクロック周波数を下げることによる消費電力量の差分ΔＷCPUは、下記（２）式にて計算できる。
【００９４】
【数２】
2012086040.tif 000004
【００９５】
ここで、ｆCPUNEWは、変更後のＣＰＵ＃ｘ〜ＣＰＵ＃ｙのクロック周波数を示し、ｆCPUORGは、変更前のＣＰＵ＃ｘ〜ＣＰＵ＃ｙのクロック周波数を示し、ｔは、競合を起こしている時間を示している。また、デバイス＃Ｈｚのクロック周波数を上げることによる消費電力量の差分ΔＷDEVは、下記（３）式にて計算できる。
【００９６】
【数３】
2012086040.tif 000005
【００９７】
ここで、ｆDEVzNEWは、変更後のデバイス＃Ｈｚのクロック周波数を示し、ｆDEVzORGは、変更前のデバイス＃Ｈｚのクロック周波数を示し、Δｔは、処理速度の上昇によって短縮された処理時間を示す。また、（３）式の第１項は、デバイス＃Ｈｚによる消費電力量の増加分を示しており、第２項は、処理時間の短縮による消費電力量の削減分を示している。（２）式、（３）式を用いて、デバイス＃Ｈｚのクロック周波数の変化に伴うマルチコアプロセッサシステム１００全体の消費電力量の差分ΔＷは、下記（４）式にて計算できる。
【００９８】
【数４】
2012086040.tif 000006
【００９９】
（２）式〜（４）式を用いて、開発装置等が、設計段階にて競合アクセス数Ｃｈに応じた消費電力量Ｗが最小となるＣＰＵ＃ｘ〜ＣＰＵ＃ｙのクロック周波数と、デバイス＃Ｈｚのクロック周波数とを算出する。算出された結果は、クロック周波数テーブル３０１＃Ｈｚに格納される。なお、（２）式〜（４）式にて、ｔは一定であり、Δｔは、クロック周波数の変化率（（ｆDEVzNEW−ｆDEVzORG）／ｆDEVzORG）とｔに比例する。したがって、（２）式〜（４）式は、最初に測定した周波数と電力の対応と、ＣＰＵとデバイスのクロック周波数と、デバイス群２０５を利用しているＣＰＵ数をパラメータとして算出することができる。
【０１００】
図１０は、ソフトウェアによる調停を受けるデバイス群２０６のクロック周波数の変化に伴う消費電力量の説明図である。図１０では、ＣＰＵ＃ｘ〜ＣＰＵ＃ｙのＣｓ個のＣＰＵが、デバイス＃Ｓｚを利用するアプリによって、デバイス＃Ｓｚに対する排他アクセスを要求していると想定する。デバイス＃Ｓｚのクロック周波数の変化に伴うマルチコアプロセッサシステム１００全体の消費電力量の差分ΔＷは、下記（５）式にて計算できる。
【０１０１】
【数５】
2012086040.tif 000007
【０１０２】
ここで、（５）式の第１項は、デバイス＃Ｓｚのクロック周波数を上げたことによる消費電力量の増加分を示している。（５）式の第２項は、処理時間が短縮したことによるデバイス＃Ｓｚの削減分と、ＣＰＵｓ１０５のうちデバイス＃Ｓｚを利用するＣＰＵの消費電力量の削減分を示している。（５）式の第３項は、ＣＰＵｓ１０５のうち行う処理がない排他アクセス数Ｃｓ個分のＣＰＵの動作を止めたことによる消費電力量の削減分を示している。
【０１０３】
（５）式を用いて、開発装置等が、設計段階にて排他アクセス数Ｃｓに応じた消費電力量Ｗが最小となるＣＰＵ＃ｘ〜ＣＰＵ＃ｙのクロック周波数と、デバイス＃Ｓｚのクロック周波数とを算出する。算出された結果は、クロック周波数テーブル３０１＃Ｓｚに格納される。
【０１０４】
図１１は、消費電力量の変化例と、実施の形態１におけるクロック周波数テーブル３０１の記憶内容の一例を示す説明図である。図１１では、競合中のデバイスがデバイス＃Ｈ０である場合の消費電力量の変化量を示すグラフ１１０１と、グラフ１１０１の値を基に生成されたクロック周波数テーブル３０１＃Ｈ０と、クロック周波数標準値テーブル３０２を示している。
【０１０５】
グラフ１１０１は、競合中のデバイスがデバイス＃Ｈ０である場合のマルチコアプロセッサシステム１００全体の消費電力量の変化量を示しており、横軸が競合中のＣＰＵのクロック周波数を示しており、縦軸が消費電力量の増減量を示している。また、ＰＭＵ１０７で変更できるクロック周波数としては、ＣＰＵｓ１０５のクロック周波数の標準値である１０００［ＭＨｚ］と、５００［ＭＨｚ］、２５０［ＭＨｚ］であると想定する。また、デバイス＃Ｈ０のクロック周波数の変更可能な値としては、標準値である４００［ＭＨｚ］と、６００［ＭＨｚ］、８００［ＭＨｚ］であると想定する。
【０１０６】
クロック周波数テーブル３０１＃Ｈ０は、競合アクセス数、ＣＰＵクロック周波数、ＣＰＵ電圧、デバイスクロック周波数、デバイス電圧、という５つのフィールドを含む。競合アクセス数フィールドには、ＣＰＵｓ１０５のうち、デバイス＃Ｈ０に対して競合中のＣＰＵ数が格納される。ＣＰＵクロック周波数フィールドには、競合アクセス数に対応したマルチコアプロセッサシステム１００全体の消費電力量が最も削減されるＣＰＵのクロック周波数の設定値が格納される。ＣＰＵ電圧フィールドには、ＣＰＵクロック周波数フィールドの格納値でＣＰＵのクロック周波数が設定された場合に、安定動作可能な最低電圧の値が格納される。
【０１０７】
デバイスクロック周波数フィールドには、競合アクセス数に対応したマルチコアプロセッサシステム１００全体の消費電力量が最も削減されるデバイス＃Ｈ０のクロック周波数の設定値が格納される。デバイス電圧フィールドには、デバイスクロック周波数フィールドの格納値でデバイスのクロック周波数が設定された場合に、安定動作可能な最低電圧の値が格納される。たとえば、ＣＰＵクロック周波数フィールドに５００［ＭＨｚ］、ＣＰＵ電圧フィールドに１．１５［Ｖ］と設定されていれば、ＰＭＵ１０７は、競合中のＣＰＵのクロック周波数を５００［ＭＨｚ］、電圧を１．１５［Ｖ］に設定する。
【０１０８】
クロック周波数標準値テーブル３０２は、デバイス名称、クロック周波数という２つのフィールドを含む。デバイス名称フィールドには、ＣＰＵｓ１０５、デバイス＃Ｈ０〜デバイス＃ＨＭ、デバイス＃Ｓ０〜デバイス＃ＳＬの名称、またはＩＤ（ＩＤｅｎｔｉｆｉｃａｔｉｏｎ）等といったデバイスを一意に特定可能な値が格納される。クロック周波数フィールドには、デバイス名称フィールドに格納されたＣＰＵｓ１０５、またはデバイス群２０５、デバイス群２０６のクロック周波数の標準値が格納されている。
【０１０９】
たとえば、ＣＰＵｓ１０５のクロック周波数の標準値として、１０００［ＭＨｚ］が格納されている。なお、クロック周波数標準値テーブル３０２にも、クロック周波数の標準値に対応する、安定動作可能な最低電圧の値を格納するフィールドがあってもよい。
【０１１０】
たとえば、競合アクセス数＝２である場合は、ＣＰＵのクロック周波数が５００［ＭＨｚ］でありデバイス＃Ｈ０のクロック周波数が４００［ＭＨｚ］の時に、消費電力量の削減量が最も大きくなる。したがって、クロック周波数テーブル３０１＃Ｈ０の競合アクセス数＝２のレコードには、ＣＰＵ数クロック周波数＝５００［ＭＨｚ］、デバイスクロック周波数＝４００［ＭＨｚ］がそれぞれ格納される。なお、グラフ１１０１にて、競合アクセス数が２となる場合のＣＰＵクロック周波数＝２５０［ＭＨｚ］となる点がプロットしていないのは、ＣＰＵクロック周波数＝２５０［ＭＨｚ］にてアクセス競合が解消し処理性能が低下してしまうことを示している。
【０１１１】
同様に、競合アクセス数＝３である場合は、ＣＰＵのクロック周波数が２５０［ＭＨｚ］でありデバイス＃Ｈ０のクロック周波数が４００［ＭＨｚ］の時に、消費電力量の削減量が最も大きくなる。したがって、クロック周波数テーブル３０１＃Ｈ０の競合アクセス数＝３のレコードには、ＣＰＵ数クロック周波数＝２５０［ＭＨｚ］、デバイスクロック周波数＝４００［ＭＨｚ］がそれぞれ格納される。
【０１１２】
同様に、競合アクセス数＝４である場合は、ＣＰＵのクロック周波数が２５０［ＭＨｚ］でありデバイス＃Ｈ０のクロック周波数が６００［ＭＨｚ］の時に、消費電力量の削減量が最も大きくなる。したがって、クロック周波数テーブル３０１＃Ｈ０の競合アクセス数＝４のレコードには、ＣＰＵ数クロック周波数＝２５０［ＭＨｚ］、デバイスクロック周波数＝６００［ＭＨｚ］がそれぞれ格納される。
【０１１３】
このように、マルチコアプロセッサシステム１００は、クロック周波数テーブル３０１、クロック周波数標準値テーブル３０２を参照し、競合アクセス数に応じたＣＰＵｓ１０５のうち競合中のＣＰＵのクロック周波数と対象デバイスのクロック周波数を設定する。後述する図１２にて、競合アクセス数に応じた競合中のＣＰＵのクロック周波数と対象デバイスのクロック周波数の設定例を示す。
【０１１４】
なお、図１１では、ハードウェアによる調停を受けるデバイス群２０５に対して説明したが、ソフトウェアによる調停を受けるデバイス群２０６でも、同様の操作を行い、クロック周波数テーブル３０１＃Ｓｘを生成する。なお、クロック周波数テーブル３０１＃Ｓｘは、競合アクセス数フィールドの代わりに排他アクセス数フィールドを持つ。
【０１１５】
また、（５）式より、デバイス群２０６に対して排他アクセスが競合した場合、排他アクセスが競合中のＣＰＵに関して、クロック周波数を標準値に設定する、または、動作を停止するといった制御を行い、クロック周波数を低く設定するという制御を行わない。したがって、クロック周波数テーブル３０１＃ＳｘのＣＰＵ数クロック周波数フィールドは、存在しなくてもよい。
【０１１６】
図１２は、デバイス＃Ｈ０に対する競合発生時におけるＣＰＵとクロック周波数を示す説明図である。図１２では、ＣＰＵ＃０〜ＣＰＵ＃３に、デバイス＃Ｈ０に頻繁にアクセスするアプリ０〜アプリ３が割り当てられることを想定する。なお、ＣＰＵ＃０〜ＣＰＵ＃３とデバイス＃Ｈ０との利用要求、利用許可、読込要求、処理結果といった通知に関しては、図５、図６で説明を行っているため、図１２では説明を省略する。図１２では、競合アクセス数Ｃｈの変化に伴ったＣＰＵ＃０〜ＣＰＵ＃３のクロック周波数とデバイス＃Ｈ０のクロック周波数の変化について説明を行う。
【０１１７】
時刻ｔ1〜時刻ｔ2では、ＣＰＵ＃０は、アプリ０が割り当てられており、ＣＰＵ＃１〜ＣＰＵ＃３には、デバイス＃Ｈ０に頻繁にアクセスを行わないアプリが割り当てられている。したがって、時刻ｔ1〜時刻ｔ2での競合アクセス数Ｃｈは１であり、競合が発生していない状態である。マルチコアプロセッサシステム１００は、ＣＰＵ＃０〜ＣＰＵ＃３のクロック周波数を１０００［ＭＨｚ］に設定し、デバイス＃Ｈ０のクロック周波数を４００［ＭＨｚ］に設定する。
【０１１８】
時刻ｔ2にて、ＣＰＵ＃１にアプリ１が割り当てられると、競合アクセス数Ｃｈが２となる。したがって、マルチコアプロセッサシステム１００は、時刻ｔ2にて、ＣＰＵ＃０、ＣＰＵ＃１のクロック周波数を、５００［ＭＨｚ］に設定する。なお、デバイス＃Ｈ０のクロック周波数は、競合アクセス数Ｃｈ＝２でも４００［ＭＨｚ］となる。また、デバイス＃Ｈ０に頻繁にアクセスを行わないアプリを実行中のＣＰＵ＃２、ＣＰＵ＃３のクロック周波数は、１０００［ＭＨｚ］のままである。
【０１１９】
続けて、時刻ｔ3にて、ＣＰＵ＃２にアプリ２が割り当てられると、競合アクセス数が３となる。したがって、マルチコアプロセッサシステム１００は、時刻ｔ3にて、ＣＰＵ＃０〜ＣＰＵ＃２のクロック周波数を、２５０［ＭＨｚ］に設定する。なお、デバイス＃Ｈ０のクロック周波数は、競合アクセス数＝３でも４００［ＭＨｚ］となる。また、デバイス＃Ｈ０に頻繁にアクセスを行わないアプリを実行中のＣＰＵ＃３のクロック周波数は、１０００［ＭＨｚ］のままである。
【０１２０】
続けて、時刻ｔ4にて、ＣＰＵ＃３にアプリ３が割り当てられると、競合アクセス数Ｃｈが４となる。したがって、マルチコアプロセッサシステム１００は、時刻ｔ4にて、ＣＰＵ＃０〜ＣＰＵ＃３のクロック周波数を、２５０［ＭＨｚ］に設定する。また、マルチコアプロセッサシステム１００は、デバイス＃Ｈ０のクロック周波数を６００［ＭＨｚ］に設定する。
【０１２１】
時刻ｔ5にて、ＣＰＵ＃０がアプリ０の割当を終了し、ＣＰＵ＃１がアプリ１の割当を終了すると、競合アクセス数Ｃｈが２となる。したがって、マルチコアプロセッサシステム１００は、時刻ｔ5にて、ＣＰＵ＃２、ＣＰＵ＃３のクロック周波数を、５００［ＭＨｚ］に設定する。また、マルチコアプロセッサシステム１００は、デバイス＃Ｈ０のクロック周波数を４００［ＭＨｚ］に設定する。また、ＣＰＵ＃０、ＣＰＵ＃１は、時刻ｔ5以降ではデバイス＃Ｈ０に頻繁にアクセスを行わないアプリを実行すると想定する。したがって、マルチコアプロセッサシステム１００は、ＣＰＵ＃０、ＣＰＵ＃１のクロック周波数を１０００［ＭＨｚ］に設定する。
【０１２２】
時刻ｔ6にて、ＣＰＵ＃２がアプリ２の割当を終了すると、競合アクセス数Ｃｈが１となる。したがって、マルチコアプロセッサシステム１００は、時刻ｔ6にて、ＣＰＵ＃３のクロック周波数を、１０００［ＭＨｚ］に設定する。なお、デバイス＃Ｈ０のクロック周波数は、競合アクセス数Ｃｈ＝１でも４００［ＭＨｚ］となる。また、ＣＰＵ＃２は、時刻ｔ6以降ではデバイス＃Ｈ０に頻繁にアクセスを行わないアプリを実行すると想定する。したがって、マルチコアプロセッサシステム１００は、ＣＰＵ＃２のクロック周波数を１０００［ＭＨｚ］に設定する。
【０１２３】
このように、マルチコアプロセッサシステム１００は、デバイス群２０５の競合に対して、デバイス群２０５に頻繁にアクセスするアプリが割り当てられたら競合アクセス数Ｃｈを１増加し、割当終了したら競合アクセス数Ｃｈを１減少する。そして、マルチコアプロセッサシステム１００は、競合アクセス数Ｃｈに応じて、クロック周波数テーブル３０１を参照し、競合中のＣＰＵと、対象デバイスのクロック周波数を設定する。
【０１２４】
なお、図示していないが、マルチコアプロセッサシステム１００は、ソフトウェアで調停するデバイス群２０６の競合に対してもほぼ等しい動作を行う。具体的な差分として、マルチコアプロセッサシステム１００は、デバイス群２０６に対する利用要求を受け付けた際に、割り当てるアプリがなくＣＰＵが停止した場合、排他アクセス数Ｃｓを１増加する。また、マルチコアプロセッサシステム１００は、利用解放通知を受け付けて、ＣＰＵの停止を解除した場合、排他アクセス数Ｃｓを１減少する。
【０１２５】
マルチコアプロセッサシステム１００は、図１１に示したクロック周波数テーブル３０１、クロック周波数標準値テーブル３０２を利用して、図１３〜図１６に示す処理を実行する。また、スケジューリング部３０３、排他制御部３０４、ＤＶＦＳ制御部３０５の各処理は、ＣＰＵｓ１０５に含まれる全てのＣＰＵによって実行されるが、図１３〜図１６ではＣＰＵ＃０が実行することを想定して説明を行う。
【０１２６】
図１３は、実施の形態１におけるスケジューリング部３０３の処理を示すフローチャート（その１）である。スケジューリング部３０３の処理は、ＣＰＵ＃０にアプリの割当を決定する契機に都度実行される。具体的には、スケジューリング部３０３は、複数のアプリがタイムスライスで切り替えられている場合、タイムスライス時間が満了した都度実行される。また、スケジューリング部３０３は、排他制御部３０４からの要求で実行される場合もある。
【０１２７】
ＣＰＵ＃０は、自ＣＰＵに割り当てるアプリを決定する（ステップＳ１３０１）。決定後、ＣＰＵ＃０は、割当可能なアプリが存在するか否かを判断する（ステップＳ１３０２）。割当可能なアプリが存在しない場合（ステップＳ１３０２：Ｎｏ）、ＣＰＵ＃０は、自ＣＰＵ内にデバイスに対して許可待ち状態となっているアプリが存在するか否かを判断する（ステップＳ１３０３）。
【０１２８】
許可待ち状態となっているアプリが存在する場合（ステップＳ１３０３：Ｙｅｓ）、ＣＰＵ＃０は、対象デバイス識別情報と排他アクセス数Ｃｓを、排他アクセス数変更情報として生成する（ステップＳ１３０４）。なお、ステップＳ１３０３：Ｙｅｓのルートを通るのは、後述する図１５にて、排他制御部３０４からスケジューリング要求が到達した場合である。また、対象デバイス識別情報は、デバイス＃Ｈ０〜デバイス＃ＨＭ、デバイス＃Ｓ０〜デバイス＃ＳＬのうち、対象デバイスを一意に特定する情報である。対象デバイス識別情報として、たとえば、名称、ＩＤ等が挙げられる。
【０１２９】
また、排他アクセス数Ｃｓは、現在対象デバイスに対して待ち状態となった結果停止しているＣＰＵの数である。ステップＳ１３０４の時点では、自ＣＰＵはまだ停止していないが、ステップＳ１３０４の処理での排他アクセス数Ｃｓは、停止しているＣＰＵの数に、これから停止する自ＣＰＵの分として１を加えた数値を設定する。
【０１３０】
生成後、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に、排他アクセス数変更を通知する（ステップＳ１３０５）。なお、ステップＳ１３０５の処理にて行われる通知のデータには、排他アクセス数変更情報も含まれる。許可待ち状態となっているアプリが存在しない場合（ステップＳ１３０３：Ｎｏ）、またはステップＳ１３０５の処理後、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に、自ＣＰＵの動作を停止させるように通知する（ステップＳ１３０６）。通知後、ＣＰＵ＃０は、スケジューリング部３０３の処理を終了する。
【０１３１】
また、割当可能なアプリが存在する場合（ステップＳ１３０２：Ｙｅｓ）、ＣＰＵ＃０は、自ＣＰＵに割り当てられているアプリの変更を検出したか否かを判断する（ステップＳ１３０７）。変更を検出しなかった場合（ステップＳ１３０７：Ｎｏ）、ＣＰＵ＃０は、スケジューリング部３０３の処理を終了する。なお、変更を検出しなかった場合としては、たとえば、変更前のアプリと変更後のアプリとが一致する場合である。変更を検出した場合（ステップＳ１３０７：Ｙｅｓ）、ＣＰＵ＃０は、変更前のアプリを取得する（ステップＳ１３０８）。取得後の処理は、図１４にて後述する。
【０１３２】
図１４は、実施の形態１におけるスケジューリング部３０３の処理を示すフローチャート（その２）である。ステップＳ１３０８の終了後、ＣＰＵ＃０は、変更前のアプリがデバイスに頻繁にアクセスするアプリか否かを判断する（ステップＳ１４０１）。変更前のアプリがデバイスに頻繁にアクセスするアプリである場合（ステップＳ１４０１：Ｙｅｓ）、ＣＰＵ＃０は、変更前のアプリと同一のデバイスに頻繁にアクセスするアプリを実行するＣＰＵ識別情報を取得する（ステップＳ１４０２）。なお、ＣＰＵ識別情報とは、ＣＰＵを一意に特定する情報である。ＣＰＵ識別情報として、たとえば、名称、ＩＤ等が挙げられる。
【０１３３】
取得後、ＣＰＵ＃０は、対象デバイス識別情報と取得したＣＰＵ識別情報と競合アクセス数Ｃｈとを、競合アクセス数変更情報として生成する（ステップＳ１４０３）。なお、ＣＰＵ情報は、競合アクセス数Ｃｈ分存在する。また、ステップＳ１４０７の処理時点の競合アクセス数Ｃｈは、アプリが割り当てられる前の競合アクセス数Ｃｈより１小さい値となる。
【０１３４】
生成後、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に、競合アクセス数変更（ハードウェア）を通知する（ステップＳ１４０４）。なお、ステップＳ１４０４の処理にて行われる通知のデータには、競合アクセス数変更情報も含まれる。通知後、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に、自ＣＰＵのクロック周波数を標準値に設定するように通知する（ステップＳ１４０５）。
【０１３５】
ステップＳ１４０５の終了後、または、変更前のアプリがデバイスに頻繁にアクセスするアプリでない場合（ステップＳ１４０１：Ｎｏ）、ＣＰＵ＃０は、変更後のアプリがデバイスに頻繁にアクセスするアプリか否かを判断する（ステップＳ１４０６）。変更後のアプリがデバイスに頻繁にアクセスするアプリである場合（ステップＳ１４０６：Ｙｅｓ）、ＣＰＵ＃０は、変更後のアプリと同じデバイスに頻繁にアクセスするアプリを実行するＣＰＵ識別情報を取得する（ステップＳ１４０７）。
【０１３６】
取得後、ＣＰＵ＃０は、対象デバイス情報と取得したＣＰＵ識別情報と競合アクセス数Ｃｈを、競合アクセス数変更情報として生成する（ステップＳ１４０８）。なお、ＣＰＵ情報は、競合アクセス数Ｃｈ分存在する。また、ステップＳ１４０８の処理時点の競合アクセス数Ｃｈは、変更前のアプリがデバイスに頻繁にアクセスするアプリでない場合、アプリが割り当てられる前の競合アクセス数より１大きい値となる。
【０１３７】
生成後、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に、競合アクセス数変更を通知する（ステップＳ１４０９）。なお、ステップＳ１４０９の処理にて行われる通知のデータには、競合アクセス数変更情報も含まれる。ステップＳ１４０９の終了後、または、変更後のアプリがデバイスに頻繁にアクセスするアプリでない場合（ステップＳ１４０６：Ｎｏ）、ＣＰＵ＃０は、スケジューリング部３０３の処理を終了する。
【０１３８】
図１５は、実施の形態１における排他制御部３０４の利用開始処理を示すフローチャートである。ＣＰＵ＃０は、対象デバイスの利用要求をアプリから受け付ける（ステップＳ１５０１）。受付後、ＣＰＵ＃０は、対象デバイスが他のアプリによって利用中か否かを判断する（ステップＳ１５０２）。対象デバイスが他のアプリによって利用中である場合（ステップＳ１５０２：Ｙｅｓ）、ＣＰＵ＃０は、要求元のアプリの状態を、対象デバイスに対する許可待ち状態として設定する（ステップＳ１５０３）。
【０１３９】
設定後、ＣＰＵ＃０は、スケジューリング部３０３にスケジューリング要求し（ステップＳ１５０４）、利用開始処理を終了する。なお、スケジューリング要求を受けたスケジューリング部３０３は、図１３、図１４で示した処理を実行する。
【０１４０】
対象デバイスが他のアプリによって利用中でない場合（ステップＳ１５０２：Ｎｏ）、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に対象デバイスの利用開始を通知する（ステップＳ１５０５）。なお、ステップＳ１４０５の処理にて行われる通知のデータには、排他アクセス数Ｃｓも含まれる。なお、ステップＳ１５０３の処理時点では、ステップＳ１５０２：Ｎｏのルートを通った時点で他のアプリによって利用中でないことから排他アクセス数Ｃｓ＝０となるため、排他アクセス数Ｃｓ＝１となる。通知後、ＣＰＵ＃０は、要求元のアプリに対象デバイスの利用許可を通知し（ステップＳ１５０６）、利用開始処理を終了する。
【０１４１】
図１６は、実施の形態１における排他制御部３０４の利用解放処理を示すフローチャートである。ＣＰＵ＃０は、対象デバイスを利用していたアプリから利用解放通知を受け付ける（ステップＳ１６０１）受付後、ＣＰＵ＃０は、対象デバイスに対する許可待ち状態となっているアプリが存在するかを判断する（ステップＳ１６０２）。許可待ち状態となっているアプリが存在する場合（ステップＳ１６０２：Ｙｅｓ）、ＣＰＵ＃０は、最初に許可待ち状態となったアプリを選択する（ステップＳ１６０３）。
【０１４２】
選択後、ＣＰＵ＃０は、選択されたアプリの割り当てられたＣＰＵが停止中か否かを判断する（ステップＳ１６０４）。停止中である場合（ステップＳ１６０４：Ｙｅｓ）、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に、割り当てられたＣＰＵの動作停止解除を通知する（ステップＳ１６０５）。通知後、または、選択されたアプリの割り当てられたＣＰＵが停止中でない場合（ステップＳ１６０４：Ｎｏ）、ＣＰＵ＃０は、対象デバイス識別情報と排他アクセス数Ｃｓを、排他アクセス数変更情報として生成する（ステップＳ１６０６）。なお、ステップＳ１６０６の処理にて行われる通知のデータには、排他アクセス数変更情報も含まれる。また、排他アクセス数Ｃｓは、ステップＳ１６０５の処理にてＣＰＵの動作停止解除を行ったため、停止を行う前より１少ない数となる。
【０１４３】
生成後、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に、排他アクセス数変更を通知する（ステップＳ１６０７）。通知後、ＣＰＵ＃０は、選択されたアプリの許可待ち状態を解除する（ステップＳ１６０８）。解除後、ＣＰＵ＃０は、選択されたアプリに対象デバイスの利用許可を通知し（ステップＳ１６０９）、利用解放処理を終了する。対象デバイスに対する許可待ち状態となっているアプリがない場合（ステップＳ１６０２：Ｎｏ）、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に、対象デバイスの利用終了を通知し（ステップＳ１６１０）、利用解放処理を終了する。
【０１４４】
図１７は、実施の形態１におけるＤＶＦＳ制御部３０５の処理を示すフローチャート（その１）である。ＤＶＦＳ制御部３０５の処理は、スケジューリング部３０３、または排他制御部３０４からの通知によって開始する。ＣＰＵ＃０は、スケジューリング部３０３、または排他制御部３０４からの通知を検出する（ステップＳ１７０１）。検出後、ＣＰＵ＃０は、通知種別を判断する（ステップＳ１７０２）。
【０１４５】
通知種別がＣＰＵクロック周波数標準値設定、または、ＣＰＵ動作停止解除である場合（ステップＳ１７０２：ＣＰＵクロック周波数標準値設定／ＣＰＵ動作停止解除）、ＣＰＵ＃０は、ＰＭＵ１０７を、通知されたＣＰＵのクロック周波数を標準値に設定するように制御する（ステップＳ１７０３）。なお、ステップＳ１７０３の処理が行われる契機としては、ステップＳ１４０５の処理からの通知、またはステップＳ１６０５の処理からの通知である。また、標準値の設定は、ＣＰＵ＃０がクロック周波数標準値テーブル３０２を参照することで行われる。指示後、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５の処理を終了する。
【０１４６】
通知種別がＣＰＵ動作停止である場合（ステップＳ１７０２：ＣＰＵ動作停止）、ＣＰＵ＃０は、ＰＭＵ１０７を、通知されたＣＰＵの動作停止を設定するように制御し（ステップＳ１７０４）、ＤＶＦＳ制御部３０５の処理を終了する。なお、ステップＳ１７０４の処理が行われる契機としては、ステップＳ１３０６の処理からの通知である。
【０１４７】
通知種別がデバイス利用開始、または、排他アクセス数変更である場合（ステップＳ１７０２：デバイス利用開始／排他アクセス数変更）、ＣＰＵ＃０は、クロック周波数テーブル３０１から、通知されたデバイス＃Ｓｘのクロック周波数テーブル３０１＃Ｓｘを選択する（ステップＳ１７０５）。なお、ステップＳ１７０５の処理が行われる契機としては、ステップＳ１３０５の処理からの通知と、ステップＳ１４０５の処理からの通知である。
【０１４８】
選択後、ＣＰＵ＃０は、クロック周波数テーブル３０１＃Ｓｘから、通知された排他アクセス数Ｃｓに対応するデバイスのクロック周波数の設定値を抽出する（ステップＳ１７０６）。抽出後、ＣＰＵ＃０は、ＰＭＵ１０７を、デバイス＃Ｓｘのクロック周波数を抽出したデバイスの設定値に設定するように制御し（ステップＳ１７０７）、ＤＶＦＳ制御部３０５の処理を終了する。
【０１４９】
通知種別がデバイス利用終了である場合（ステップＳ１７０２：デバイス利用終了）、ＣＰＵ＃０は、ＰＭＵ１０７を、通知された対象デバイスのクロック周波数を標準値に設定するように制御する（ステップＳ１７０８）。なお、ステップＳ１７０８の処理が行われる契機としては、ステップＳ１６１０の処理からの通知である。また、標準値の設定は、ＣＰＵ＃０がクロック周波数標準値テーブル３０２を参照することで行われる。指示後、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５の処理を終了する。通知種別が競合アクセス数変更である場合については、後述する図１８にて説明を行う。
【０１５０】
図１８は、実施の形態１におけるＤＶＦＳ制御部３０５の処理を示すフローチャート（その２）である。通知種別が競合アクセス数変更である場合（ステップＳ１７０２：競合アクセス数変更）、ＣＰＵ＃０は、クロック周波数テーブル３０１から、通知されたデバイス＃Ｈｘのクロック周波数テーブル３０１＃Ｈｘを選択する（ステップＳ１８０１）。なお、ステップＳ１８０１の処理が行われる契機としては、ステップＳ１４０４の処理からの通知と、ステップＳ１４０９の処理からの通知である。
【０１５１】
選択後、ＣＰＵ＃０は、クロック周波数テーブル３０１＃Ｈｘから、通知された競合アクセス数Ｃｈに対応するＣＰＵのクロック周波数の設定値とデバイスのクロック周波数の設定値を抽出する（ステップＳ１８０２）。抽出後、ＣＰＵ＃０は、ＰＭＵ１０７を、通知されたＣＰＵ群のクロック周波数を抽出したＣＰＵのクロック周波数に設定するように制御する（ステップＳ１８０３）。続けて、ＣＰＵ＃０は、ＰＭＵ１０７を、デバイス＃Ｈｘのクロック周波数を抽出したデバイスの設定値に設定するように制御し（ステップＳ１８０４）、ＤＶＦＳ制御部３０５の処理を終了する。
【０１５２】
以上説明したように、マルチコアプロセッサシステム、および電力制御方法によれば、コア群によるデバイスへのアクセス競合が発生する場合、ボトルネックとなるデバイスのクロック周波数を上げつつ競合が解消しない範囲で競合中コアのクロック周波数を下げる。これにより、マルチコアプロセッサシステムは、マルチコアプロセッサシステム全体の処理性能を下げずに省電力化できる。
【０１５３】
また、マルチコアプロセッサシステムは、競合発生が不可避である場合でも消費電力量を削減することができるため、消費電力あたりの性能比を向上することができる。また、マルチコアプロセッサシステムは、負荷の低い箇所の処理能力を下げる方向と、負荷の高い箇所の処理能力を上げる方向のうち、より消費電力量が削減する方向かをクロック周波数テーブルを参照することで判断することが可能である。
【０１５４】
また、マルチコアプロセッサシステムは、デバイスのクロック周波数を上げる場合、安定動作可能な最低電圧に設定し、コアのクロック周波数を下げる場合、安定動作可能な最低電圧に設定してもよい。消費電力量は、クロック周波数と電圧に比例するため、マルチコアプロセッサシステムの消費電力量を、クロック周波数を変化させた場合よりもさらに削減することができる。なお、マルチコアプロセッサシステムは、ＤＶＦＳ制御によってクロック周波数および電圧の変更が可能であることを想定していたが、電圧が変更できずに周波数のみが変更可能である場合であっても、消費電力量を削減することができる。
【０１５５】
また、デバイスのクロック周波数および電圧、ＣＰＵのクロック周波数および電圧は、マルチコアプロセッサシステム内の複数のコアの数、デバイスをアクセスするＣＰＵ数、ＣＰＵの消費電力、デバイスの消費電力に基づいて算出してもよい。これにより、マルチコアプロセッサシステム１００は、クロック周波数テーブル３０１を生成することができる。
【０１５６】
また、ＣＰＵのクロック周波数および電圧は、デバイスをアクセスするＣＰＵの処理性能を維持するための下限値より大きくてもよい。ＣＰＵのクロック周波数が処理性能を維持する下限値である場合、処理性能を維持しつつマルチコアプロセッサシステム１００全体の消費電力量を最も多く削減することができる。
【０１５７】
また、デバイスのアクセスは、競合アクセスまたは排他アクセスのうち、いずれかのアクセス方法であってもよい。マルチコアプロセッサシステム１００は、ハードウェアによる調停を受けるデバイスに対する競合アクセス、ソフトウェアによる調停を受ける排他アクセスのいずれであっても、処理性能を維持しつつ消費電力量を削減することができる。
【０１５８】
（実施の形態２の概要説明）
実施の形態１にかかるマルチコアプロセッサシステム１００では、１つのアプリが同時に複数のデバイスを利用することがないことを前提としていた。しかしながら、運用時には、１つのアプリが同時に複数のデバイスを利用することもある。したがって、実施の形態２にかかるマルチコアプロセッサシステム１００では、１つのアプリが同時に複数のデバイスを利用する場合について説明を行う。なお、実施の形態２にかかるマルチコアプロセッサシステム１００のハードウェアは、実施の形態１にかかるマルチコアプロセッサシステム１００と等しいため、説明を省略する。以下、実施の形態２にかかるマルチコアプロセッサシステム１００の機能について、図１９〜図２２を用いて説明を行う。
【０１５９】
また、実施の形態２にかかるマルチコアプロセッサシステム１００の機能についても、図３で示した実施の形態１にかかるマルチコアプロセッサシステム１００の機能とほぼ等しい。以下に、記憶部３０６、検出部３０７、特定部３０９、抽出部３１１、制御部３１２について説明を行う。
【０１６０】
記憶部３０６は、複数のデバイスの少なくともいずれか１つのデバイスに少なくとも２以上のコアがアクセス競合する状態ごとに、複数のデバイスに対する複数のクロック周波数とコア群のクロック周波数とを記憶する。なお、複数のデバイスに対する複数のクロック周波数は、複数のデバイスの処理速度を非アクセス競合時以上にさせるクロック周波数である。また、コア群のクロック周波数は、処理速度が非アクセス競合時以上となる複数のデバイスに対してアクセス競合を維持しつつコア数に対応するコア群の処理速度を非アクセス競合時以下にさせるクロック周波数である。なお、記憶部３０６は、具体的には図１９にて示すクロック周波数テーブル１９０１として記憶する。
【０１６１】
検出部３０７は、複数のデバイスにアクセスする複数のコアのうち、アクセス競合を発生させる特定のコア群をデバイスごとに検出する機能を有する。たとえば、検出部３０７は、デバイス＃Ｈ０に対してアクセス競合発生させるＣＰＵ＃１、ＣＰＵ＃２、デバイス＃Ｈ１に対してアクセス競合発生させるＣＰＵ＃０〜ＣＰＵ＃２を検出する。または、検出部３０７は、デバイス群２０５に対しアクセス競合を発生させる新たなＣＰＵが追加された場合に、新たなＣＰＵを検出してもよい。なお、検出されたＣＰＵは識別情報として、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０２といった記憶領域に記憶される。
【０１６２】
特定部３０９は、検出部３０７によって検出された特定のコア群によって、複数のデバイスに対するアクセス競合の状態を特定する機能を有する。たとえば、特定部３０９は、デバイス＃Ｈ０〜デバイス＃ＨＭのアクセス競合の状態として、デバイス＃Ｈ０〜デバイス＃ＨＭの各々に対して利用中のＣＰＵの識別情報群となるＨ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓを生成する。Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓに格納されるＣＰＵの識別情報群が特定のコア群となる。
【０１６３】
たとえば、検出部３０７が、デバイス＃Ｈ０に対してアクセス競合発生させるＣＰＵ＃１、ＣＰＵ＃２、デバイス＃Ｈ１に対してアクセス競合発生させるＣＰＵ＃０〜ＣＰＵ＃２を検出した状態を想定する。このとき、特定部３０９は、Ｈ０＿ＣＰＵｓ：ＣＰＵ＃１、ＣＰＵ＃２、Ｈ１＿ＣＰＵｓ：ＣＰＵ＃０〜ＣＰＵ＃２を生成する。また、特定部３０９は、Ｈ２＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓには、値が入っていないことを示すＮＵＬＬを格納する。さらに、検出部３０７は、Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓから、競合アクセス数Ｃｈ＃０〜Ｃｈ＃Ｍを生成し、複数のデバイスに対するアクセス競合の状態として特定する。
【０１６４】
また、特定部３０９は、検出部３０７によってデバイス群２０５に対しアクセス競合を発生させる新たなＣＰＵを検出した場合、現在のアクセス競合の状態に、新たなＣＰＵに対応するアクセス競合の状態を反映してもよい。なお、特定されたＨ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓは、ＲＡＭ２０２といった記憶領域に記憶される。
【０１６５】
抽出部３１１は、特定部３０９によって特定された複数のデバイスに対するアクセス競合の状態に応じた複数のデバイスに対応する複数のクロック周波数と特定のコア群のクロック周波数とを抽出する。なお、抽出部３１１は、記憶部３０６によって記憶された複数のデバイスに対応する複数のクロック周波数とコア群のクロック周波数とから、複数のデバイスに対応する複数のクロック周波数と特定のコア群のクロック周波数とを抽出する。
【０１６６】
たとえば、特定部３０９が、デバイス群２０５に対するアクセス競合の状態として、競合アクセス数Ｃｈ＃０＝２、Ｃｈ＃１＝３、としてアクセス競合の状態を特定した場合を想定する。このとき、抽出部３１１は、クロック周波数テーブル１９０１のレコード群のうち、競合アクセス数Ｃｈ＃０＝２、Ｃｈ＃１＝３となるレコードを抽出する。これにより。抽出部３１１は、抽出されたレコード内に含まれるデバイス群２０５のクロック周波数と、特定のＣＰＵ群のクロック周波数を抽出したことになる。
【０１６７】
たとえば、抽出したレコード内には、複数のデバイスに対する複数のクロック周波数として、デバイス＃Ｈ０：６００［ＭＨｚ］、デバイス＃Ｈ１：８００［ＭＨｚ］、…、デバイス＃ＨＭ：８００［ＭＨｚ］という値が格納されている。さらに、抽出したレコード内には、特定のＣＰＵ群のクロック周波数の値として、たとえば２００［ＭＨｚ］が格納されている。
【０１６８】
制御部３１２は、抽出部３１１によって抽出された複数のデバイスに対応する複数のクロック周波数にて複数のデバイスを動作させ、さらに、抽出された特定のコア群のクロック周波数にて特定のコア群を動作させる機能を有する。たとえば、制御部３１２は、ＰＭＵ１０７を、デバイス＃Ｈ０を６００［ＭＨｚ］、デバイス＃Ｈ１を８００［ＭＨｚ］、デバイス＃ＨＭを８００［ＭＨｚ］で動作させるように制御する。さらに、制御部３１２は、ＰＭＵ１０７を、特定のＣＰＵ群となるＣＰＵ＃０〜ＣＰＵ＃２のクロック周波数を２００［ＭＨｚ］で動作させるように制御する。
【０１６９】
このように、実施の形態２におけるマルチコアプロセッサシステム１００は、複数のデバイスにアクセスする複数のコアのうち、アクセス競合を発生させる特定のコア群をデバイスごとに検出する検出する。また、マルチコアプロセッサシステム１００は、複数のデバイスの少なくともいずれか１つのデバイスに少なくとも２以上のコアがアクセス競合する状態ごとに、複数のデバイスに対する複数のクロック周波数と、コア群のクロック周波数と、を記憶する。なお、複数のデバイスに対する複数のクロック周波数は、複数のデバイスの処理速度を非アクセス競合時以上にさせるクロック周波数である。コア群のクロック周波数は、処理速度が非アクセス競合時以上となる複数のデバイスに対してアクセス競合を維持しつつコア数に対応するコア群の処理速度を非アクセス競合時以下にさせる周波数である。
【０１７０】
続けて、マルチコアプロセッサシステム１００は、検出された特定のコア群によって、複数のデバイスに対するアクセス競合の状態を特定する。特定後、マルチコアプロセッサシステム１００は、特定された複数のデバイスに対するアクセス競合の状態に応じた複数のデバイスに対応する複数のクロック周波数と特定のコア群のクロック周波数とを抽出する。なお、抽出対象は、記憶された複数のデバイスに対応する複数のクロック周波数とコア群のクロック周波数となる。抽出後、マルチコアプロセッサシステム１００は、抽出された複数のデバイスに対応する複数のクロック周波数にて複数のデバイスを動作させ、抽出された特定のコア群のクロック周波数にて特定のコア群を動作させる。
【０１７１】
図１９は、実施の形態２におけるクロック周波数テーブル１９０１の記憶内容の一例を示す説明図である。実施の形態２におけるクロック周波数テーブル１９０１は、競合アクセス数、ＣＰＵクロック周波数、デバイスクロック周波数という３つのフィールドを含む。
【０１７２】
競合アクセス数フィールドには、デバイス群２０５の競合アクセス数が格納される。また、競合アクセス数フィールドはデバイス＃Ｈ０〜デバイス＃ＨＭごとに存在し、各デバイスの競合アクセス数が格納されている。なお、競合アクセス数フィールドには、０ｏｒ１、２、…、Ｎまでのうち、いずれかの値が格納される。クロック周波数テーブル１９０１には、複数のデバイスが同時利用される組合せが格納されるため、レコード数は、Ｎ＾（Ｍ＋１）−１数個となる。これにより、クロック周波数テーブル１９０１には、デバイス群２０５の少なくともいずれか１つのデバイスに少なくとも２以上のＣＰＵがアクセス競合する全ての状態を網羅することができる。
【０１７３】
ＣＰＵクロック周波数フィールドには、競合アクセス数フィールドに格納された各デバイスの競合アクセス数が一致した場合に、最も消費電力量が低くなるＣＰＵのクロック周波数が格納される。デバイスクロック周波数フィールドには、競合アクセス数フィールドに格納された各デバイスの競合アクセス数が一致した場合に、最も消費電力量が低くなるデバイスのクロック周波数が格納される。また、デバイスクロック数フィールドはデバイス＃Ｈ０〜デバイス＃ＨＭ各々に存在し、各デバイスのクロック周波数が格納されている。
【０１７４】
また、クロック周波数テーブル１９０１には、ＣＰＵクロック周波数フィールドの値でＣＰＵが動作する場合に、ＣＰＵが安定動作可能な最低電圧の値を格納するフィールドがあってもよい。さらに、クロック周波数テーブル１９０１のデバイス＃Ｈ０〜デバイス＃ＨＭにそれぞれに存在するデバイスクロック数フィールドの値で各デバイスが動作する場合に、デバイスが安定動作可能な最低電圧の値を格納するフィールドがあってもよい。
【０１７５】
なお、クロック周波数テーブル１９０１の生成方法は、実施の形態１におけるクロック周波数テーブル３０１の生成方法と同様である。具体的には、全てのデバイス競合の組み合わせに対して、処理性能を維持するＣＰＵの最小のクロック周波数を測定し、（２）式〜（４）式から、マルチコアプロセッサシステム１００全体の消費電力量が最小となるデバイス群２０５のクロック周波数を決定する。
【０１７６】
図２０は、ＣＰＵｓ１０５およびデバイス群２０５のクロック周波数の設定例を示す説明図である。図２０では、クロック周波数テーブル１９０１のレコード群から、適用するレコードを抽出する動作について説明する。符号２００１に示すマルチコアプロセッサシステム１００は、ＣＰＵ＃０が、デバイス＃Ｈ１に頻繁にアクセスするアプリを実行し、ＣＰＵ＃１、ＣＰＵ＃２が、デバイス＃Ｈ０とデバイス＃Ｈ１に頻繁にアクセスするアプリを実行する。なお、ＣＰＵ＃３〜ＣＰＵ＃Ｎといった他のＣＰＵは、デバイス群２０５に頻繁にアクセスするアプリを実行していないと想定する。
【０１７７】
マルチコアプロセッサシステム１００は、デバイス＃Ｈ０〜デバイス＃ＨＭの各々に対して利用中のＣＰＵの識別情報群となるＨ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓを生成する。Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓには、各デバイスを利用中のＣＰＵの識別情報が格納される。図２０の例では、Ｈ０＿ＣＰＵｓ：ＣＰＵ＃１、ＣＰＵ＃２となり、Ｈ１＿ＣＰＵｓ：ＣＰＵ＃０〜ＣＰＵ＃２となり、Ｈ２＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓはＮＵＬＬとなる。
【０１７８】
マルチコアプロセッサシステム１００は、Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓより、デバイスごとの競合アクセス数Ｃｈ＃０〜Ｃｈ＃Ｍを算出する。具体的に、競合アクセス数Ｃｈは、Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓ各々の要素数となる。図２０の例では、Ｃｈ＃０＝２、Ｃｈ＃１＝３、Ｃｈ＃２〜Ｃｈ＃Ｍは全て０となる。したがって、マルチコアプロセッサシステム１００は、クロック周波数テーブル１９０１のレコード群から、レコード２００２を抽出する。なお、対象デバイスの競合アクセス数が１である場合、競合が発生していないため、対象デバイスの競合アクセス数が０であるレコードを抽出する。
【０１７９】
マルチコアプロセッサシステム１００は、抽出されたレコードに応じて、ＣＰＵ＃０〜ＣＰＵ＃２のクロック周波数を１０００［ＭＨｚ］から２００［ＭＨｚ］に変更する。同様に、マルチコアプロセッサシステム１００は、デバイス＃Ｈ０のクロック周波数を４００［ＭＨｚ］から６００［ＭＨｚ］に変更し、デバイス＃Ｈ１のクロック周波数を４００［ＭＨｚ］から８００［ＭＨｚ］に変更する。
【０１８０】
なお、図２０では、１つのアプリが複数のデバイス群２０５を利用する場合について説明した。１つのアプリが複数のデバイス群２０６を利用する場合については、１度の排他処理で、複数のデバイスの利用権を取得、解放することができる。
【０１８１】
たとえば、利用権を取得する場合、ＣＰＵ＃０は、ステップＳ１４０５の処理にて、ＤＶＦＳ制御部３０５に対象デバイスの利用開始を、対象デバイス数回通知すればよい。なお、排他アクセス数Ｃｓは、デバイス群２０６分保持しておき、ＣＰＵ＃０は、対象デバイスに対応する排他アクセス数ＣｓをＤＶＦＳ制御部３０５に通知する。ＤＶＦＳ制御部３０５では、対象デバイスのクロック周波数テーブル３０１から、排他アクセス数Ｃｓに応じて対象デバイスのクロック周波数を抽出する。また、利用権を解放する場合も、ＣＰＵ＃０は、ステップＳ１６１０の処理にて、ＤＶＦＳ制御部３０５に対象デバイスの利用終了を対象デバイス数回通知すればよい。
【０１８２】
また、排他アクセス数が変更する場合に関しても、ＣＰＵ＃０は、ステップＳ１３０５の処理、ステップＳ１６０７の処理にて、ＤＶＦＳ制御部３０５に排他アクセス数変更通知を対象デバイス数回通知すればよい。
【０１８３】
以下、マルチコアプロセッサシステム１００は、クロック周波数テーブル１９０１を利用して、図２１に示すスケジューリング部３０３の処理、図２２に示すＤＶＦＳ制御部３０５の処理を実行する。また、実施の形態２にかかるスケジューリング部３０３の処理、ＤＶＦＳ制御部３０５の処理は、ＣＰＵｓ１０５に含まれる全てのＣＰＵによって実行されてもよいが、図２１、図２２ではＣＰＵ＃０が実行することを想定して説明を行う。
【０１８４】
図２１は、実施の形態２におけるスケジューリング部３０３の処理を示すフローチャート（その２）である。なお、実施の形態２におけるスケジューリング部３０３の処理を示すフローチャート（その１）に関しては、実施の形態１におけるスケジューリング部３０３の処理を示すフローチャート（その１）とステップＳ１３０５の処理以外等しいため、説明を省略する。また、実施の形態２におけるスケジューリング部３０３のステップＳ１３０５に対応する処理は、前述した、ＤＶＦＳ制御部３０５に排他アクセス数変更通知を対象デバイス数回通知する処理となる。
【０１８５】
ＣＰＵ＃０は、変更前のアプリがデバイスに頻繁にアクセスするアプリか否かを判断する（ステップＳ２１０１）。変更前のアプリがデバイスに頻繁にアクセスするアプリである場合（ステップＳ２１０１：Ｙｅｓ）、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に、自ＣＰＵのクロック周波数を標準値に設定するように通知する（ステップＳ２１０２）。通知後、または変更前のアプリがデバイスに頻繁にアクセスするアプリでない場合（ステップＳ２１０１：Ｎｏ）、ＣＰＵ＃０は、変更前のアプリ、または、変更後のアプリがデバイスに頻繁にアクセスするアプリかを判断する（ステップＳ２１０３）。
【０１８６】
変更前のアプリ、または、変更後のアプリがデバイスに頻繁にアクセスするアプリである場合（ステップＳ２１０３：Ｙｅｓ）、ＣＰＵ＃０は、変更後のアプリが頻繁にアクセスするデバイス群を、変更後のデバイス群として取得する（ステップＳ２１０４）。なお、変更後のアプリがデバイスに頻繁にアクセスするアプリでない場合は、変更後のデバイス群は空集合となる。
【０１８７】
変更後のデバイス群を取得後、ＣＰＵ＃０は、自ＣＰＵの識別情報と、変更後のデバイス群と、を競合アクセス数変更情報として生成する（ステップＳ２１０５）。生成後、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５に、競合アクセス数変更を通知し（ステップＳ２１０６）、スケジューリング部３０３の処理を終了する。変更前のアプリ、変更後のアプリが共にデバイスに頻繁にアクセスするアプリでない場合（ステップＳ２１０３：Ｎｏ）、ＣＰＵ＃０は、スケジューリング部３０３の処理を終了する。
【０１８８】
図２２は、実施の形態２におけるＤＶＦＳ制御部３０５の処理を示すフローチャート（その２）である。なお、実施の形態２におけるＤＶＦＳ制御部３０５の処理を示すフローチャート（その１）に関しては、実施の形態１におけるＤＶＦＳ制御部３０５の処理を示すフローチャート（その１）と等しいため、説明を省略する。
【０１８９】
通知種別が競合アクセス数変更である場合、ＣＰＵ＃０は、Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓを記憶しているか否かを判断する（ステップＳ２２０１）。Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓを記憶していない場合（ステップＳ２２０１：Ｎｏ）、ＣＰＵ＃０は、Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓを、全ての値をＮＵＬＬとして記憶する（ステップＳ２２０２）。なお、記憶する箇所としては、ＲＡＭ２０２といった記憶領域である。
【０１９０】
記憶終了後、または、Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓを記憶している場合（ステップＳ２２０１：Ｙｅｓ）、ＣＰＵ＃０は、Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓから、通知されたＣＰＵの識別情報を消去する（ステップＳ２２０３）。たとえば、Ｈ０＿ＣＰＵｓ：ＣＰＵ＃０、ＣＰＵ＃３、Ｈ１＿ＣＰＵｓ：ＣＰＵ＃０〜ＣＰＵ＃２、Ｈ２＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓ：ＮＵＬＬとなっており、ＣＰＵ＃０が通知された場合を想定する。このとき、ＣＰＵ＃０は、Ｈ０＿ＣＰＵｓ：ＣＰＵ＃３、Ｈ１＿ＣＰＵｓ：ＣＰＵ＃１、ＣＰＵ＃２、Ｈ２＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓ：ＮＵＬＬと設定する。
【０１９１】
消去後、ＣＰＵ＃０は、Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓのうち、通知された変更後のデバイス群の対応する箇所について、通知されたＣＰＵの識別情報を追加する（ステップＳ２２０４）。たとえば、Ｈ０＿ＣＰＵｓ：ＣＰＵ＃３、Ｈ１＿ＣＰＵｓ：ＣＰＵ＃１、ＣＰＵ＃２、Ｈ２＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓ：ＮＵＬＬとなっており、変更後のデバイス群がデバイス＃Ｈ１、デバイス＃Ｈ２、である場合を想定する。このとき、通知されたＣＰＵがＣＰＵ＃０であれば、ＣＰＵ＃０は、Ｈ０＿ＣＰＵｓ：ＣＰＵ＃３、Ｈ１＿ＣＰＵｓ：ＣＰＵ＃０〜ＣＰＵ＃２、Ｈ２＿ＣＰＵｓ：ＣＰＵ＃０、Ｈ３＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓ：ＮＵＬＬと設定する。
【０１９２】
追加後、ＣＰＵ＃０は、Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓから、競合アクセス数Ｃｈ＃０〜Ｃｈ＃Ｍを生成する（ステップＳ２２０５）。たとえば、Ｈ０＿ＣＰＵｓ：ＣＰＵ＃３、Ｈ１＿ＣＰＵｓ：ＣＰＵ＃０〜ＣＰＵ＃２、Ｈ２＿ＣＰＵｓ：ＣＰＵ＃０、Ｈ３＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓ：ＮＵＬＬとなっている場合を想定する。このとき、ＣＰＵ＃０は、Ｃｈ＃０＝１、Ｃｈ＃１＝３、Ｃｈ＃２＝１、Ｃｈ＃３〜Ｃｈ＃Ｍ＝０というように競合アクセス数を生成する。
【０１９３】
インクリメント後、ＣＰＵ＃０は、クロック周波数テーブル１９０１のレコード群のうち、競合アクセス数フィールドの値と、生成された競合アクセス数Ｃｈ＃０〜Ｃｈ＃Ｍの値と、が全て一致するレコードを抽出する（ステップＳ２２０６）。抽出後、ＣＰＵ＃０は、ＰＭＵ１０７を、競合アクセス数Ｃｈ＃０〜Ｃｈ＃Ｍが２以上となるデバイス群に頻繁にアクセスするＣＰＵのクロック周波数を、抽出したレコードのＣＰＵクロック周波数の値に設定するように制御する（ステップＳ２２０７）。
【０１９４】
たとえば、競合アクセス数がＣｈ＃０＝１、Ｃｈ＃１＝３、Ｃｈ＃２＝１、Ｃｈ＃３〜Ｃｈ＃Ｍ＝０となっている場合、Ｃｈが２以上となるデバイス群は、デバイス＃Ｈ１となる。デバイス＃Ｈ１に頻繁にアクセスするＣＰＵがＨ１＿ＣＰＵｓを参照してＣＰＵ＃０〜ＣＰＵ＃２となる場合、ＣＰＵ＃０は、ＰＭＵ１０７を、ＣＰＵ＃０〜ＣＰＵ＃２のクロック周波数を抽出したレコードのＣＰＵクロック周波数の値に設定するように制御する。
【０１９５】
続けて、ＣＰＵ＃０は、競合アクセス数Ｃｈが１のデバイスにアクセスするＣＰＵが、Ｈ０＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓのうち、競合アクセス数が２以上となるデバイスに全て存在するかを判断する（ステップＳ２２０８）。存在しないＣＰＵがある場合（ステップＳ２２０８：Ｎｏ）、ＣＰＵ＃０は、ＰＭＵ１０７を、競合アクセス数Ｃｈが１のデバイスのみにアクセスするＣＰＵのクロック周波数を標準値に設定するように制御する（ステップＳ２２０９）。
【０１９６】
たとえば、Ｈ０＿ＣＰＵｓ：ＣＰＵ＃３、Ｈ１＿ＣＰＵｓ：ＣＰＵ＃０〜ＣＰＵ＃２、Ｈ２＿ＣＰＵｓ：ＣＰＵ＃０、Ｈ３＿ＣＰＵｓ〜ＨＭ＿ＣＰＵｓ：ＮＵＬＬであり、Ｃｈ＃０＝１、Ｃｈ＃１＝３、Ｃｈ＃２＝１、Ｃｈ＃３〜Ｃｈ＃Ｍ＝０である場合を想定する。初めに、ＣＰＵ＃０は、競合アクセス数Ｃｈが１であるデバイス＃Ｈ０にアクセスするＣＰＵ＃３と、デバイス＃Ｈ２にアクセスするＣＰＵ＃０とを抽出する。
【０１９７】
続けて、ＣＰＵ＃０は、ＣＰＵ＃３とＣＰＵ＃０が、競合アクセス数が２以上となるデバイス＃Ｈ１にアクセスするＨ１＿ＣＰＵｓ内に存在するかを判断する。ＣＰＵ＃０は存在するが、ＣＰＵ＃３は存在しない。これにより、ＣＰＵ＃３は、競合アクセス数Ｃｈが１のデバイスのみにアクセスしていることになる。この結果により、ＣＰＵ＃０は、ＣＰＵ＃３のクロック周波数を標準値に設定するように制御する。
【０１９８】
全て存在した場合（ステップＳ２２０８：Ｙｅｓ）、または、ステップＳ２２０９の処理後、ＣＰＵ＃０は、ＰＭＵ１０７を、デバイス群２０５のクロック周波数を、抽出したレコードのデバイスクロック周波数フィールドの値に設定するように制御する（ステップＳ２２１０）。制御後、ＣＰＵ＃０は、ＤＶＦＳ制御部３０５の処理を終了する。
【０１９９】
以上説明したように、マルチコアプロセッサシステム、および電力制御方法によれば、コアが複数のデバイスに同時にアクセスする場合、複数のデバイスの競合状態を特定し、複数のデバイスと競合中のコア群を特定された状態に応じたクロック周波数で動作させる。これにより、マルチコアプロセッサシステムは、複数のデバイスの競合が組み合わさった状態であっても、処理性能を落とさずに最も消費電力量が削減された状態で運用することができる。
【０２００】
なお、本実施の形態で説明した電力制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本電力制御方法を実行するプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本電力制御方法を実行するプログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【０２０１】
＃０、＃１、＃Ｎ  ＣＰＵ
＃Ｈ０、＃Ｓ０  デバイス
１００  マルチコアプロセッサシステム
１０５  ＣＰＵｓ
１０６  メモリ
１０７  ＰＭＵ
１０８  バス
２０５  デバイス群
２０６  デバイス群
３０１  クロック周波数テーブル
３０２  クロック周波数標準値テーブル
３０３  スケジューリング部
３０４  排他制御部
３０５  ＤＶＦＳ制御部
３０６  記憶部
３０７、３０８  検出部
３０９、３１０  特定部
３１１  抽出部
３１２  制御部
【図１】
2012086040.tif 000008
【図２】
2012086040.tif 000009
【図３】
2012086040.tif 000010
【図４】
2012086040.tif 000011
【図５】
2012086040.tif 000012
【図６】
2012086040.tif 000013
【図７】
2012086040.tif 000014
【図８】
2012086040.tif 000015
【図９】
2012086040.tif 000016
【図１０】
2012086040.tif 000017
【図１１】
2012086040.tif 000018
【図１２】
2012086040.tif 000019
【図１３】
2012086040.tif 000020
【図１４】
2012086040.tif 000021
【図１５】
2012086040.tif 000022
【図１６】
2012086040.tif 000023
【図１７】
2012086040.tif 000024
【図１８】
2012086040.tif 000025
【図１９】
2012086040.tif 000026
【図２０】
2012086040.tif 000027
【図２１】
2012086040.tif 000028
【図２２】
2012086040.tif 000029
【国際調査報告】
2012086040.tif 000030
2012086040.tif 000031
2012086040.tif 000032