(57)【要約】【課題】命令セットアーキテクチャに互換性のない非対称プロセッサコア間でアプリケーション処理を切り替えて継続実行可能にする。【解決手段】情報処理装置１において、第１のプロセッサコア２０がアプリケーションプログラムを実行している際に実行主体の切替え要求が発生したとき、切替え処理コード５７は、第１のプロセッサコア２０に現在実行中の基本ブロックを特定させる。そして、切替え処理コード５７は、特定された基本ブロックの最後の分岐命令まで第１のプロセッサコア２０に第１の実行コード５１を実行させ、特定された基本ブロックの次に実行する基本ブロックの先頭の命令から第２のプロセッサコア３０に第２の実行コード５２を実行させる。【選択図】図１
2014203185.tif 000002
【特許請求の範囲】
【請求項１】
第１のプロセッサコアと、
第２のプロセッサコアと、
前記第１および第２のプロセッサコアと結合されたメモリとを備え、
前記メモリは、
アプリケーションプログラムを前記第１および第２のプロセッサコアの各々での実行用にそれぞれコンパイルすることによって得られた第１の実行コードおよび第２の実行コードと、
前記メモリ上での前記第１の実行コードの各基本ブロックのアドレスと、前記メモリ上での前記第２の実行コードの各基本ブロックのアドレスとの対応関係を示すテーブルと、
前記第１のプロセッサコアが前記アプリケーションプログラムを実行している際に実行主体の切替え要求が発生したときに動作する切替え処理コードとを格納し、
前記切替え処理コードは、前記切替え要求が発生したとき、
前記テーブルに基づいて、前記第１のプロセッサコアに現在実行中の基本ブロックを特定させ、
前記特定された基本ブロックの最後の分岐命令まで前記第１のプロセッサコアに前記第１の実行コードを実行させ、
前記特定された基本ブロックの次に実行する基本ブロックの先頭の命令から前記第２のプロセッサコアに前記第２の実行コードを実行させるように構成されている、情報処理装置。
【請求項２】
前記第１のプロセッサコアは、第１のレジスタセットを有し、
前記第２のプロセッサコアは、第２のレジスタセットを有し、
前記メモリは、
前記第１のプロセッサコア用に割当てられた第１のスタック領域と、
前記第２のプロセッサコア用に割当てられた第２のスタック領域とを含み、
前記第１の実行コードの各基本ブロックの先頭において前記第１のレジスタセットに割当てられるデータの内容は、前記第２の実行コードの対応する基本ブロックの先頭において前記第２のレジスタセットに割当てられるデータの内容に一致し、
前記第１の実行コードの各基本ブロックの先頭において前記第１のスタック領域に退避するように割当てられるデータの内容は、前記第２の実行コードの対応する基本ブロックの先頭において前記第２のスタック領域に退避するように割当てられるデータの内容に一致する、請求項１に記載の情報処理装置。
【請求項３】
前記メモリは、バッファ領域をさらに含み、
前記切替え処理コードは、さらに、
前記特定された基本ブロックの実行完了後に、前記第１のレジスタセットに格納されているデータを前記第１のプロセッサコアによって前記バッファ領域に保存させ、
前記特定された基本ブロックの実行完了後に、前記第１のスタック領域に格納されているデータを、前記第２のプロセッサコアによって自コアでの実行用に変換させてから前記第２のスタック領域に格納させ、
前記バッファ領域に保存されたデータを、前記第２のプロセッサコアによって自コアでの実行用に変換させてから前記第２のレジスタセットに格納させるように構成されている、請求項２に記載の情報処理装置。
【請求項４】
前記情報処理装置は、前記第１および第２のプロセッサコアに個別に電源電圧の供給が可能な電力管理部をさらに備え、
前記電力管理部は、
前記第１のプロセッサコアが前記アプリケーションプログラムの実行を開始するときには、前記第１のプロセッサコアに電源電圧を供給しているが、前記第２のプロセッサコアには電源電圧を供給しておらず、
前記切替え要求が発生した後で、前記第２のプロセッサコアに電源電圧の供給を開始し、
前記第２のプロセッサコアへ供給する電源電圧が動作に必要なレベルに達すると、前記第１のプロセッサコアに準備完了を通知するように構成されている、請求項３に記載の情報処理装置。
【請求項５】
前記切替え処理コードは、前記電力管理部から前記第１のプロセッサコアに前記準備完了の通知が出力され、前記第１のレジスタセットに格納されているデータが前記バッファ領域に保存された後に、自コアへの電源供給の停止要求を前記第１のプロセッサコアに出力させるように構成されている、請求項４に記載の情報処理装置。
【請求項６】
前記切替え処理コードは、
前記バッファ領域に保存された前記第１のプロセッサコアのプログラムカウンタの値を、前記テーブルに示されたアドレスの対応関係に基づいて、前記第２のプロセッサコアによって自コア用のプログラムカウンタの値に変換させ、
前記第１のスタック領域に格納されているアドレスの値を、前記テーブルに示されたアドレスの対応関係に基づいて、前記第２のプロセッサコアによって自コア用のアドレスの値に変換させるように構成されている、請求項３に記載の情報処理装置。
【請求項７】
前記第１のプロセッサコアは、前記第２のプロセッサコアよりも低周波数で動作する、請求項１〜６のいずれか１項に記載の情報処理装置。
【請求項８】
前記第１のプロセッサコアの命令セットは、前記第２のプロセッサコアの命令セットと互換性がない、請求項１〜７のいずれか１項に記載の情報処理装置。
【請求項９】
マルチコアプロセッサを用いた情報処理方法であって、
前記マルチコアプロセッサは、
第１のプロセッサコアと、
第２のプロセッサコアと、
前記第１および第２のプロセッサコアと結合されたメモリとを含み、
前記情報処理方法は、
アプリケーションプログラムを前記第１および第２のプロセッサコアの各々での実行用にコンパイルすることによって、第１の実行コードおよび第２の実行コードをそれぞれ生成するステップと、
前記メモリ上に配置された前記第１の実行コードの各基本ブロックのアドレスと、前記メモリ上に配置された前記第２の実行コードの各基本ブロックのアドレスとの対応関係を示すテーブルを生成するステップと、
前記テーブルに基づいて、前記第１のプロセッサコアに現在実行中の基本ブロックを特定させるステップと、
前記特定された基本ブロックの最後の分岐命令まで前記第１のプロセッサコアに前記第１の実行コードを実行させるステップと、
前記特定された基本ブロックの次に実行する基本ブロックの先頭の命令から前記第２のプロセッサコアに前記第２の実行コードを実行させるステップとを備える、情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、情報処理装置および情報処理方法に関し、たとえば、互いにアーキテクチャの異なるヘテロジニアス（非対称）なマルチコアを有する中央処理装置（ＣＰＵ：Central  Processing  Unit）において好適に用いられるものである。
【背景技術】
【０００２】
センサ装置など、バッテリーで駆動する装置では、設置後にバッテリー交換を行わずに長期間稼働することが求められている。このような装置では、通常は間欠動作でセンサのデータ収集が行われ、あるタイミングで蓄積されたデータを使った計算処理、あるいはネットワークを用いたデータ転送が行われる。単純なデータ収集処理が間欠的に行われる通常時には、ＣＰＵの計算能力を必要としないため、電力を消費しないように出来る限り低い動作周波数でＣＰＵが動作すればよい。一方、まとまった単位のデータの解析やネットワーク処理を行うときには、高いＣＰＵ能力で短時間に処理を完了する必要がある。
【０００３】
このような要求に対し、一般的にはＤＶＦＳ（Dynamic  Voltage  and  Frequency  Scaling）と呼ばれる、ＣＰＵコアの動作周波数と電圧を必要な計算能力に応じて変更する技術が用いられる。しかしながら、単一のＣＰＵコアのアーキテクチャでは、低消費電力と高性能の両方の要求を満たす特性を得ることは難しい。
【０００４】
これに対し、ＡＲＭ社では、低電力志向の特性を持つＣＰＵコアと、高性能なＣＰＵコアを組み合わせ、両コア間でソフトウェアをシームレスに切り替える、big.LITTLE  Processingアーキテクチャで解決しようと試みている（Peter  Greenhalgh，"Big.LITTLE  Processing  with  ARM  CortexTM-A15  &  Cortex-A7"，ARM，WHITEPAPER，September  2011（非特許文献１）参照）。
【０００５】
ＡＲＭ社のbig.LITTLEアーキテクチャと同等の方式は、特表２０１０−５３８３７１号公報（特許文献１）に示されている。この文献には、動作周波数と動作電力レベルが異なる特性の２つの非対称コア間で、アプリケーションをＯＳ（Operating  System）から透過的に切り替える方法が開示されている。ただし、この特許文献の構成では、２つの非対称コアの命令セットアーキテクチャ（ＩＳＡ：Instruction  Set  Architecture）には互換性が必要とされる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特表２０１０−５３８３７１号公報
【非特許文献】
【０００７】
【非特許文献１】Peter  Greenhalgh，"Big.LITTLE  Processing  with  ARM  CortexTM-A15  &  Cortex-A7"，ARM，WHITEPAPER，September  2011
【発明の概要】
【発明が解決しようとする課題】
【０００８】
特表２０１０−５３８３７１号公報（特許文献１）では、アプリケーション処理をコア間で切り替えて継続実行する方法が示されているが、これはＩＳＡに互換性があることが前提となっている。すなわち、命令パイプラインやスーパースカラなどのマイクロアーキテクチャレベルの違いは許されるが、実行可能な命令種別や汎用レジスタのセットは共通でなければならない。そのため、特性の異なるコア間における性能の差、あるいは電力効率の差は数倍程度に限定される。ＡＲＭ社のホワイト・ペーパー（非特許文献１）の場合も同様に、Cortex-A7とCortex-A15とで、性能の差は最大３倍、電力効率の差は最大３．８倍程度であることが示されている。
【０００９】
この発明の主たる目的は、ＩＳＡに互換性のない非対称コア間でアプリケーション処理を切替えて継続実行可能にする情報処理装置および情報処理方法を提供することである。
【課題を解決するための手段】
【００１０】
一実施の形態による情報処理装置は、第１のプロセッサコアと、第２のプロセッサコアと、第１および第２のプロセッサコアと結合されたメモリとを備える。メモリは、第１の実行コード、第２の実行コード、テーブル、および切替え処理コードを格納している。第１および第２の実行コードは、アプリケーションプログラムを第１および第２のプロセッサコアの各々での実行用にそれぞれコンパイルすることによって得られる。テーブルは、メモリ上での第１の実行コードの各基本ブロックのアドレスと、メモリ上での第２の実行コードの各基本ブロックのアドレスとの対応関係を示す。切替え処理コードは、第１のプロセッサコアがアプリケーションプログラムを実行している際に実行主体の切替え要求が発生したときに、上記のテーブルに基づいて、第１のプロセッサコアに現在実行中の基本ブロックを特定させる。切替え処理コードは、特定された基本ブロックの最後の分岐命令まで第１のプロセッサコアに第１の実行コードを実行させ、特定された基本ブロックの次に実行する基本ブロックの先頭の命令から第２のプロセッサコアに第２の実行コードを実行させる。
【発明の効果】
【００１１】
上記の実施の形態によれば、ＩＳＡに互換性のない非対称コア間でアプリケーション処理を切り替えて継続実行可能にすることができる。
【図面の簡単な説明】
【００１２】
【図１】一実施の形態による情報処理装置として非対称マルチコアＣＰＵ装置の構成を示すブロック図である。
【図２】図１のメモリに格納されるソフトウェアの構成を示す図である。
【図３】コンパイル処理の手順を示すフローチャートである。
【図４】中間表現コードと各コア用アプリケーション処理コードとの対応関係を示す図である。
【図５】図４の例において、命令アドレス変換テーブルに記録されるアドレス情報について説明するための図である。
【図６】サンプルコードを示す図である。
【図７】図６のサンプルコードに対応するコア１用アプリケーション処理コードの基本ブロックの構成例を示す図である。
【図８】図６のサンプルコードの処理が実行される際のスタックの状態を示す図である。
【図９】実行コンテキスト移送処理の具体的な処理内容について説明するための図である。
【図１０】図９の基本ブロックの実行完了処理の手順を示すフローチャートである。
【図１１】図９のスタック変換処理の手順を示すフローチャートである。
【図１２】図９のレジスタ変換処理の手順を示すフローチャートである。
【図１３】センサシステムの動作例を示すフローチャートである。
【図１４】図１３の実行コンテキスト移送処理（ステップＳ６１５）の手順を示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下、一実施の形態について図面を参照して詳しく説明する。なお、同一または相当する部分には同一の参照符号を付して、その説明を繰り返さない。
【００１４】
［非対称マルチコアＣＰＵ装置の全体構成］
図１は、一実施の形態による情報処理装置として非対称マルチコアＣＰＵ装置の構成を示すブロック図である。
【００１５】
図１を参照して、非対称マルチコアＣＰＵ装置１は、低電力志向のコア１（２０）と、高性能志向のコア２（３０）と、電力管理部１０とを含む。コア１（２０）は、コア２（３０）に比べて低動作周波数で動作するとともに低電源電圧で動作するために消費電力が低い。
【００１６】
コア１（２０）に実装されている命令セットアーキテクチャ（ＩＳＡ１）（２１）と、コア２（３０）に実装されている命令セットアーキテクチャ（ＩＳＡ２）（２２）とには、互換性がなくてもよい。さらに、コア１（２０）に備えられたレジスタセット１（２２）と、コア２（３０）に備えられたレジスタセット２（３２）とにも互換性がなくてよい。
【００１７】
たとえば、低電力志向のコア１（２０）のレジスタ幅を１６ビットとし、高性能志向のコア２（３０）のレジスタ幅を３２ビットとすることができる。コア１（２０）のレジスタ幅をコア２（３０）のレジスタ幅に比べて抑えることによって、コア１（２０）の回路面積およびレジスタ数を削減することができるため、コア１（２０）とコア２（３０）との性能差もしくは電力効率差をより大きくすることができる。
【００１８】
電力管理部１０は、コア１（２０）に対して電力供給線１１を介して電力（電源電圧）を供給し、コア２（３０）に対して電力供給線１２を介して電力（電源電圧）を供給する。各コアに対する電力供給は、電力管理部１０によって独立に制御される。電力管理部１０は、割込み信号線１３を介してコア１（２０）に割込み通知を発行することができる。
【００１９】
非対称マルチコアＣＰＵ装置１は、さらに、メモリ５０、周辺デバイス４０、およびバス４１を含む。コア１（２０）、コア２（３０）、電力管理部１０、メモリ５０、および周辺デバイス４０は、バス４１を介して相互に接続される。コア１（２０）とコア２（３０）とは、バス４１を介してメモリ５０および周辺デバイス４０と結合されることによって、メモリ５０および周辺デバイス４０を共有する。
【００２０】
［メモリ上のソフトウェアの構成］
図２は、図１のメモリに格納されるソフトウェアの構成を示す図である。図２には、コンパイラ６０によってソースコード６１をコア１（２０）用の実行コードおよびコア２（３０）用の実行コード（以下では、命令コードまたは処理コードとも称する）に変換する過程が併せて示されている。
【００２１】
図１および図２を参照して、アプリケーション処理が記述されたソースコード６１は、コンパイラ６０によってコア１（２０）の命令コードに翻訳されたコア１用アプリケーション処理コード５１、コア２（３０）の命令コードに翻訳されたコア２用アプリケーション処理コード５２、および両処理コード５１，５２から共通に参照されるデータ５３に変換される。このとき、コア１用アプリケーション処理コード５１とコア２用アプリケーション処理コード５２のアドレスの対応関係を示す命令アドレス変換テーブル５４が併せて生成される。これらのソフトウェア５１〜５４は実行時にはメモリ５０上に配置される。
【００２２】
メモリ５０上には他に、コア１用アプリケーション処理コード５１をコア１（２０）で実行する際に使用するコア１用スタック領域５５と、コア２用アプリケーション処理コード５２をコア２（３０）で実行する際に使用するコア２用スタック領域５６とが確保される。メモリ５０上には、さらに、コア１（２０）の実行状態をコア２（３０）に移送し継続実行するために必要な仕組みを実装した実行コンテキスト移送処理コード５７と、コア１（２０）の実行状態であるレジスタセット１（２２）の内容を一時的に保存するためのレジスタセット変換バッファ５８とが配置される。
【００２３】
［コンパイル処理］
１．字句解析
図３は、コンパイル処理の手順を示すフローチャートである。図２および図３を参照して、コンパイル処理では、最初にソースコード６１を文法上の基本単位であるトークンの列に変換する字句解析処理（ステップＳ１００）が行われる。
【００２４】
２．構文解析・中間表現翻訳処理
次に、プログラミング言語の文法規則に従ってトークン列を解析する構文解析処理（ステップＳ１０５）が行われ、続いて構文解析結果に基づいて中間表現コード６３を生成する中間表現翻訳処理６２が行われる（ステップＳ１１０）。このように、アプリケーション処理の記述されたソースコード６１は、各コア用の処理コード５１，５２に変換する際に、中間表現翻訳処理６２によって、特定のＩＳＡに依存しない命令コードである中間表現コード６３に一旦変換される。
【００２５】
中間表現コード６３は、コンパイラ６０によって字句解析および構文解析を行った結果である、ソフトウェアの論理構造を示している中間データを明示的に具現化したものである。一般的なコンパイラでは、中間表現コードという形で明示的に出力していなくても、中間表現コードに相当する中間データを内部的に保持している。中間表現コードは、例えばＪａｖａ（登録商標）のバイトコードのような、ＩＳＡに依存しない命令形式であり、ロード、ストア、算術演算、論理演算、および分岐などの汎用的な命令コード体系となっている。なお、コンパイラにおいて、一旦中間表現コードに翻訳して最適化した後、それをターゲット命令コードに変換する方式は、コンパイラ基盤のＬＬＶＭ（Low  Level  Virtual  Machine）などで用いられている既存の技術である。
【００２６】
ここで、一般にプログラムは、分岐命令（ジャンプ命令）を区切りとしていくつかの基本ブロックに分割することができる。基本ブロックとは、（ｉ）実行制御が基本ブロックを構成する文の並びの最初から最後に順に進み、（ｉｉ）分岐命令（ジャンプ命令）が基本ブロックの最後にのみ置かれ、（ｉｉｉ）他の基本ブロックからはその基本ブロックの最初にしか入ることができないものを言う。以下のステップは、基本ブロックを単位として実行される。
【００２７】
３．コード最適化処理・実行コンテキスト状態制御処理
次に、コンパイラ６０は、コード最適化処理および実行コンテキスト状態制御処理６４を行う（ステップＳ１１５）。コード最適化処理とは、より効率のよいコードを生成するために、中間表現コード６３に対して行われる各コアのアーキテクチャ特有の処理のことである。たとえば、変数や一時的な計算途中結果を特定の汎用レジスタに割り付ける処理などが行われる。
【００２８】
実行コンテキスト状態制御処理６４は、このコード最適化処理に制約を加えるものである。本実施の形態では、アプリケーションプログラムの実行時にコア１からコア２に処理が切り替えられる際、コア１によって現在の実行中の基本ブロックの最後の分岐命令まで処理が実行され、基本ブロックの境界において、コア１からコア２に処理が引き渡される。このとき、次の基本ブロックの先頭位置をチェックポイントとし、チェックポイントにおいて、コア１のレジスタ状態およびスタック状態（いわゆる、実行コンテキスト）がコア２用に変換される。この実行コンテキストの変換処理を可能とするため、コード最適化処理では以下の制約が課される。
【００２９】
（制約１）  基本ブロックの境界では、コア１（２０）用スタック領域５５に退避されているデータの内容および順序と、コア２（３０）用スタック領域５６に退避されている内容および順序とを一致させる。なお、スタック領域に退避されるデータの単位（レジスタ幅）は一致させる必要はない。
【００３０】
（制約２）  基本ブロックの境界では、コア１（２０）用のレジスタセット１（２２）およびコア２（３０）用のレジスタセット２（３２）のうちで、両コアで共通の使用目的を持った汎用レジスタに保持されているデータの内容を一致させる。なお、基本ブロックの内部の処理においては、コードの最適化のために汎用レジスタを自由に使用してよい。
【００３１】
（制約３）  スタック領域に命令コードのアドレス情報（例えば、プログラムカウンタ（ＰＣ））を退避する場合には、スタックに退避された他のデータとは区別可能とする。この制約３は、コア１からコア２に処理を引き渡す際に、命令アドレス変換テーブル５４に従ってアドレス情報を書き直す処理を容易に実行できるようにするために必要である。
【００３２】
上記の制約１，２に関して、たとえば、基本ブロックをまたがって使用される一時的な計算途中結果は、汎用レジスタの数に余裕があるプロセッサコアではレジスタに保持されたまま次の基本ブロックに引き継ぐことができる。一方、汎用レジスタの数が限られたプロセッサコアでは、一時的なデータはスタックに退避した後、次の基本ブロックで取り出すか、あるいは一旦破棄した後、次の基本ブロックで再度計算してデータを再生成しなければならない。このようなプロセッサコアのアーキテクチャの違いに起因する処理の差異を、チェックポイント（基本ブロックの境界）で吸収するために、実行コンテキスト状態制御処理６４では、レジスタおよびスタックの状態（実行コンテキスト）を一致させるための追加処理が行われる。たとえば、あるデータを一方のコアは汎用レジスタに保持しており、他方のコアはスタック上に保持している場合、前者のデータを一旦スタックに退避する処理が挿入される。
【００３３】
上記の制約３に関して、スタック領域に退避されたアドレス情報を区別するために、別途付加情報を記録する操作が行われる。たとえば、ある特定の形式のデータ（マジックコード）を命令コードのアドレス情報との組でスタック上に退避する方法、もしくは、アドレス情報の退避位置を示すポインタ情報を別途生成する方法などが考えられる。後者の方法に関しては、図６〜図８を参照して後述する。
【００３４】
４．命令コード翻訳処理
次のステップで、最適化処理および実行コンテキスト状態制御処理６４が施された中間表現コード６３は、コア１用命令コード翻訳処理６５によってコア１用命令コード（コア１用アプリケーション処理コード５１）に変換され、コア２用命令コード翻訳処理６６によってコア２用命令コード（コア２用アプリケーション処理コード５２）に変換される（ステップＳ１２０）。これらの命令コード翻訳処理６５，６６は、基本ブロックを単位として実行される。
【００３５】
実行コンテキスト状態制御処理６４が予め実行されているので、命令コード翻訳処理６５，６６は、共通のルールに従った命令コードを生成する。具体的に、コア１用アプリケーション処理コード５１の各基本ブロックの先頭においてレジスタセット１（２２）に割当てられるデータの内容は、コア２用アプリケーション処理コード５２の対応する基本ブロックの先頭においてレジスタセット２（３２）に割当てられるデータの内容に一致する。さらに、コア１用アプリケーション処理コード５１の各基本ブロックの先頭においてコア１用スタック領域（５５）に退避するように割当てられているデータの内容は、コア２用アプリケーション処理コード５２の対応する基本ブロックの先頭においてコア２用スタック領域（５６）に退避するように割当てられているデータの内容に一致する。
【００３６】
５．リンク処理・命令アドレス変換テーブルの生成
次に、リンク処理６７によって、コア１用命令コード、コア２用命令コード、およびデータが、メモリ５０のアドレス空間に配置される（ステップＳ１２５）。このとき、コンパイラ６０は、アドレス配置後のコア１用命令コード（コア１用アプリケーション処理コード５１）と、アドレス配置後のコア２用命令コード（コア２用アプリケーション処理コード５２）とのアドレス対応関係を記録した命令アドレス変換テーブル５４を併せて生成する（ステップＳ１３０）。
【００３７】
［命令アドレス変換テーブルの具体例］
以下、図２の命令アドレス変換テーブル５４の具体例について説明する。
【００３８】
図４は、中間表現コードと各コア用アプリケーション処理コードとの対応関係を示す図である。図２および図４を参照して、中間表現コード６３は、分岐命令までの連続命令列を単位とした、基本ブロックに分割されている。たとえば、図４の例において、中間表現コード６３は、基本ブロックＡ，Ｂ，Ｃに分割されている。
【００３９】
コンパイラ６０は、命令コード翻訳処理６５，６６において、中間表現コード６３を各コア用の命令コードに翻訳する際に、基本ブロックの単位で翻訳する。たとえば、図４の例において、中間表現コードの基本ブロックＡに対応する処理内容は、コア１用の命令コードに翻訳された場合は翻訳済み基本ブロック１Ａとなり、コア２用の命令コードに翻訳された場合は翻訳済み基本ブロック２Ａとなる。同様に、中間表現コードの基本ブロックＢは、翻訳済み基本ブロック１Ｂおよび翻訳済み基本ブロック２Ｂに対応し、中間表現コードの基本ブロックＣは、翻訳済み基本ブロック１Ｃおよび翻訳済み基本ブロック２Ｃに対応する。
【００４０】
これらの翻訳済み基本ブロック１Ａ〜１Ｃおよび２Ａ〜２Ｃは、リンク処理６７によって各々のアドレス空間に割り付けられる。このとき、対応する翻訳済み基本ブロックの先頭アドレスの組が、命令アドレス変換テーブル５４に記録される。
【００４１】
図５は、図４の例において、命令アドレス変換テーブルに記録されるアドレス情報について説明するための図である。図４、図５を参照して、コア１用の翻訳済み基本ブロック１Ａの先頭アドレス０ｘ１０００と、対応するコア２用の翻訳済み基本ブロック２Ａの先頭アドレス０ｘ８０００との組み合わせが、命令アドレス変換テーブル５４に記録される。基本ブロックＢ，Ｃについても同様である。
【００４２】
なお、各々のアプリケーション処理の命令コードは、コア用に割り当てられた領域に別々に割り付けられるが、データはコア間で共通の領域に割り当てられ、各々のコアから同一アドレスで参照可能となる。
【００４３】
［実行コンテキスト状態制御処理の制約３の具体例］
以下、実行コンテキスト状態制御処理６４の制約３を実現した具体例として、アドレス情報の退避位置を示すポインタ情報を別途生成する方法について説明する。
【００４４】
図６は、サンプルコードを示す図である。図６のサンプルコードでは、分岐のない単純な処理１、処理３、および処理２を順に実行する例が示されている。
【００４５】
図７は、図６のサンプルコードに対応するコア１用アプリケーション処理コードの基本ブロックの構成例を示す図である。
【００４６】
図６および図７を参照して、基本ブロックは分岐命令を境界として分割されるため、関数ｆｕｎｃ＿ｍａｉｎは関数ｆｕｎｃ＿ａの呼出しの前後で別々の基本ブロックとなる。前半を基本ブロック１とし、後半を基本ブロック２とする。関数ｆｕｎｃ＿ａは単一の基本ブロック３となる。基本ブロック１の最後の命令は、基本ブロック３にジャンプする分岐命令で、基本ブロック３の最後は基本ブロック２の先頭にリターンする分岐命令である。処理の実行順序は、処理１（基本ブロック１）、処理３（基本ブロック３）、および処理２（基本ブロック２）の順となる。なお、この例ではレジスタ幅は１６ビットで、関数呼出しの引数パラメータは全てスタック経由で渡すものとする。
【００４７】
図８は、図６のサンプルコードの処理が実行される際のスタックの状態を示す図である。
【００４８】
図８（Ａ）には、基本ブロック１の先頭のスタックの状態が示されている。スタックポインタ（ＳＰ）はスタック領域の先頭を示している。
【００４９】
図８（Ｂ）を参照して、関数ｆｕｎｃ＿ａを呼び出す場合、スタックには引数パラメータ（０ｘ０００４，０ｘ０００８）を積んだ後、戻り先の命令コードのアドレス（基本ブロック２の先頭アドレス：０ｘ１０３Ｃ）が積まれる。これは関数ｆｕｎｃ＿ａを呼び出す前処理として、基本ブロック１の最後で行われる処理である。
【００５０】
この処理に加えて、戻り先の命令コードのアドレスが格納されるＳＰの位置情報（アドレス０ｘＢＦＦＡ）が、スタック領域とは別の領域に設けた退避アドレス情報領域に保存される。退避アドレス情報領域もまた、スタック領域と同様に伸張する領域である。
【００５１】
したがって、関数ｆｕｎｃ＿ａへの分岐直後である基本ブロック３の先頭では、図８（Ｂ）に示すスタック状態となる。スタック領域に退避されたデータのうち、アドレス０ｘＢＦＦＡの内容が命令コードのアドレスであるが、これは退避アドレス情報領域を走査することで検出可能となっている。
【００５２】
図８（Ｃ）を参照して、基本ブロック３の最後では、スタックから戻り先アドレス（アドレス０ｘＢＦＦＡ）を取り出し、そのアドレスにリターンするが、その際には退避アドレス情報領域に保存した内容も併せて破棄する。この結果、基本ブロック２の先頭では、図８（Ｃ）に示すスタック状態となる。
【００５３】
上記に示す退避アドレス情報領域に対する操作は、実行コンテキスト状態制御処理６４（図３のステップＳ１１５）によって挿入され、コア１用命令コード翻訳処理６５（図３のステップＳ１２０）によって基本ブロック中に自動的に追加される。なお、スタックへの戻り先アドレスの退避と同時にＳＰの内容を退避アドレス情報領域にも退避する処理をハードウェアで実現してもよい。
【００５４】
［実行コンテキスト移送処理］
次に、コア１（２０）の実行状態をコア２（３０）に移送し継続実行するための処理である図２の実行コンテキスト移送処理５７について説明する。実行コンテキスト移送処理５７は、コア１用アプリケーションの実行中に時間的制約が変化した場合、すなわち、高性能なコア２（３０）で短時間に結果を出す必要がある場合（高い演算能力が必要とされる場合）に起動される。
【００５５】
たとえば、図１の周辺デバイス４０として設けられた画像センサを例に挙げる。画像センサに画像入力のない通常時にはＣＰＵの演算能力は必要ない。一方、画像センサに画像が入力され画像センサが反応した場合には、ＣＰＵは、ある決まった時間以内に画像データ解析処理を行って結果を出力する必要があり、高い演算能力が必要とされる。この場合、画像センサからの割込み通知に応答して、コア１（２０）において割込みハンドラ処理が実行され、この割込みハンドラ処理からの要求に応答して、実行コンテキスト移送処理５７がコア１，２（２０，３０）において実行される。
【００５６】
他の例として、普段は入力データをバッファに格納するだけの単純な処理をゆっくり行っていればよいが、入力データがバッファに所定量蓄積された時点で、一気に演算して結果を出力するような処理が挙げられる。この場合、コア１（２０）で実行されている入力データのバッファを管理している処理プログラムからの要求によって、実行コンテキスト移送処理５７がコア１，２（２０，３０）で実行される。
【００５７】
さらに他の例として、ＯＳ（Operating  System）が起動されたタスクの負荷情報に応じてスケジューリング可能かどうかを判断し、ＯＳからの要求によって実行コンテキスト移送処理５７が実行される場合も考えられる。
【００５８】
図９は、実行コンテキスト移送処理の具体的な処理内容について説明するための図である。図９では、コア１（２０）で実行されている処理コードが時間的制約の変化を判断し、コア１（２０）からコア２（３０）への処理の切替え要求を発生させる例が示されている。
【００５９】
１．コア１側処理
図９に示すように、実行コンテキスト移送処理５７は、コア１，２（２０，３０）で機能分担されている。コア１側処理７０として、コア２の起動要求処理７１、基本ブロック実行完了処理７２、レジスタ保存処理７３、およびコア１の停止処理７４が順に実行される。
【００６０】
１−１．コア２の起動要求処理
図１および図９を参照して、最初に、コア２の起動要求処理７１として、電源供給が停止された状態であるコア２（３０）を起動するため、コア１（２０）から電力管理部１０に対してコア２（３０）への電源供給を要求する。そして、コア１（２０）はコア１用アプリケーション処理の続きを実行する。
【００６１】
１−２．基本ブロックの実行完了処理
コア２（３０）が起動し実行可能な電力状態となったとき、電力管理部１０は、コア１（２０）に対し、コア２（３０）が実行可能状態となったことを割込み信号によって通知する。その割込み通知を受けたコア１（２０）は、割込み処理として基本ブロックの実行完了処理７２を行う。
【００６２】
図１０は、図９の基本ブロックの実行完了処理の手順を示すフローチャートである。図９および図１０を参照して、まず、コア１（２０）は、実行中のアプリケーション処理において、現在のプログラムカウンタ（ＰＣ）の値を取得する（ステップＳ２００）。
【００６３】
次にコア１（２０）は、命令アドレス変換テーブル５４を走査して現在実行中の基本ブロックを特定する（ステップＳ２０５）。命令アドレス変換テーブル５４の探索は、別途ハッシュテーブルを設けることで探索時間を削減することができる。
【００６４】
次に、コア１（２０）は、特定した基本ブロックの最後の分岐命令まで処理を進めることによって、現在実行中の基本ブロックの処理を完了し、次に実行される基本ブロックの先頭の命令の直前で処理を停止する（ステップＳ２１０）。コア１の機能として、ハードウェアブレークポイントやステップ命令実行のようなデバッグ機能を有する場合は、これを利用することによって、次に実行される基本ブロックの先頭の命令の直前まで処理を進めて、その時点で処理を停止することができる。もしくは、分岐命令の分岐先アドレスを考慮してソフトウェアブレークポイントを設定することによっても上記の機能を実現できる。
【００６５】
なお、コア２（３０）への電源供給を電力管理部１０に要求した際に、電力管理部１０からの割込み通知を待たずに、現在のアプリケーション処理のＰＣ（プログラムカウンタ）が示す命令から実行中の基本ブロックの最後の分岐命令まで（次に実行される基本ブロックの先頭命令の直前まで）処理を進めておくようにしてもよい。この場合、コア１（２０）は、現在実行中の基本ブロックの最後の分岐命令まで処理を実行した後に、コア２（３０）が実行可能状態となったことを通知する割込みを待つことになる。
【００６６】
１−３．レジスタ保存処理
再び図９を参照して、次に、コア１（２０）は、レジスタ保存処理７３を実行する。具体的にコア１（２０）は、アプリケーション処理コードで次の基本ブロックの先頭の命令を実行する直前のレジスタの内容をレジスタセット変換バッファ５８に保存する。
【００６７】
１−４．コア１の停止処理
次に、コア１（２０）は、コア１停止処理７４として、コア２（３０）の実行開始（リセット状態解除）を要求するとともに、コア１（２０）自身の電源供給を停止するように電力管理部１０に要求する。
【００６８】
２．コア２側処理
コア２（３０）のリセット状態が解除されると、実行に必要な最小限の初期化処理を行った後、コア２側の実行コンテキスト移送処理５７が起動される。コア２側処理８０として、スタック変換処理８１、レジスタ変換処理８２、およびコンテキストディスパッチ処理８３が順に実行される。
【００６９】
２−１．スタック変換処理
図１１は、図９のスタック変換処理の手順を示すフローチャートである。
【００７０】
図９および図１１を参照して、スタック変換処理８１では、コア２（３０）は、メモリ５０のコア１用スタック領域５５の内容を読み出し（ステップＳ３００）、データ幅を拡張して（ステップＳ３０５）、コア２用スタック領域５６にデータを再配置する（ステップＳ３１５）。その際、コア２（３０）は、コア１用スタック領域５５から読み出したデータが、関数呼出しの戻り値など、命令コードのアドレスの場合には、命令アドレス変換テーブル５４を走査し、対応するコア２（３０）の命令コードのアドレスに置き換えて（ステップＳ３１０）、コア２用スタック領域５６に配置する（ステップＳ３１５）。
【００７１】
以上の各ステップは、コア１用スタック領域５５に格納された全てのデータについて（ステップＳ３２０でＹＥＳとなるまで）繰り返される。なお、図１１において、ステップＳ３０５とＳ３１０は実行される順序が逆でもよい。
【００７２】
２−２．レジスタ変換処理
図１２は、図９のレジスタ変換処理の手順を示すフローチャートである。図９および図１２を参照して、コア２（３０）は、レジスタ変換処理８２では、レジスタセット変換バッファ５８に保存されたコア１（２０）の汎用レジスタの内容を、コア２（３０）の汎用レジスタの形式に変換する。
【００７３】
具体的には、コア２（３０）は、実行コンテキスト状態制御処理６４において与えた制約条件のとおり、データを保持するために用いた汎用レジスタの対応関係が一致するよう、レジスタの内容を移動する（ステップＳ４００）。さらに、コア２（３０）は、ＰＣの内容を、命令アドレス変換テーブル５４を走査して得られたコア２（３０）の命令コードアドレスに変換する（ステップＳ４０５）。さらに、コア２（３０）は、ＳＰの内容を、スタック変換処理８１によって生成されたコア２用スタック領域５６の最上位に積まれたデータのアドレスに置換する（ステップＳ４１０）。なお、以上のステップＳ４００，Ｓ４０５，Ｓ４１０の実行順序は、どのステップから実行してもよい。
【００７４】
２−３．コンテキストディスパッチ処理
コンテキストディスパッチ処理８３では、コア２（３０）は、レジスタ変換処理８２によってレジスタセット変換バッファ５８に生成された汎用レジスタの内容を、コア２（３０）のレジスタセット３２にセットする。これにより、コア１（２０）で中断した処理の続きを、コア２（３０）で再開できるようになる。
【００７５】
コア２（３０）は、コア２用のレジスタセット３２に含まれるプログラムカウンタ（ＰＣ）の値に従って、現在実行中の基本ブロックの次に実行される基本ブロックの先頭の命令からコア２用アプリケーション処理コード５２の実行を開始する。
【００７６】
［センサシステムへの適用例］
上記の非対称マルチコアＣＰＵ装置１が適用されるシステムの例として、バッテリー駆動で長期間稼働し続けるセンサシステムが考えられる。以下、センサシステムの動作について説明する。
【００７７】
図１３は、センサシステムの動作例を示すフローチャートである。図１、図１３を参照して、センサシステムでは、ＣＰＵ（コア１（２０）およびコア２（３０）の両方とも）は、間欠動作により定常時は待機状態となって停止している。定期的、あるいは外部からの要求によって（ステップＳ５００でＹＥＳ）、電力管理部１０がコア１（２０）への電源供給を開始する。待機状態からの起点は、必ずコア１（２０）となる。
【００７８】
コア１（２０）は、電力管理部１０から電源供給を受けると、初期化処理（ステップＳ６００）を実行した後、アプリケーションプログラムの実行を開始する（ステップＳ６０５）。ＣＰＵの処理負荷が増大しなければ（ステップＳ６１０でＮＯ）、コア１（２０）はアプリケーションプログラムの終了まで（ステップＳ６２０でＹＥＳとなるまで）処理を実行する。その後、コア１（２０）は、電力管理部１０にコア１（２０）への電源供給の停止を要求し、電力管理部１０がコア１（２０）への電源供給を停止することにより、待機状態に戻る。
【００７９】
一方、アプリケーションプログラムの実行中にＣＰＵの処理負荷が増大した場合には（ステップＳ６１０でＹＥＳ）、コア１（２０）の処理は、図９で説明した実行コンテキスト移送処理５７に移行する（ステップＳ６１５）。ＣＰＵの処理負荷が増大する場合として、たとえば、センシングした入力データが所定量バッファに蓄積され、蓄積されたデータを用いて演算を行い、演算結果を通信回線で出力する場合が挙げられる。
【００８０】
図１４は、図１３の実行コンテキスト移送処理（ステップＳ６１５）の手順を示すフローチャートである。
【００８１】
図１、図９、図１４を参照して、実行コンテキスト移送処理では、コア１（２０）は、電力管理部１０にコア２（３０）の起動を要求する（ステップＳ６３０、図９の７１）。コア１（２０）からの要求を受けて、電力管理部１０は、コア２（３０）への電源供給を開始する（ステップＳ５１５）。電力管理部１０は、コア２（３０）へ供給している電源電圧が、コア２（３０）が動作可能な電圧レベルに達すると、コア２（３０）が実行可能状態になったことを割込み信号でコア１（２０）に通知する（ステップＳ５２０）。
【００８２】
コア１（２０）は、電力管理部１０からの割込み通知を受けると、図１０で説明したように、現在実行中の基本ブロックの実行を完了し、次に実行する基本ブロックの先頭の直前まで処理を進める基本ブロック実行完了処理７２（ステップＳ６３５）を行う。さらに、コア１（２０）は、レジスタセット１（２２）の内容をレジスタセット変換バッファ５８に保存するレジスタ保存処理７３（ステップＳ６４０）を実行する。
【００８３】
その後、コア１（２０）は、図９で説明したようにコア１停止処理７４（ステップＳ６４５）を実行する。具体的にコア１（２０）は、コア２（３０）のリセット状態解除を要求する（ステップＳ６５０）とともに、コア１（２０）自身の電源供給を停止するように電力管理部１０に要求する（ステップＳ６５５）。電力管理部１０は、コア１（２０）からの電源停止要求（ステップＳ６５５）に応答して、コア１（２０）への電源供給を停止する（ステップＳ５２５）。
【００８４】
コア２（３０）は、リセット状態が解除されると、初期化処理（ステップＳ７００）を実行する。その後、コア２（３０）は、図１１で説明したように、メモリ５０のコア１用スタック領域５５の内容を読出し、自コア用にデータ変換した後にコア２用スタック領域５６に配置するスタック変換処理８１（ステップＳ７０５）を実行する。
【００８５】
続いてコア２（３０）は、図１２で説明したように、レジスタセット変換バッファ５８に保存されたコア１（２０）の汎用レジスタの内容を、コア２（３０）の汎用レジスタの形式に変換するレジスタ変換処理８２（ステップＳ７１０）を行う。さらにコア２（３０）は、レジスタ変換処理８２によってレジスタセット変換バッファ５８に生成された汎用レジスタの内容をコア２（３０）のレジスタセット３２にセットするコンテキストディスパッチ処理８３（ステップＳ７１５）を実行する。
【００８６】
その後、コア２（３０）は、コア１（２０）で実行終了した基本ブロックの次に実行される基本ブロックから、アプリケーションプログラムの実行を再開する（ステップＳ７２０）。コア２（３０）は、アプリケーションプログラムが終了するまで処理を続ける。
【００８７】
アプリケーションプログラムの終了後に（ステップＳ７２５でＹＥＳ）、コア２（３０）は、コア２（３０）自身の電源供給を停止するように電力管理部１０に要求する（ステップＳ７３０）。電力管理部１０は、コア２（３０）からの電源停止要求に応答して、コア２（３０）への電源供給を停止する（ステップＳ５３０）。これによって、非対称マルチコアＣＰＵ装置１は、再度、待機状態に移行する。
【００８８】
上記のように、コア１（２０）からコア２（３０）に処理が移行した後は、コア２（３０）からコア１（２０）への移送は行わない。この理由は、コア２（３０）の起動にはエネルギー的、あるいは処理性能的なオーバーヘッドがかかるため、コア２（３０）に処理を移送した後は残りの処理を全て行い、出来る限り素早く待機状態に遷移させることが望ましいためである。なお、待機状態からの起点は、必ずコア１（２０）となる。
【００８９】
上記のシステム構成により、間欠動作時における高度な処理能力を必要としない単純な操作を、エネルギー効率の良い低性能なコア１（２０）で実行することにより、定常動作時のエネルギー消費量を抑えることが可能となる。この結果、バッテリー駆動の機器において長期間の連続稼働が可能となる。一方、データの解析処理や通信処理など、一時的に計算性能が必要とされる場合に対して、高性能なコア２（３０）に切り替えて処理を引き継ぐことで、実時間性能を満足することが可能となる。本構成によれば、システム設計時、あるいは実装時において、処理を実行するコアを事前に決めておく必要がなくなるとともに、システム運用時に時間制約、あるいはエネルギー制約が変化する場合に、それに応じて処理を行うコアを動的にスケジューリングするシステムの実現が可能になる。
【００９０】
［実施の形態の効果］
以上のとおり、この実施の形態によれば、ＩＳＡに互換性のない非対称コア間でアプリケーション処理を切り替えて継続実行が可能になる。ＩＳＡおよびレジスタセットの互換性が不要となるため、例えば、レジスタ幅が１６ビットの低電力志向のコアと、レジスタ幅が３２ビットの高性能志向のコアの組み合わせが可能となる。低電力指向のコアのレジスタ幅を１６ビットに抑えることで、コアの面積やトランジスタ数が削減されるため、性能、あるいは電力効率の差をより大きく確保することができる。さらに、アプリケーション処理をコアに固定せず、透過的に実行可能となるため、処理性能と電力に関する事前の設計が不要であるとともに、実行時において外的要因の発生状況に応じて、処理を割り当てるコアを柔軟に切り替えることが可能となる。
【００９１】
今回開示された実施の形態はすべての点で例示であって制限的なものでないと考えられるべきである。この発明の範囲は上記した説明ではなくて請求の範囲によって示され、請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【符号の説明】
【００９２】
１  ＣＰＵ装置、１０  電力管理部、１１，１２  電力供給線、１３  割込み信号線、２０，３０  プロセッサコア、２２，３２  レジスタセット、４０  周辺デバイス、４１  バス、５０  メモリ、５１，５２  アプリケーション処理コード、５３  データ、５４  命令アドレス変換テーブル、５５，５６  スタック領域、５７  実行コンテキスト移送処理コード、５８  レジスタセット変換バッファ、６０  コンパイラ、６１  ソースコード、６２  中間表現翻訳処理、６３  中間表現コード、６４  実行コンテキスト状態制御処理、６５，６６  命令コード翻訳処理、６７  リンク処理、７１  コア２の起動要求処理、７２  基本ブロック実行完了処理、７３  レジスタ保存処理、７４  コア１の停止処理、８１  スタック変換処理、８２  レジスタ変換処理、８３  コンテキストディスパッチ処理。
【図１】
2014203185.tif 000003
【図２】
2014203185.tif 000004
【図３】
2014203185.tif 000005
【図４】
2014203185.tif 000006
【図５】
2014203185.tif 000007
【図６】
2014203185.tif 000008
【図７】
2014203185.tif 000009
【図８】
2014203185.tif 000010
【図９】
2014203185.tif 000011
【図１０】
2014203185.tif 000012
【図１１】
2014203185.tif 000013
【図１２】
2014203185.tif 000014
【図１３】
2014203185.tif 000015
【図１４】
2014203185.tif 000016