(57)【要約】  互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサのそれぞれに対応する機械語プログラムをソースプログラム（２００）から生成するプログラム生成装置（２０）は、ソースプログラム（２００）中の切り替え点を決定する切り替え点決定部（３０１）と、切り替え点においてメモリのデータ構造が複数のプロセッサ間で一致するように、ソースプログラム（２００）から切り替え可能プログラムをプロセッサ毎に生成する切り替え可能プログラム生成部（３０２）と、第１プロセッサが実行中の切り替え可能プログラムを切り替え点で停止させ、かつ、第２プロセッサに切り替え可能プログラムを切り替え点から継続して実行させるための切り替えプログラムを、切り替え可能プログラムに挿入する切り替え判断処理挿入部（３０３）とを備える。
2012105174.tif 000002
【特許請求の範囲】
【請求項１】
互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサのそれぞれに対応する機械語プログラムを、同一のソースプログラムから生成するプログラム生成装置であって、
前記ソースプログラム中の所定の位置を切り替え点として決定する切り替え点決定部と、
前記切り替え点において前記メモリのデータ構造が前記複数のプロセッサ間で一致するように、前記ソースプログラムから、前記機械語プログラムである切り替え可能プログラムをプロセッサ毎に生成するプログラム生成部と、
前記複数のプロセッサの１つである第１プロセッサが実行中の、当該第１プロセッサに対応する前記切り替え可能プログラムを前記切り替え点で停止させ、かつ、前記複数のプロセッサの１つである第２プロセッサに、当該第２プロセッサに対応する前記切り替え可能プログラムを前記切り替え点から継続して実行させるための切り替えプログラムを、前記切り替え可能プログラムに挿入する挿入部とを備える
プログラム生成装置。
【請求項２】
前記プログラム生成装置は、さらに、前記切り替え可能プログラムの生成を指示する指示部を備え、
前記切り替え点決定部は、前記指示部が前記切り替え可能プログラムの生成を指示した場合に、前記切り替え点を決定し、
前記プログラム生成部は、前記指示部が前記切り替え可能プログラムの生成を指示した場合に、前記切り替え可能プログラムを生成し、
前記挿入部は、前記指示部が前記切り替え可能プログラムの生成を指示した場合に、前記切り替えプログラムを前記切り替え可能プログラムに挿入する
請求項１記載のプログラム生成装置。
【請求項３】
前記プログラム生成部は、前記指示部が前記切り替え可能プログラムの生成を指示しない場合に、前記複数のプロセッサのうち対応するプロセッサのみで実行可能なプログラムを、前記ソースプログラムに基づいて前記プロセッサ毎に生成する
請求項２記載のプログラム生成装置。
【請求項４】
前記切り替え点決定部は、前記ソースプログラムの基本ブロックの境界の少なくとも一部を、前記切り替え点として決定する
請求項１記載のプログラム生成装置。
【請求項５】
前記基本ブロックは、前記ソースプログラムのサブルーチンであり、
前記切り替え点決定部は、前記ソースプログラムのサブルーチンの境界の少なくとも一部を、前記切り替え点として決定する
請求項４記載のプログラム生成装置。
【請求項６】
前記切り替え点決定部は、前記サブルーチンの境界である前記サブルーチンの呼び出し元の呼び出し部分を、前記切り替え点として決定する
請求項５記載のプログラム生成装置。
【請求項７】
前記切り替え点決定部は、前記サブルーチンの境界である前記サブルーチンの呼び出し先の先頭及び終端の少なくとも一方を、前記切り替え点として決定する
請求項５記載のプログラム生成装置。
【請求項８】
前記切り替え点決定部は、前記ソースプログラム中のサブルーチンの呼び出しの階層の深さが、所定の閾値より浅いサブルーチンの境界の少なくとも一部を、前記切り替え点として決定する
請求項５記載のプログラム生成装置。
【請求項９】
前記切り替え点決定部は、前記ソースプログラムの分岐の少なくとも一部を、前記切り替え点として決定する
請求項１記載のプログラム生成装置。
【請求項１０】
前記切り替え点決定部は、前記ソースプログラムの分岐のうち、繰り返し処理への分岐を、前記切り替え点の対象から除外する
請求項９記載のプログラム生成装置。
【請求項１１】
前記切り替え点決定部は、隣り合う切り替え点の間に含まれる処理を実行するのに要する期間が、予め定められた期間より短くなるように、前記切り替え点を決定する
請求項１記載のプログラム生成装置。
【請求項１２】
前記切り替え点決定部は、前記ソースプログラム中で予め定められた位置を、前記切り替え点として決定する
請求項１記載のプログラム生成装置。
【請求項１３】
前記プログラム生成部は、前記切り替え点において前記メモリのスタックのデータ構造が前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成する
請求項１記載のプログラム生成装置。
【請求項１４】
前記プログラム生成部は、前記切り替え点において、前記メモリのスタックに格納されるデータのデータサイズ及び配置が、前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成する
請求項１３記載のプログラム生成装置。
【請求項１５】
前記プログラム生成部は、前記切り替え点において、前記メモリに格納される構造化データ内のデータ構造が前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成する
請求項１記載のプログラム生成装置。
【請求項１６】
前記プログラム生成部は、前記切り替え点において、前記ソースプログラム中にデータ幅が明記されないデータのデータ幅が前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成する
請求項１記載のプログラム生成装置。
【請求項１７】
前記プログラム生成部は、前記切り替え点において、前記ソースプログラム中で広域定義されるデータのデータ構造が前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成する
請求項１記載のプログラム生成装置。
【請求項１８】
前記プログラム生成部は、前記切り替え点において、前記メモリに格納されるデータのエンディアンが前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成する
請求項１記載のプログラム生成装置。
【請求項１９】
前記プログラム生成部は、さらに、
前記ソースプログラム中の同一の分岐を示す分岐先アドレスであって、前記複数のプロセッサ毎の前記切り替え可能プログラムにおける分岐先アドレスのそれぞれに共通の識別子を付与し、当該識別子と前記分岐先アドレスとを対応付けたアドレスリストを生成し、
前記切り替え可能プログラム中の前記分岐先アドレスを前記メモリに格納する処理を、当該分岐先アドレスに対応する識別子を前記メモリに格納する処理に置き換える
請求項１記載のプログラム生成装置。
【請求項２０】
前記プログラム生成部は、さらに、前記ソースプログラム中の同一の分岐を示す分岐先アドレスであって、前記複数のプロセッサ毎の前記切り替え可能プログラムにおける分岐先アドレスのそれぞれを互いに対応付けた構造化アドレスデータを生成する
請求項１記載のプログラム生成装置。
【請求項２１】
前記複数のプロセッサはそれぞれ、少なくとも１つのレジスタを有し、
前記プログラム生成部は、前記切り替え点の前で前記レジスタに格納されている値であり、前記切り替え点の後で利用される値を前記メモリに格納する処理を含むように前記切り替え可能プログラムを生成する
請求項１記載のプログラム生成装置。
【請求項２２】
前記プログラム生成部は、前記切り替え点決定部によって前記切り替え点として決定された境界を含むサブルーチンである対象サブルーチンと、当該対象サブルーチンの上位のサブルーチンとの間で、前記メモリのスタックのデータ構造を一致させる
請求項１記載のプログラム生成装置。
【請求項２３】
前記挿入部は、前記切り替えプログラムであるシステムコールを呼び出すプログラムを、前記切り替え可能プログラムに挿入する
請求項１記載のプログラム生成装置。
【請求項２４】
前記プログラム生成部は、さらに、前記プロセッサ毎に切り替え専用プログラムを生成し、
前記切り替え専用プログラムは、
プロセッサの切り替えが要求されているか否かを、当該切り替え専用プログラムに対応するプロセッサに判断させ、
切り替えが要求されている場合に、当該切り替え専用プログラムに対応するプロセッサが実行中の前記切り替え可能プログラムを前記切り替え点で停止させ、かつ、前記第２プロセッサに対応する前記切り替え可能プログラムを、前記切り替え点から継続して前記第２プロセッサに実行させ、
切り替えが要求されていない場合に、当該切り替え専用プログラムに対応するプロセッサが実行中の前記切り替え可能プログラムを継続して実行させるためのプログラムであり、
前記挿入部は、生成された切り替え専用プログラムを前記切り替えプログラムとして、前記切り替え可能プログラムに挿入する
請求項１記載のプログラム生成装置。
【請求項２５】
前記切り替え専用プログラムは、１つのサブルーチンとして構成され、
前記挿入部は、前記サブルーチンの呼び出しを前記切り替え点に挿入する
請求項２４記載のプログラム生成装置。
【請求項２６】
前記切り替え点決定部は、前記ソースプログラムのサブルーチンの呼び出し元の呼び出し部分、又は、前記サブルーチンからの復帰部分を、前記切り替え点として決定し、
前記プログラム生成部は、前記切り替え点として決定された呼び出し部分又は復帰部分を、前記切り替え専用プログラムに置き換えるように、前記切り替え可能プログラムを生成する
請求項２５記載のプログラム生成装置。
【請求項２７】
前記切り替え専用プログラムは、前記複数のプロセッサのそれぞれに専用のプロセッサ命令であり、
前記挿入部は、前記専用のプロセッサ命令を前記切り替え点に挿入する
請求項２３記載のプログラム生成装置。
【請求項２８】
前記切り替え点決定部は、前記ソースプログラムのサブルーチンの呼び出し元の呼び出し部分、又は、前記サブルーチンからの復帰部分を、前記切り替え点として決定し、
前記プログラム生成部は、前記切り替え点として決定された呼び出し部分又は復帰部分を、前記専用のプロセッサ命令に置き換えるように、前記切り替え可能プログラムを生成する
請求項２７記載のプログラム生成装置。
【請求項２９】
前記プログラム生成部は、さらに、前記切り替え点を含む所定の期間を、プロセッサの切り替え要求を受け付けることができる割り込み許可期間として設定し、前記割り込み許可期間以外の期間を、前記切り替え要求を受け付けない割り込み禁止期間として設定する
請求項１記載のプログラム生成装置。
【請求項３０】
互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサのそれぞれに対応する機械語プログラムを、同一のソースプログラムから生成するプログラム生成方法であって、
前記ソースプログラム中の所定の位置を切り替え点として決定する切り替え点決定ステップと、
前記切り替え点において前記メモリのデータ構造が前記複数のプロセッサ間で一致するように、前記ソースプログラムから、前記機械語プログラムである切り替え可能プログラムをプロセッサ毎に生成するプログラム生成ステップと、
前記複数のプロセッサの１つである第１プロセッサが実行中の、当該第１プロセッサに対応する前記切り替え可能プログラムを前記切り替え点で停止させ、かつ、前記複数のプロセッサの１つである第２プロセッサに、当該第２プロセッサに対応する前記切り替え可能プログラムを前記切り替え点から継続して実行させるための切り替えプログラムを、前記切り替え可能プログラムに挿入する挿入ステップとを含む
プログラム生成方法。
【請求項３１】
請求項３０記載のプログラム生成方法をコンピュータに実行させるためのプログラム。
【請求項３２】
互いに異なる命令セットを有し、かつ、メモリを共有し、それぞれに対応する切り替え可能プログラムを実行可能な複数のプロセッサと、
前記複数のプロセッサ間の切り替えを要求する制御部とを備え、
前記切り替え可能プログラムは、
同一のソースプログラムから生成された機械語プログラムであって、前記ソースプログラム中の所定の位置である切り替え点において前記メモリのデータ構造が前記複数のプロセッサ間で一致するように生成された、前記複数のプログラムのそれぞれに対応する機械語プログラムであり、
前記複数のプロセッサの１つである第１プロセッサは、
前記制御部によって前記切り替えを要求された場合に、当該第１プロセッサが実行中の、当該第１プロセッサに対応する前記切り替え可能プログラムを前記切り替え点で停止させ、かつ、前記複数のプロセッサの１つである第２プロセッサに、当該第２プロセッサに対応する前記切り替え可能プログラムを前記切り替え点から継続して実行させるための切り替えプログラムを実行する
プロセッサ装置。
【請求項３３】
マルチプロセッサシステムであって、
互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサと、
前記複数のプロセッサ間の切り替えを要求する制御部と、
前記複数のプロセッサのそれぞれに対応する機械語プログラムを、同一のソースプログラムから生成するプログラム生成装置とを備え、
前記プログラム生成装置は、
前記ソースプログラム中の所定の位置を切り替え点として決定する切り替え点決定部と、
前記切り替え点において前記メモリのデータ構造が前記複数のプロセッサ間で一致するように、前記ソースプログラムから、前記機械語プログラムである切り替え可能プログラムをプロセッサ毎に生成するプログラム生成部と、
前記複数のプロセッサの１つである第１プロセッサが実行中の、当該第１プロセッサに対応する前記切り替え可能プログラムを前記切り替え点で停止させ、かつ、前記複数のプロセッサの１つである第２プロセッサに、当該第２プロセッサに対応する前記切り替え可能プログラムを前記切り替え点から継続して実行させるための切り替えプログラムを、前記切り替え可能プログラムに挿入する挿入部とを備え、
前記第１プロセッサは、
前記制御部によって前記切り替えを要求された場合に、前記切り替えプログラムを実行する
マルチプロセッサシステム。
【請求項３４】
互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサの１つである第１プロセッサで実行される、ソースプログラムから生成された機械語プログラムであって、
前記ソースプログラム中の所定の位置である切り替え点において前記メモリのデータ構造を前記複数のプロセッサ間で一致させる機能と、
前記切り替え点で当該機械語プログラムを停止するとともに、前記複数のプロセッサの１つである第２プロセッサに、当該第２プロセッサに対応し、前記ソースプログラムから生成された機械語プログラムを前記切り替え点から継続して実行させるための切り替えプログラムを実行する機能とを含む
機械語プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム生成装置、プログラム生成方法、プロセッサ装置及びプログラム処理システムに関する。特に、本発明は、互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサを備えるヘテロジニアスマルチプロセッサシステムにおけるプログラム生成装置、プログラム生成方法、プロセッサ装置及びマルチプロセッサシステムに関する。
【背景技術】
【０００２】
携帯電話及びデジタルテレビなどのデジタル組込み機器には、性能向上及び低電力などを実現するため、個々の機能で必要となる処理に特化したプロセッサを組み込む場合が多い。例えば、所定の処理に特化したプロセッサには、ネットワークブラウザなどの処理では汎用ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、音声及び画像などの処理では信号処理を強化したＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）、字幕及び３次元グラフィック表示などの処理には画面表示処理を強化したＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）などがある。このように、各処理に最適化されたプロセッサを搭載し、最小限のコストでシステムを構成するのが一般的である。【０００３】
さらに、ネットワーク動画のように１つの機能に対して、ネットワーク処理と映像処理という複数の処理を同時に実行する必要のあるシステムでは、処理それぞれに適したプロセッサを同時に備えることが多い。これにより、全ての処理が同時に使用される最大負荷時にも耐えうるシステムを、最小限のコストで実現することが可能となる。【０００４】
しかしながら、近年のデジタル機器は、１つのシステムで多数の機能を実現することが求められており、使用する機能によっては必ずしも全てのプロセッサの最大性能を必要としない場合がある。例えば、ネットワーク処理中に同時に音楽を再生する場合は、汎用ＣＰＵとＤＳＰとが同時に必要になるが、音楽再生のみとなった時点では主にＤＳＰだけの処理負荷が大きくなる。【０００５】
しかし、たとえ処理負荷が小さくても、各特性を持った処理を実行するプロセッサを全て通電しておく必要があり、１つのプロセッサで全てを実現するシステムに比べて、電力消費面で有利ではない。例えば、音楽再生の場合、たとえインターネットブラウザを終了してインターネット処理がなくなっても、システム制御が汎用ＣＰＵで行われていたとすれば、たとえシステム制御の必要な処理負荷が小さくても電源を停止することができず、汎用ＣＰＵとＤＳＰとの両方を通電し続けることになる。【０００６】
上記のような場合において、近年、プロセッサの処理を他のプロセッサが代行して実行させて１つのプロセッサに処理を集め、他のプロセッサの電源を落とすことで電力を抑えることが提案されている。【０００７】
例えば、特許文献１には、互いに種類の異なる複数のプロセッサを含むシステムにおける省電力化やシステム処理効率の向上を実現するための技術が開示されている。具体的には、特許文献１に記載のマルチプロセッサシステムは、ＧＰＵとＭＰＵ（Ｍｅｄｉａ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）とを備える。そして、マルチプロセッサシステムは、ＭＰＵに動画像デコード処理を実行させるための第１プログラムモジュールをＭＰＵに実行させる第１モードと、ＧＰＵに動画像デコード処理を実行させるための第２プログラムモジュールをＧＰＵに実行させる第２モードとを切り替える。このときの切り替えは、バッテリ及び外部電源などの状況に基づいて実行される。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００８−２７６３９５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、上記従来技術では、タスクの実行中にはプロセッサ間の切り替えは不可能であるため、システムの状況及びユースケースの変更に対応することができないという課題がある。【００１０】
一般に、互いに異なる命令セットを有する複数のプロセッサのそれぞれが実行する機械語プログラムは異なる。このため、最終結果は一致しても、その途中での処理過程は異なる。そのため、２つのプロセッサの実行プログラムの対応する位置で停止して、作業メモリの状態を比較したとしても、その処理途中の作業メモリの状態が一致するとは限らない。すなわち、タスクの実行中にはプロセッサ間の切り替えができない。【００１１】
この結果、例えば、インターネットブラウザと音楽再生との場合、たとえインターネットブラウザが終了してネットワーク処理がなくなったことにより、汎用ＣＰＵの処理負荷が軽くなったとしても、音楽再生の機能を汎用ＣＰＵに移すと処理の継続性が保てなくなる。このため、一旦音楽再生を停止させるなどの処理が必要となり、システムの状況及びユースケースの変更には対応することができない。【００１２】
そこで、本発明は、上記課題を鑑みてなされたものであって、タスクの実行中であってもプロセッサ間の切り替えを可能にし、システムの状況及びユースケースの変更に対応することができるプログラム生成装置、プログラム生成方法、プロセッサ装置及びマルチプロセッサシステムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
上記課題を解決するために、本発明の一態様に係るプログラム生成装置は、互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサのそれぞれに対応する機械語プログラムを、同一のソースプログラムから生成するプログラム生成装置であって、前記ソースプログラム中の所定の位置を切り替え点として決定する切り替え点決定部と、前記切り替え点において前記メモリのデータ構造が前記複数のプロセッサ間で一致するように、前記ソースプログラムから、前記機械語プログラムである切り替え可能プログラムをプロセッサ毎に生成するプログラム生成部と、前記複数のプロセッサの１つである第１プロセッサが実行中の、当該第１プロセッサに対応する前記切り替え可能プログラムを前記切り替え点で停止させ、かつ、前記複数のプロセッサの１つである第２プロセッサに、当該第２プロセッサに対応する前記切り替え可能プログラムを前記切り替え点から継続して実行させるための切り替えプログラムを、前記切り替え可能プログラムに挿入する挿入部とを備える。【００１４】
これにより、切り替え点ではメモリのデータ構造が一致しているため、切り替えプログラムを実行することで、プロセッサを切り替えることができる。ここでのプロセッサの切り替えとは、プログラムを実行中のプロセッサを停止し、停止した時点から他のプロセッサで継続してプログラムを実行させることである。【００１５】
したがって、本発明の一態様に係るプログラム生成装置によれば、第１プロセッサが実行中のタスクを第２プロセッサが継続して実行することができる。つまり、実行中のプロセッサでは、他のプロセッサで処理が継続できるようなデータメモリ状態で処理を中断し、他のプロセッサは、データメモリ状態を引き継ぎ、切り替え先の該当するプログラム位置から再開させることで同じデータメモリを共有しながら一貫性を保って処理を継続することができる。【００１６】
また、前記プログラム生成装置は、さらに、前記切り替え可能プログラムの生成を指示する指示部を備え、前記切り替え点決定部は、前記指示部が前記切り替え可能プログラムの生成を指示した場合に、前記切り替え点を決定し、前記プログラム生成部は、前記指示部が前記切り替え可能プログラムの生成を指示した場合に、前記切り替え可能プログラムを生成し、前記挿入部は、前記指示部が前記切り替え可能プログラムの生成を指示した場合に、前記切り替えプログラムを前記切り替え可能プログラムに挿入してもよい。【００１７】
これにより、選択的に切り替え可能プログラムを生成することができる。例えば、ソースプログラムが特定のプロセッサのみでしか実行できない場合などは、切り替え可能プログラムを生成する必要がない。このような場合に、切り替え可能プログラムの生成を指示しないことで、プログラム生成に係る処理量を削減することができる。【００１８】
また、前記プログラム生成部は、前記指示部が前記切り替え可能プログラムの生成を指示しない場合に、前記複数のプロセッサのうち対応するプロセッサのみで実行可能なプログラムを、前記ソースプログラムに基づいて前記プロセッサ毎に生成してもよい。【００１９】
これにより、選択的に切り替え可能プログラムを生成することができる。例えば、ソースプログラムが特定のプロセッサのみでしか実行できない場合などは、切り替え可能プログラムを生成する必要がない。このような場合に、切り替え可能プログラムの生成を指示しないことで、プログラム生成に係る処理量を削減することができる。【００２０】
また、前記切り替え点決定部は、前記ソースプログラムの基本ブロックの境界の少なくとも一部を、前記切り替え点として決定してもよい。【００２１】
これにより、基本ブロックは、途中に分岐及び合流を含まない処理のまとまりであるので、基本ブロックの境界を切り替え点とすることで、切り替え点の管理を容易に行うことができる。【００２２】
また、前記基本ブロックは、前記ソースプログラムのサブルーチンであり、前記切り替え点決定部は、前記ソースプログラムのサブルーチンの境界の少なくとも一部を、前記切り替え点として決定してもよい。【００２３】
これにより、サブルーチンの境界を切り替え点とすることで、プロセッサの切り替えを容易に行うことができる。例えば、サブルーチンへの分岐先アドレス及びサブルーチンからの復帰先アドレスを、複数のプロセッサ間で対応付けて管理することで、切り替え先のプロセッサでの処理の継続を容易に行うことができる。【００２４】
また、前記切り替え点決定部は、前記サブルーチンの境界である前記サブルーチンの呼び出し元の呼び出し部分を、前記切り替え点として決定してもよい。【００２５】
これにより、呼び出し部分を切り替え点とすることで、プロセッサの切り替えを容易に行うことができる。例えば、サブルーチンへの分岐先アドレスを複数のプロセッサ間で対応付けて管理することで、切り替え先のプロセッサは、対応する分岐先アドレスを取得して、処理の継続を容易に行うことができる。【００２６】
また、前記切り替え点決定部は、前記サブルーチンの境界である前記サブルーチンの呼び出し先の先頭及び終端の少なくとも一方を、前記切り替え点として決定してもよい。【００２７】
これにより、サブルーチンの呼び出し先の先頭及び終端の少なくとも一方を切り替え点とすることで、プロセッサの切り替えを容易に行うことができる。例えば、サブルーチンからの復帰先アドレスを複数のプロセッサ間で対応付けて管理することで、切り替え先のプロセッサは、対応する復帰先アドレスを取得して、処理の継続を容易に行うことができる。【００２８】
また、前記切り替え点決定部は、前記ソースプログラム中のサブルーチンの呼び出しの階層の深さが、所定の閾値より浅いサブルーチンの境界の少なくとも一部を、前記切り替え点として決定してもよい。【００２９】
これにより、全てのサブルーチンを切り替えの対象とはせずに、呼び出しの階層構造において浅いサブルーチンを切り替えの対象とすることで、切り替え点の数を制限することができる。切り替え点の数が多いと、切り替えの判断処理などが多くなるため、プログラムの処理が遅くなる場合があるので、切り替え点の数を制限することで、処理の低速化を抑制することができる。【００３０】
また、前記切り替え点決定部は、前記ソースプログラムの分岐の少なくとも一部を、前記切り替え点として決定してもよい。【００３１】
これにより、分岐を切り替え点とすることで、プロセッサの切り替えを容易に行うことができる。例えば、分岐先アドレスを複数のプロセッサ間で対応付けて管理することで、切り替え先のプロセッサは、対応する分岐先アドレスを取得して、処理の継続を容易に行うことができる。【００３２】
また、前記切り替え点決定部は、前記ソースプログラムの分岐のうち、繰り返し処理への分岐を、前記切り替え点の対象から除外してもよい。【００３３】
これにより、繰り返し処理において繰り返しの度に切り替えの判断処理を行うことを防止することができ、処理の低速化を抑制することができる。【００３４】
また、前記切り替え点決定部は、隣り合う切り替え点の間に含まれる処理を実行するのに要する期間が、予め定められた期間より短くなるように、前記切り替え点を決定してもよい。【００３５】
これにより、切り替えが要求された場合に、実際にプロセッサが切り替えられるまでの待ち時間が大きくなることを防止することができる。【００３６】
また、前記切り替え点決定部は、前記ソースプログラム中で予め定められた位置を、前記切り替え点として決定してもよい。【００３７】
これにより、ソースプログラムを生成する際にユーザによって切り替え点を指定することができるので、ユーザの意図した地点での切り替えを可能にすることができる。【００３８】
また、前記プログラム生成部は、前記切り替え点において前記メモリのスタックのデータ構造が前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成してもよい。【００３９】
これにより、スタックのデータ構造を切り替え点で一致させているので、切り替え先のプロセッサでは、スタックをそのまま利用することができる。【００４０】
また、前記プログラム生成部は、前記切り替え点において、前記メモリのスタックに格納されるデータのデータサイズ及び配置が、前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成してもよい。【００４１】
これにより、スタックに格納されるデータのサイズ及び配置を切り替え点で一致させているので、切り替え先のプロセッサでは、スタックをそのまま利用することができる。【００４２】
また、前記プログラム生成部は、前記切り替え点において、前記メモリに格納される構造化データ内のデータ構造が前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成してもよい。【００４３】
これにより、構造化データ（構造体変数）のデータ構造を切り替え点で一致させているので、切り替え先のプロセッサでは、構造化データをそのまま利用することができる。【００４４】
また、前記プログラム生成部は、前記切り替え点において、前記ソースプログラム中にデータ幅が明記されないデータのデータ幅が前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成してもよい。【００４５】
これにより、データのデータ幅を切り替え点で一致させているので、切り替え先のプロセッサでは、データをそのまま利用することができる。【００４６】
また、前記プログラム生成部は、前記切り替え点において、前記ソースプログラム中で広域定義されるデータのデータ構造が前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成してもよい。【００４７】
これにより、広域データのデータ構造を切り替え点で一致させているので、切り替え先のプロセッサでは、広域データをそのまま利用することができる。【００４８】
また、前記プログラム生成部は、前記切り替え点において、前記メモリに格納されるデータのエンディアンが前記複数のプロセッサ間で一致するように、前記切り替え可能プログラムを生成してもよい。【００４９】
これにより、データのエンディアンを切り替え点で一致させているので、切り替え先のプロセッサは、自プロセッサのエンディアンと、一致させたエンディアンとが同じである場合は、メモリからデータを読み出したデータをそのまま利用することができる。また、切り替え先のプロセッサは、自プロセッサのエンディアンと、一致させたエンディアンとが異なる場合は、読み出したデータの並び替えを行うことで、メモリから読み出したデータを利用することができる。【００５０】
また、前記プログラム生成部は、さらに、前記ソースプログラム中の同一の分岐を示す分岐先アドレスであって、前記複数のプロセッサ毎の前記切り替え可能プログラムにおける分岐先アドレスのそれぞれに共通の識別子を付与し、当該識別子と前記分岐先アドレスとを対応付けたアドレスリストを生成し、前記切り替え可能プログラム中の前記分岐先アドレスを前記メモリに格納する処理を、当該分岐先アドレスに対応する識別子を前記メモリに格納する処理に置き換えてもよい。【００５１】
これにより、複数のプロセッサそれぞれの分岐先アドレスを共通の識別子に対応付けて管理するので、切り替え先のプロセッサは、切り替え元のプロセッサが次に実行する予定であった処理の分岐先アドレスの識別子を取得することで、自プロセッサに対応する分岐先アドレスを取得することができる。したがって、切り替え元のプロセッサが実行していたタスクを、切り替え先のプロセッサが継続して実行することができる。【００５２】
また、前記プログラム生成部は、さらに、前記ソースプログラム中の同一の分岐を示す分岐先アドレスであって、前記複数のプロセッサ毎の前記切り替え可能プログラムにおける分岐先アドレスのそれぞれを互いに対応付けた構造化アドレスデータを生成してもよい。【００５３】
これにより、複数のプロセッサそれぞれの分岐先アドレスを対応付けた構造化アドレスデータを管理するので、切り替え先のプロセッサは、切り替え元のプロセッサが次に実行する予定であった処理の分岐先アドレスを含む構造化アドレスデータを取得することで、自プロセッサに対応する分岐先アドレスを取得することができる。したがって、切り替え元のプロセッサが実行していたタスクを、切り替え先のプロセッサが継続して実行することができる。【００５４】
また、前記複数のプロセッサはそれぞれ、少なくとも１つのレジスタを有し、前記プログラム生成部は、前記切り替え点の前で前記レジスタに格納されている値であり、前記切り替え点の後で利用される値を前記メモリに格納する処理を含むように前記切り替え可能プログラムを生成してもよい。【００５５】
これにより、レジスタに格納された値が切り替え点を跨いで保証されない場合であっても、レジスタに格納された値をメモリに退避させているので、プロセッサの切り替えを行うことができる。【００５６】
また、前記プログラム生成部は、前記切り替え点決定部によって前記切り替え点として決定された境界を含むサブルーチンである対象サブルーチンと、当該対象サブルーチンの上位のサブルーチンとの間で、前記メモリのスタックのデータ構造を一致させてもよい。【００５７】
これにより、対象サブルーチンとその上位のサブルーチンとの間でデータの一貫性を取ることができ、正しく上位のサブルーチンを実行することができる。【００５８】
また、前記挿入部は、前記切り替えプログラムであるシステムコールを呼び出すプログラムを、前記切り替え可能プログラムに挿入してもよい。【００５９】
これにより、システムコールによって切り替えプログラムを実行することができる。【００６０】
また、前記プログラム生成部は、さらに、前記プロセッサ毎に切り替え専用プログラムを生成し、前記切り替え専用プログラムは、プロセッサの切り替えが要求されているか否かを、当該切り替え専用プログラムに対応するプロセッサに判断させ、切り替えが要求されている場合に、当該切り替え専用プログラムに対応するプロセッサが実行中の前記切り替え可能プログラムを前記切り替え点で停止させ、かつ、前記第２プロセッサに対応する前記切り替え可能プログラムを、前記切り替え点から継続して前記第２プロセッサに実行させ、切り替えが要求されていない場合に、当該切り替え専用プログラムに対応するプロセッサが実行中の前記切り替え可能プログラムを継続して実行させるためのプログラムであり、前記挿入部は、生成された切り替え専用プログラムを前記切り替えプログラムとして、前記切り替え可能プログラムに挿入してもよい。【００６１】
これにより、プログラム中の切り替え専用プログラムによって切り替えプログラムを実行することができる。【００６２】
また、前記切り替え専用プログラムは、１つのサブルーチンとして構成され、前記挿入部は、前記サブルーチンの呼び出しを前記切り替え点に挿入してもよい。【００６３】
これにより、切り替えプログラムを切り替え可能プログラム中の１つのサブルーチンとして構成することで、サブルーチン呼び出しによって、切り替えプログラムを実行することができる。【００６４】
例えば、前記切り替え点決定部は、前記ソースプログラムのサブルーチンの呼び出し元の呼び出し部分、又は、前記サブルーチンからの復帰部分を、前記切り替え点として決定し、前記プログラム生成部は、前記切り替え点として決定された呼び出し部分又は復帰部分を、前記切り替え専用プログラムに置き換えるように、前記切り替え可能プログラムを生成してもよい。【００６５】
また、前記切り替え専用プログラムは、前記複数のプロセッサのそれぞれに専用のプロセッサ命令であり、前記挿入部は、前記専用のプロセッサ命令を前記切り替え点に挿入してもよい。【００６６】
これにより、切り替えプログラムが専用のプロセッサ命令であるので、プロセッサ命令の実行によって、切り替えプログラムを実行することができる。また、専用のプロセッサ命令を利用することで、システムコールを呼び出すプログラムを挿入する場合に比べて、プロセッサの切り替え要求がない場合における切り替え判定のオーバーヘッドを軽減することができる。【００６７】
例えば、前記切り替え点決定部は、前記ソースプログラムのサブルーチンの呼び出し元の呼び出し部分、又は、前記サブルーチンからの復帰部分を、前記切り替え点として決定し、前記プログラム生成部は、前記切り替え点として決定された呼び出し部分又は復帰部分を、前記専用のプロセッサ命令に置き換えるように、前記切り替え可能プログラムを生成してもよい。【００６８】
これにより、専用のプロセッサ命令を利用することで、システムコールを呼び出すプログラムを挿入する場合に比べて、プロセッサの切り替え要求がない場合における切り替え判定のオーバーヘッドを軽減することができる。【００６９】
また、前記プログラム生成部は、さらに、前記切り替え点を含む所定の期間を、プロセッサの切り替え要求を受け付けることができる割り込み許可期間として設定し、前記割り込み許可期間以外の期間を、前記切り替え要求を受け付けない割り込み禁止期間として設定してもよい。【００７０】
これにより、割り込み許可期間を設けることで、プロセッサの切り替えを行うことができる期間を明確にすることができ、意図しない位置での切り替えを防止することができる。【００７１】
また、本発明の一態様に係るプロセッサ装置は、互いに異なる命令セットを有し、かつ、メモリを共有し、それぞれに対応する切り替え可能プログラムを実行可能な複数のプロセッサと、前記複数のプロセッサ間の切り替えを要求する制御部とを備え、前記切り替え可能プログラムは、同一のソースプログラムから生成された機械語プログラムであって、前記ソースプログラム中の所定の位置である切り替え点において前記メモリのデータ構造が前記複数のプロセッサ間で一致するように生成された、前記複数のプログラムのそれぞれに対応する機械語プログラムであり、前記複数のプロセッサの１つである第１プロセッサは、前記制御部によって前記切り替えを要求された場合に、当該第１プロセッサが実行中の、当該第１プロセッサに対応する前記切り替え可能プログラムを前記切り替え点で停止させ、かつ、前記複数のプロセッサの１つである第２プロセッサに、当該第２プロセッサに対応する前記切り替え可能プログラムを前記切り替え点から継続して実行させるための切り替えプログラムを実行する。【００７２】
これにより、切り替え点ではメモリのデータ構造が一致しているため、切り替えプログラムを実行することで、プロセッサを切り替えることができる。ここでのプロセッサの切り替えとは、プログラムを実行中のプロセッサを停止し、停止した時点から他のプロセッサで継続してプログラムを実行させることである。したがって、本発明の一態様に係るプロセッサ装置によれば、第１プロセッサが実行中のタスクを第２プロセッサが継続して実行することができる。【００７３】
また、本発明の一態様に係るマルチプロセッサシステムは、互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサと、前記複数のプロセッサ間の切り替えを要求する制御部と、前記複数のプロセッサのそれぞれに対応する機械語プログラムを、同一のソースプログラムから生成するプログラム生成装置とを備え、前記プログラム生成装置は、前記ソースプログラム中の所定の位置を切り替え点として決定する切り替え点決定部と、前記切り替え点において前記メモリのデータ構造が前記複数のプロセッサ間で一致するように、前記ソースプログラムから、前記機械語プログラムである切り替え可能プログラムをプロセッサ毎に生成するプログラム生成部と、前記複数のプロセッサの１つである第１プロセッサが実行中の、当該第１プロセッサに対応する前記切り替え可能プログラムを前記切り替え点で停止させ、かつ、前記複数のプロセッサの１つである第２プロセッサに、当該第２プロセッサに対応する前記切り替え可能プログラムを前記切り替え点から継続して実行させるための切り替えプログラムを、前記切り替え可能プログラムに挿入する挿入部とを備え、前記第１プロセッサは、前記制御部によって前記切り替えを要求された場合に、前記切り替えプログラムを実行する。【００７４】
これにより、切り替え点ではメモリのデータ構造が一致しているため、切り替えプログラムを実行することで、プロセッサを切り替えることができる。ここでのプロセッサの切り替えとは、プログラムを実行中のプロセッサを停止し、停止した時点から他のプロセッサで継続してプログラムを実行させることである。したがって、本発明の一態様に係るマルチプロセッサシステムによれば、第１プロセッサが実行中のタスクを第２プロセッサが継続して実行することができる。【００７５】
また、本発明の一態様に係る切り替え可能プログラムは、互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサの１つである第１プロセッサで実行される、ソースプログラムから生成された機械語プログラムであって、前記ソースプログラム中の所定の位置である切り替え点において前記メモリのデータ構造を前記複数のプロセッサ間で一致させる機能と、前記切り替え点で当該機械語プログラムを停止するとともに、前記複数のプロセッサの１つである第２プロセッサに、当該第２プロセッサに対応し、前記ソースプログラムから生成された機械語プログラムを前記切り替え点から継続して実行させるための切り替えプログラムを実行する機能とを含む。【００７６】
なお、本発明は、プログラム生成装置又はプロセッサ装置として実現できるだけではなく、当該プログラム生成装置又はプロセッサ装置を構成する処理部をステップとする方法として実現することもできる。また、これらステップをコンピュータに実行させるプログラムとして実現してもよい。さらに、当該プログラムを記録したコンピュータ読み取り可能なＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）などの記録媒体、並びに、当該プログラムを示す情報、データ又は信号として実現してもよい。そして、それらプログラム、情報、データ及び信号は、インターネットなどの通信ネットワークを介して配信してもよい。
【発明の効果】
【００７７】
本発明によれば、タスクの実行中であってもプロセッサ間での処理の移動を可能にし、システムの状況及びユースケースの変更に対応することができる。
【図面の簡単な説明】
【００７８】
【図１】図１は、本発明の実施の形態に係るマルチプロセッサシステムの構成の一例を示すブロック図である。
【図２】図２は、本発明の実施の形態に係るプログラム生成装置（コンパイラ）の構成の一例を示すブロック図である。
【図３Ａ】図３Ａは、本発明の実施の形態に係るプロセッサＡの専用プログラムにおけるスタック領域、広域データ領域及び出力データ領域のデータ構造と、レジスタ構成の一例を示す図である。
【図３Ｂ】図３Ｂは、本発明の実施の形態に係るプロセッサＢの専用プログラムにおけるスタック領域、広域データ領域及び出力データ領域のデータ構造と、レジスタ構成の一例を示す図である。
【図３Ｃ】図３Ｃは、本発明の実施の形態に係る切り替え可能プログラムにおけるスタック領域、広域データ領域及び出力データ領域のデータ構造と、レジスタ構成の一例を示す図である。
【図４Ａ】図４Ａは、本発明の実施の形態に係るプログラムアドレスリストの一例を示す図である。
【図４Ｂ】図４Ｂは、本発明の実施の形態に係るプログラムアドレスリストの一例を示す図である。
【図５Ａ】図５Ａは、本発明の実施の形態に係るサブルーチンの呼び出し元の通常のプログラムの一例を示すフローチャートである。
【図５Ｂ】図５Ｂは、本発明の実施の形態に係るサブルーチンの呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。
【図５Ｃ】図５Ｃは、本発明の実施の形態に係るサブルーチンの呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。
【図６Ａ】図６Ａは、本発明の実施の形態に係るサブルーチンからの復帰処理の通常のプログラムの一例を示すフローチャートである。
【図６Ｂ】図６Ｂは、本発明の実施の形態に係るサブルーチンからの復帰処理の切り替え可能プログラムの一例を示すフローチャートである。
【図６Ｃ】図６Ｃは、本発明の実施の形態に係るサブルーチンからの復帰処理の切り替え可能プログラムの一例を示すフローチャートである。
【図７Ａ】図７Ａは、本発明の実施の形態に係るプロセッサ切り替え処理において切り替え元のプロセッサの動作の一例を示すフローチャートである。
【図７Ｂ】図７Ｂは、本発明の実施の形態に係るプロセッサ切り替え処理において切り替え先のプロセッサの動作の一例を示すフローチャートである。
【図８Ａ】図８Ａは、本発明の実施の形態に係るプログラム生成装置の動作の一例を示すフローチャートである。
【図８Ｂ】図８Ｂは、本発明の実施の形態に係るプログラム生成装置の動作の一例を示すフローチャートである。
【図９】図９は、本発明の実施の形態に係るマルチプロセッサシステムの動作の一例を示すシーケンス図である。
【図１０】図１０は、本発明の実施の形態に係るソースプログラムの一例を示す図である。
【図１１】図１１は、本発明の実施の形態に係る通常機械語プログラム及びプロセッサ切り替え可能機械語プログラムの一例を示す図である。
【図１２】図１２は、本発明の実施の形態に係るスタック構造の一例を示す図である。
【図１３】図１３は、本発明の実施の形態において基本ブロックの境界を切り替え点として決定する例を説明するための図である。
【図１４Ａ】図１４Ａは、本発明の実施の形態においてサブルーチンの呼び出し元の呼び出し部分及び復帰部分を切り替え点として決定する例を説明するための図である。
【図１４Ｂ】図１４Ｂは、本発明の実施の形態においてサブルーチンの呼び出し先の先頭及び終端を切り替え点として決定する例を説明するための図である。
【図１４Ｃ】図１４Ｃは、本発明の実施の形態においてサブルーチンの境界を切り替え点として決定する例を説明するための図である。
【図１５】図１５は、本発明の実施の形態の変形例においてサブルーチンの階層の深さに基づいて切り替え点を決定する例を説明するための図である。
【図１６】図１６は、本発明の実施の形態の変形例においてサブルーチンの階層の深さに基づいて切り替え点を決定する別の例を説明するための図である。
【図１７Ａ】図１７Ａは、本発明の実施の形態の変形例に係る分岐点に基づいて切り替え点を決定する例を説明するためのソースプログラムの一例を示す図である。
【図１７Ｂ】図１７Ｂは、本発明の実施の形態の変形例に係る分岐点に基づいて切り替え点を決定する例を説明するための機械語プログラムの一例を示す図である。
【図１８】図１８は、本発明の実施の形態の変形例に係る一定間隔で切り替え点を決定する例を説明するための図である。
【図１９】図１９は、本発明の実施の形態の変形例に係るユーザ指定によって切り替え点を決定する例を説明するための図である。
【図２０】図２０は、本発明の実施の形態の変形例に係る切り替え要求の判定処理の一例を示すフローチャートである。
【図２１Ａ】図２１Ａは、本発明の実施の形態の変形例に係る構造化データの一例を示す図である。
【図２１Ｂ】図２１Ｂは、本発明の実施の形態の変形例に係る構造化データのデータ構造の一例を示す図である。
【図２２Ａ】図２２Ａは、本発明の実施の形態の変形例に係るデータ幅が明記されていないデータの一例を示す図である。
【図２２Ｂ】図２２Ｂは、本発明の実施の形態の変形例に係るデータ幅が明記されていないデータのデータ構造の一例を示す図である。
【図２３Ａ】図２３Ａは、本発明の実施の形態に係るデータの一例を示す図である。
【図２３Ｂ】図２３Ｂは、本発明の実施の形態においてデータのエンディアンを複数のプロセッサ間で一致させることを説明するための図である。
【図２４】図２４は、本発明の実施の形態の変形例に係るサブルーチンの階層に応じてメモリのデータ構造を一致させる処理の一例を説明するための図である。
【図２５Ａ】図２５Ａは、本発明の実施の形態の変形例に係る構造化アドレスデータの一例を示す図である。
【図２５Ｂ】図２５Ｂは、本発明の実施の形態の変形例に係るサブルーチンの呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。
【図２５Ｃ】図２５Ｃは、本発明の実施の形態の変形例に係るサブルーチンの読み出し元の切り替え可能プログラムの一例を示すフローチャートである。
【図２５Ｄ】図２５Ｄは、本発明の実施の形態の変形例に係るサブルーチンからの復帰処理の切り替え可能プログラムの一例を示すフローチャートである。
【図２６Ａ】図２６Ａは、本発明の実施の形態の変形例に係るサブルーチン呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。
【図２６Ｂ】図２６Ｂは、本発明の実施の形態の変形例に係るサブルーチン呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。
【図２６Ｃ】図２６Ｃは、本発明の実施の形態の変形例に係る特殊サブルーチンコール命令の一例を示すフローチャートである。
【図２７Ａ】図２７Ａは、本発明の実施の形態の変形例に係る割り込み許可区間及び禁止区間の一例を示す図である。
【図２７Ｂ】図２７Ｂは、本発明の実施の形態の変形例に係る割り込み禁止区間の一例を示す図である。
【発明を実施するための形態】
【００７９】
以下、本発明の実施の形態に係るプログラム生成装置（コンパイラ）、プロセッサ装置及びプロセッサシステムについて、図面を用いて詳細に説明する。なお、以下で説明する実施の形態は、いずれも本発明の好ましい一具体例を示すものである。以下の実施の形態で示される数値、構成要素、構成要素の配置位置及び接続形態、ステップ、ステップの順序などは、一例であり、本発明を限定する主旨ではない。本発明は、請求の範囲だけによって限定される。よって、以下の実施の形態における構成要素のうち、本発明の最上位概念を示す独立請求項に記載されていない構成要素については、本発明の課題を達成するのに必ずしも必要ではないが、より好ましい形態を構成するものとして説明される。
【００８０】
本発明の実施の形態に係るプログラム生成装置は、互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサのそれぞれに対応する機械語プログラムを、同一のソースプログラムから生成する。本発明の実施の形態に係るプログラム生成装置は、ソースプログラム中の所定の位置を切り替え点として決定する切り替え点決定部と、切り替え点においてメモリのデータ構造が複数のプロセッサ間で一致するように、ソースプログラムから、機械語プログラムである切り替え可能プログラムをプロセッサ毎に生成するプログラム生成部と、切り替えプログラムを切り替え可能プログラムに挿入する挿入部とを備えることを特徴とする。
【００８１】
ここで、切り替えプログラムは、第１プロセッサが実行中の、当該第１プロセッサに対応する切り替え可能プログラムを切り替え点で停止させ、かつ、第２プロセッサに対応する切り替え可能プログラムを切り替え点から継続して第２プロセッサに実行させるためのプログラムである。
【００８２】
また、切り替え可能プログラムは、互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサの１つで実行される、ソースプログラムから生成された機械語プログラムである。切り替え可能プログラムは、ソースプログラム中の所定の位置である切り替え点においてメモリのデータ構造を複数のプロセッサ間で一致させる機能と、切り替え点で当該切り替え可能プログラムを停止するとともに、複数のプロセッサの１つである他のプロセッサに、当該他のプロセッサに対応し、ソースプログラムから生成された機械語プログラムを切り替え点から継続して実行させるための切り替えプログラムを実行する機能とを含んでいる。
【００８３】
要するに、本発明の実施の形態に係るプログラム生成装置（コンパイラ）は、Ｃ言語などの高級言語で記述されたソースプログラムを、互いに異なる命令セットを有する複数のプロセッサで実行可能なプログラムであって、複数のプロセッサそれぞれに対応する機械語プログラムに翻訳するクロスコンパイラである。これにより、処理途中の特定位置で処理を中断して、他のプロセッサで処理を再開させても、処理の一貫性が保つことができる。
【００８４】
また、本発明の実施の形態に係るプロセッサ装置は、上記の複数のプロセッサと、当該複数のプロセッサ間の切り替えを制御する制御部とを備えることを特徴とする。要するに、複数のプロセッサの１つである第１プロセッサは、制御部によって切り替えを要求された場合に、上記の切り替えプログラムを実行する。
【００８５】
図１は、本発明の実施の形態に係るクロスコンパイル環境を実現するマルチプロセッサシステム１０の構成の一例を示すブロック図である。図１に示すように、マルチプロセッサシステム１０は、プログラム生成装置２０と、プロセッサＡ用プログラムメモリ３０と、プロセッサＢ用プログラムメモリ３１と、プロセッサ装置４０と、データメモリ５０とを備える。
【００８６】
プログラム生成装置２０は、複数のプロセッサのそれぞれに対応する機械語プログラムを同一のソースプログラム２００から生成する。ソースプログラム２００は、高級言語で記述されたソースプログラム（ソースコード）である。高級言語は、Ｃ言語、Ｊａｖａ(登録商標)、Ｐｅｒｌ及びＦＯＲＴＲＡＮなどのプログラム言語である。機械語プログラムは、各プロセッサが理解し、実行可能なプログラム言語であり、例えば、２値の電気信号の集まりである。
【００８７】
図１に示すように、プログラム生成装置２０は、プロセッサＡ用コンパイラ１００と、プロセッサＢ用コンパイラ１０１と、切り替え可能プログラム生成指示部１１０とを備える。
【００８８】
プロセッサＡ用コンパイラ１００は、ソースプログラム２００を変換することで、プロセッサ装置４０が備えるプロセッサＡ１２０に対応する機械語プログラムを生成する。プロセッサＡ用コンパイラ１００は、切り替え可能プログラム生成指示部１１０からの指示を受けて、機械語プログラムの生成方法を切り替える。
【００８９】
具体的には、プロセッサＡ用コンパイラ１００は、切り替え可能プログラム生成指示部１１０から切り替え可能プログラムの生成指示を受けた場合、ソースプログラム２００中の所定の位置である切り替え点においてデータメモリ５０のデータ構造が複数のプロセッサ間で一致するように、プロセッサＡ１２０に対応する切り替え可能プログラムＡを生成する。言い換えると、プロセッサＡ用コンパイラ１００は、複数のプロセッサ間での共通ルールに従ってソースプログラム２００を変換することで、切り替え可能プログラムＡを生成する。生成された切り替え可能プログラムＡは、プロセッサＡ用機械語プログラム２１０として、プロセッサＡ用プログラムメモリ３０に格納される。
【００９０】
また、プロセッサＡ用コンパイラ１００は、切り替え可能プログラム生成指示部１１０から切り替え可能プログラムの生成指示を受けなかった場合、プロセッサＡ１２０の独自のルールに従ってソースプログラム２００を変換することで、プロセッサＡ１２０に対応する専用機械語プログラムＡを生成する。生成された専用機械語プログラムＡは、プロセッサＡ用機械語プログラム２１０として、プロセッサＡ用プログラムメモリ３０に格納される。
【００９１】
プロセッサＢ用コンパイラ１０１は、ソースプログラム２００を変換することで、プロセッサ装置４０が備えるプロセッサＢ１２１に対応する機械語プログラムを生成する。プロセッサＢ用コンパイラ１０１は、切り替え可能プログラム生成指示部１１０からの指示を受けて、機械語プログラムの生成方法を切り替える。
【００９２】
具体的には、プロセッサＢ用コンパイラ１０１は、切り替え可能プログラム生成指示部１１０から切り替え可能プログラムの生成指示を受けた場合、切り替え点においてデータメモリ５０のデータ構造が複数のプロセッサ間で一致するように、プロセッサＢ１２１に対応する切り替え可能プログラムＢを生成する。言い換えると、プロセッサＢ用コンパイラ１０１は、複数のプロセッサ間での共通ルールに従ってソースプログラム２００を変換することで、切り替え可能プログラムＢを生成する。生成された切り替え可能プログラムＢは、プロセッサＢ用機械語プログラム２１１として、プロセッサＢ用プログラムメモリ３１に格納される。
【００９３】
また、プロセッサＢ用コンパイラ１０１は、切り替え可能プログラム生成指示部１１０から切り替え可能プログラムの生成指示を受けなかった場合、プロセッサＢ１２１の独自のルールに従ってソースプログラム２００を変換することで、プロセッサＢ１２１に対応する専用機械語プログラムＢを生成する。生成された専用機械語プログラムＢは、プロセッサＢ用機械語プログラム２１１として、プロセッサＢ用プログラムメモリ３１に格納される。
【００９４】
切り替え可能プログラム生成指示部１１０は、指示部の一例であって、プロセッサＡ用コンパイラ１００及びプロセッサＢ用コンパイラ１０１に、切り替え可能プログラムの生成を指示する。具体的には、切り替え可能プログラム生成指示部１１０は、ソースプログラム２００に応じて、切り替え可能プログラムの生成を指示するか否かを判定する。
【００９５】
例えば、ソースプログラム２００が特定のプロセッサでのみ実行可能なプログラムではない場合に、切り替え可能プログラム生成指示部１１０は、切り替え可能プログラムの生成を指示する。すなわち、ソースプログラム２００がどのプロセッサでも実行可能なプログラムである場合に、切り替え可能プログラム生成指示部１１０は、切り替え可能プログラムの生成を指示する。
【００９６】
なお、プログラム生成装置２０は、切り替え可能プログラム生成指示部１１０を備えることで、選択的に切り替え可能プログラムを生成することができる。例えば、ソースプログラム２００が特定のプロセッサのみでしか実行できない場合などは、切り替え可能プログラムを生成する必要がない。このような場合に、切り替え可能プログラムの生成を指示しないことで、プログラム生成に係る処理量を削減することができる。
【００９７】
なお、プログラム生成装置２０の詳細な構成については、図２を用いて後で説明する。
【００９８】
プロセッサＡ用プログラムメモリ３０は、プロセッサＡ用コンパイラ１００によって生成されたプロセッサＡ用機械語プログラム２１０を記憶するためのメモリである。具体的には、プロセッサＡ用プログラムメモリ３０には、切り替え可能プログラムＡ又は専用機械語プログラムＡが格納される。また、プロセッサＡ用プログラムメモリ３０は、プロセッサＡ用切り替えプログラム２２０（以下、システムコール）を記憶している。
【００９９】
プロセッサＢ用プログラムメモリ３１は、プロセッサＢ用コンパイラ１０１によって生成されたプロセッサＢ用機械語プログラム２１１を記憶するためのメモリである。具体的には、プロセッサＢ用プログラムメモリ３１には、切り替え可能プログラムＢ又は専用機械語プログラムＢが格納される。また、プロセッサＢ用プログラムメモリ３１は、プロセッサＢ用切り替えプログラム２２１（以下、システムコール）を記憶している。
【０１００】
プロセッサＡ用切り替えプログラム２２０及びプロセッサＢ用切り替えプログラム２２１は、本発明に係る切り替えプログラムの一例であり、ＯＳ（Ｏｐｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ）によって実行される。切り替えプログラムは、第１プロセッサが実行中の、当該第１プロセッサに対応する切り替え可能プログラムを切り替え点で停止させ、かつ、第２プロセッサに対応する切り替え可能プログラムを当該切り替え点から継続して第２プロセッサに実行させるためのプログラムである。
【０１０１】
なお、第１プロセッサ及び第２プロセッサはそれぞれ、プロセッサ装置４０が備える複数のプロセッサの１つである。第１プロセッサは、切り替え元のプロセッサであり、第２プロセッサは、第１プロセッサとは異なるプロセッサであって、切り替え先のプロセッサである。
【０１０２】
具体的には、切り替えプログラムは、プロセッサ切り替え要求の検出と、切り替え点における第１プロセッサが実行中の処理の中断、及び、第２プロセッサでの切り替え点からの処理の再開とを各プロセッサに行わせるためのプログラムである。例えば、プロセッサＡ１２０からプロセッサＢ１２１に切り替える場合、プロセッサＡ用切り替えプログラム２２０がＯＳによって実行され、プロセッサＢ１２１からプロセッサＡ１２０に切り替える場合、プロセッサＢ用切り替えプログラム２２１がＯＳによって実行される。
【０１０３】
プロセッサ装置４０は、互いに異なる命令セットを有し、メモリを共有する複数のプロセッサを備え、同一のソースプログラムから生成された複数の機械語プログラムの少なくとも１つを、複数のプロセッサのうち対応するプロセッサで実行する。図１に示すように、本実施の形態に係るプロセッサ装置４０は、プロセッサＡ１２０と、プロセッサＢ１２１と、システムコントローラ１３０とを備える。
【０１０４】
プロセッサＡ１２０は、プロセッサ装置４０が備える複数のプロセッサの１つであり、プロセッサＢ１２１が有する命令セットとは異なる命令セットを有する。また、プロセッサＡ１２０は、プロセッサＢ１２１との間でデータメモリ５０を共有している。また、プロセッサＡ１２０は、少なくとも１つのレジスタを有し、当該レジスタ及びデータメモリ５０を利用して、プロセッサＡ用プログラムメモリ３０に記憶されているプロセッサＡ用機械語プログラム２１０を実行する。
【０１０５】
プロセッサＢ１２１は、プロセッサ装置４０が備える複数のプロセッサの１つであり、プロセッサＡ１２０が有する命令セットとは異なる命令セットを有する。また、プロセッサＢ１２１は、プロセッサＡ１２０との間でデータメモリ５０を共有している。また、プロセッサＢ１２１は、少なくとも１つのレジスタを有し、当該レジスタ及びデータメモリ５０を利用して、プロセッサＢ用プログラムメモリ３１に記憶されているプロセッサＢ用機械語プログラム２１１を実行する。
【０１０６】
システムコントローラ１３０は、プロセッサ装置４０が備える複数のプロセッサを制御する。図１に示すように、システムコントローラ１３０は、プロセッサ切り替え制御部１３１を備える。
【０１０７】
プロセッサ切り替え制御部１３１は、複数のプロセッサ間の切り替えを要求する。すなわち、プロセッサ切り替え制御部１３１は、プロセッサ切り替え時の全体シーケンスを制御する。例えば、プロセッサ切り替え制御部１３１は、マルチプロセッサシステム１０の状態の変化を検出し、プロセッサの切り替えを行うべきか否かを判定する。
【０１０８】
具体的には、プロセッサ切り替え制御部１３１は、省電力化などの観点からプロセッサの切り替えの要否を判定し、切り替えが必要であると判定した場合、プロセッサの切り替えをプロセッサ装置４０に要求する。例えば、プロセッサ切り替え制御部１３１は、プロセッサを切り替えることで電力効率が高まる場合に、プロセッサの切り替えが必要であると判定する。あるいは、プロセッサ切り替え制御部１３１は、現在プログラムを実行中のプロセッサに優先的に他のプログラムを実行させる必要が発生した場合に、プロセッサの切り替えが必要であると判定してもよい。
【０１０９】
データメモリ５０は、プロセッサ装置４０が備える複数のプロセッサによって共有されるメモリである。例えば、図１に示すように、データメモリ５０は、作業領域１４０と、入力データ領域１４１と、出力データ領域１４２とを含んでいる。
【０１１０】
作業領域１４０は、後述するように、スタック領域と、広域データ領域とを含んでいる。スタック領域は、後入れ先出し（ＬＩＦＯ：Ｌａｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）方式でデータを保持するメモリ領域である。広域データ領域は、プログラムを実行中に、サブルーチンを跨いで参照されるデータ、すなわち、ソースプログラム中で広域定義されるデータ（広域データ）を保持するメモリ領域である。
【０１１１】
入力データ領域１４１は、入力データを保持するメモリ領域である。出力データ領域１４２は、出力データを保持するメモリ領域である。
【０１１２】
なお、本実施の形態では、プロセッサ装置４０は、２つのプロセッサ（プロセッサＡ１２０及びプロセッサＢ１２１）を備えるが、３つ以上のプロセッサを備えていてもよい。また、プロセッサ装置４０は、命令セットが共通のプロセッサを備えていてもよい。言い換えると、プロセッサＡ１２０及びプロセッサＢ１２１は、命令セットが同種であり、同じ機械語プログラムを実行可能であってもよい。
【０１１３】
続いて、本発明の実施の形態に係るプログラム生成装置２０の詳細な構成について説明する。図２は、本発明の実施の形態に係るプログラム生成装置２０（コンパイラ）の詳細な構成の一例を示すブロック図である。
【０１１４】
図２に示すように、プロセッサＡ用コンパイラ１００は、切り替え可能プログラム生成有効化部３００と、切り替え点決定部３０１と、切り替え可能プログラム生成部３０２と、切り替え判断処理挿入部３０３とを備える。プロセッサＢ用コンパイラ１０１は、切り替え可能プログラム生成有効化部３１０と、切り替え点決定部３１１と、切り替え可能プログラム生成部３１２と、切り替え判断処理挿入部３１３とを備える。
【０１１５】
切り替え可能プログラム生成有効化部３００は、切り替え可能プログラム生成指示部１１０から切り替え可能プログラムの生成指示を受けた場合、プロセッサＡ用コンパイラ１００の機械語プログラムの生成モードを制御する。機械語プログラムの生成モードには、切り替え可能プログラムＡを生成するモード、及び、専用機械語プログラムＡを生成するモードが含まれる。
【０１１６】
具体的には、切り替え可能プログラム生成有効化部３００は、切り替え可能プログラムの生成指示を受けた場合、切り替え可能プログラムＡを生成するモードを選択する。また、切り替え可能プログラム生成有効化部３００は、切り替え可能プログラムの生成を受けていない場合、専用機械語プログラムＡを生成するモードを選択する。選択結果は、切り替え点決定部３０１、切り替え可能プログラム生成部３０２及び切り替え判断処理挿入部３０３に出力される。
【０１１７】
切り替え点決定部３０１は、切り替え可能プログラムＡを生成するモードが選択された場合は、ソースプログラム２００中の所定の位置をプロセッサ切り替え点（以下、単に切り替え点と記載する場合もある）として決定する。すなわち、切り替え点決定部３０１は、切り替え可能プログラム生成指示部１１０が切り替え可能プログラムの生成を指示した場合に、切り替え点を決定する。
【０１１８】
また、切り替え点決定部３０１は、切り替え可能プログラム生成指示部１１０が切り替え可能プログラムの生成を指示しない場合、切り替え点を決定しない。つまり、この場合、切り替え点決定部３０１は、切り替え可能プログラム生成有効化部３００によって無効化される。言い換えると、切り替え点決定部３０１は、切り替え可能プログラムの生成が指示された場合のみに、切り替え点を決定する。
【０１１９】
例えば、切り替え点決定部３０１は、ソースプログラムの基本ブロックの境界の少なくとも一部を、切り替え点として決定する。基本ブロックは、例えば、ソースプログラムのサブルーチンである。この場合、切り替え点決定部３０１は、サブルーチンの境界の少なくとも一部を、切り替え点として決定する。具体的には、切り替え点決定部３０１は、サブルーチンの境界であるサブルーチンの呼び出し元の呼び出し部分を、切り替え点として決定する。あるいは、切り替え点決定部３０１は、サブルーチンの境界であるサブルーチンの呼び出し先の先頭及び終端の少なくとも一方を、切り替え点として決定してもよい。
【０１２０】
切り替え可能プログラム生成部３０２は、切り替え点においてデータメモリ５０のデータ構造が複数のプロセッサ間で一致するように、ソースプログラム２００から、プロセッサＡ１２０に対応する機械語プログラムである切り替え可能プログラムＡを生成する。すなわち、切り替え可能プログラム生成部３０２は、切り替え点における自プロセッサが対応する機械語プログラムを実行した場合と、他のプロセッサが対応する機械語プログラムを実行した場合とのデータメモリ状態の一貫性が保たれるように、プログラム生成を制御する。
【０１２１】
例えば、切り替え可能プログラム生成部３０２は、データメモリ５０のスタック領域のデータ構造が複数のプロセッサ間で一致するように、切り替え可能プログラムＡを生成する。具体的には、切り替え可能プログラム生成部３０２は、データメモリ５０のスタック領域に格納されるデータのデータサイズ及び配置が複数のプロセッサ間で一致するように、切り替え可能プログラムＡを生成する。このとき、切り替え可能プログラム生成部３０２は、サブルーチンが利用する引数及び作業データを、プロセッサが有するレジスタではなく、データメモリ５０のスタック領域に格納するように、切り替え可能プログラムＡを生成する。
【０１２２】
さらに、切り替え可能プログラム生成部３０２は、データメモリ５０の広域データ領域のデータ構造が複数のプロセッサ間で一致するように、切り替え可能プログラムＡを生成する。また、切り替え可能プログラム生成部３０２は、引数、作業データ及び広域データなどを格納するためにデータメモリ５０内に確保する領域のデータサイズ及び配置が複数のプロセッサ間で一致するように、切り替え可能プログラムＡを生成する。
【０１２３】
具体的には、切り替え可能プログラム生成部３０２は、複数のプロセッサ間での一致を実現するために、複数のプロセッサ間での共通ルールに従って、切り替え可能プログラムＡを生成する。共通ルールは、例えば、複数のプロセッサそれぞれの制約を最大公約数的に満たすルールである。より具体的な例については、図３Ａ〜図３Ｃを用いて後で説明する。
【０１２４】
なお、切り替え可能プログラム生成部３０２は、切り替え可能プログラム生成指示部１１０が切り替え可能プログラムの生成を指示しない場合、切り替え可能プログラムを生成しない。つまり、この場合、切り替え可能プログラム生成部３０２は、ソースプログラム２００から、複数のプロセッサのうちプロセッサＡ１２０のみで実行可能なプログラム（専用機械語プログラムＡ）を生成する。言い換えると、切り替え点決定部３０１は、切り替え可能プログラムの生成が指示された場合のみに、切り替え可能プログラムを生成する。
【０１２５】
切り替え判断処理挿入部３０３は、プロセッサＡ用切り替えプログラムを、切り替え可能プログラムＡに挿入する。具体的には、切り替え判断処理挿入部３０３は、切り替え処理を行うシステムコールであるプロセッサＡ用切り替えプログラム２２０を呼び出すプログラムを、切り替え可能プログラムＡに挿入する。
【０１２６】
また、切り替え判断処理挿入部３０３は、切り替え可能プログラム生成指示部１１０が切り替え可能プログラムの生成を指示しない場合、切り替えプログラムを挿入しない。つまり、この場合、切り替え判断処理挿入部３０３は、切り替え可能プログラム生成有効化部３００によって無効化される。言い換えると、切り替え判断処理挿入部３０３は、切り替え可能プログラムの生成が指示された場合のみに、切り替えプログラムを挿入する。
【０１２７】
なお、プロセッサＢ用コンパイラ１０１が備える処理部は、プロセッサＡ用コンパイラ１００が備える処理部と同じである。すなわち、切り替え可能プログラム生成有効化部３１０と、切り替え点決定部３１１と、切り替え可能プログラム生成部３１２と、切り替え判断処理挿入部３１３とはそれぞれ、上述した切り替え可能プログラム生成有効化部３００と、切り替え点決定部３０１と、切り替え可能プログラム生成部３０２と、切り替え判断処理挿入部３０３とに相当する。したがって、ここでは説明を省略する。
【０１２８】
以下、本実施の形態では、プロセッサ切り替え点の一例として、サブルーチンの境界を用いる例を説明する。
【０１２９】
例えば、本実施の形態では、サブルーチンの呼び出し時、及び、サブルーチンから戻る点をプロセッサ切り替え点とする。これは、サブルーチンのスタック状態がソースプログラム上明確であり、複数のプロセッサ間での一致を取りやすいという効果を奏するためである。
【０１３０】
図３Ａ〜図３Ｃは、本発明の実施の形態に係るスタック領域、広域データ領域及び出力データ領域のデータ構造と、レジスタ構成との一例を示す図である。
【０１３１】
具体的には、図３Ａは、所定のサブルーチンに対応するプロセッサＡ専用機械語プログラムを実行する際にプロセッサＡ１２０が使用するメモリ資源の一例を示す図である。図３Ｂは、所定のサブルーチンに対応するプロセッサＢ専用機械語プログラムを実行する際にプロセッサＢ１２１が使用するメモリ資源の一例を示す図である。図３Ｃは、所定のサブルーチンに対応する切り替え可能プログラムを実行する際に各プロセッサが使用するメモリ資源の一例を示す図である。
【０１３２】
図３Ａ〜図３Ｃに示すように、メモリ資源は、スタック領域４００、４０１又は４０２と、レジスタ４１０、４１１又は４１２と、広域データ領域４２０、４２１又は４２２と、出力データ領域４３０、４３１又は４３２とを含んでいる。スタック領域４００、４０１又は４０２と、広域データ領域４２０、４２１又は４２２と、出力データ領域４３０、４３１又は４３２とは、データメモリ５０のメモリ領域である。
【０１３３】
レジスタ４１０は、プロセッサＡ１２０が備えるレジスタのうち、プロセッサＡ１２０が、上記の所定のサブルーチンをプロセッサＡ専用機械語プログラムに従って実行する際に利用するレジスタである。レジスタ４１１は、プロセッサＢ１２１が備えるレジスタのうち、プロセッサＢ１２１が、上記の所定のサブルーチンをプロセッサＢ専用機械語プログラムに従って実行する際に利用するレジスタである。レジスタ４１２は、プロセッサＡ１２０又はプロセッサＢ１２１が、上記の所定のサブルーチンを切り替え可能プログラムに従って実行する際に利用するレジスタである。
【０１３４】
一般にコンパイラは、対応するプロセッサのハードウェアレジスタの本数、及び、メモリアクセスの制限の違いにより、スタック及びレジスタの使用方法が異なる機械語プログラムを生成する。
【０１３５】
例えば、本サブルーチンの引数ａｒｇ１が、ソースプログラムでは１バイトのデータとして定義されている場合を想定する。このとき、図３Ａに示す例では、プロセッサＡ１２０のデータアクセスが２バイト単位でないと行えないという制限があることから、スタック領域４００ではａｒｇ１用に２バイトの領域（＃００００と＃０００１）を確保している。これに対し、プロセッサＢ１２１は、１バイトアクセスが可能であるため、メモリの利用効率の観点から、スタック領域４００ではａｒｇ１用に１バイトの領域（＃００００）のみを確保する。
【０１３６】
ここで、仮にこのサブルーチンの最初若しくは途中で処理が中断されたとすると、そのスタックメモリをそのまま他のプロセッサが利用しても、データ配置が異なるために、正常に処理を継続することができない。例えば、プロセッサＢ１２１からプロセッサＡ１２０に切り替えた場合、プロセッサＡ１２０では、スタック領域４０１の“戻りアドレス”へのアクセスができなくなり、正常に動作を継続できないという課題がある。
【０１３７】
これに対して、図３Ｃに示すように、本発明の実施の形態に係る切り替え可能プログラムでは、プロセッサＡ１２０が２バイト単位でしかアクセスできないという条件に基づいて、スタック領域４０２に引数ａｒｇ１を２バイトの領域（＃００００と＃０００１）で確保している。つまり、切り替え可能プログラム生成部３０２及び３１２は、各プロセッサからのアクセス単位のデータサイズの最小公倍数を満たす領域を１つのデータに対して確保するように、スタック領域４０２のデータ構造を決定する。これにより、１バイト単位でアクセス可能なプロセッサＢ１２１はもちろん、プロセッサＡ１２０もスタック領域４０２のデータの読み出し及び書き込みを正しく行うことができる。
【０１３８】
すなわち、切り替え可能プログラム生成部３０２及び３１２は、プロセッサＡ１２０及びプロセッサＢ１２１のデータメモリ５０へのアクセス条件の最大公約数的な条件を満たすように、スタック領域４０２のデータ構造を決定する。そして、切り替え可能プログラム生成部３０２及び３１２は、切り替え点において、決定したデータ構造が構成されるように、各プロセッサに対応する切り替え可能プログラムを生成する。
【０１３９】
つまり、切り替え可能プログラム生成部３０２は、スタック領域の状態が一致しない問題に対し、複数のプロセッサ間で共通のスタック構造のルールを設定する。そして、プロセッサ切り替え可能プログラムを生成する場合は、共通のルールに従って切り替え可能プログラムを生成することで、プロセッサ間のスタック領域の内容の一貫性を保証することができる。例えば、入力引数ａｒｇ１のような１バイトデータでは、プロセッサＡ１２０が１バイト単位でのアクセスができないことを配慮して、必ず２バイトのメモリ領域を確保する。
【０１４０】
また、上記の所定のサブルーチンを実行中の作業データｉ及びｊを保持するための領域は、図３Ａに示すように、プロセッサＡ専用機械語プログラムでは、レジスタ４１０（ＲＥＧ０とＲＥＧ１）である。一方で、プロセッサＢ専用機械語プログラムでは、図３Ｂに示すように、スタック領域４０１（＃０００３〜＃０００６）に、作業データｉ及びｊが保持される。
【０１４１】
これは、プロセッサＡ１２０が備えるレジスタ本数（図３Ａの例では、４本）と、プロセッサＢ１２１が備えるレジスタ本数（図３Ｂの例では、３本）との違いに起因する違いである。つまり、プロセッサＡ１２０がレジスタ本数に余裕があり、性能向上のため、作業データｉ及びｊ専用にレジスタを確保していることなどに起因する。この結果、プロセッサＡ１２０で実行されているサブルーチンの途中でプロセッサＢ１２１に切り替えても、作業データｉ及びｊは、スタック領域４０１には保持されておらず、プロセッサＢ１２１は、処理を継続することはできない。
【０１４２】
これに対して、図３Ｃに示すように、本発明の実施の形態に係る切り替え可能プログラムでは、レジスタ４１２は全て作業領域として利用される。具体的には、切り替え時の状態の継承性、及び、プロセッサ毎のレジスタの本数の違いを考慮し、入力引数ａｒｇ１及びａｒｇ２は、全てハードウェアレジスタではなくスタック領域４０２（＃００００〜＃０００３）に格納する。また、作業データｉ及びｊについても同様に、スタック領域４０２（＃０００６〜＃０００９）に格納する。さらに、下位のサブルーチンにアドレスを引き継ぐ必要のあるサブルーチン内のデータは、必ずスタック領域４０２上の同じ配置に領域を確保する。
【０１４３】
なお、ここでは、複数のプロセッサのレジスタ構成にかかわらず、処理できる量を確保するため、ソースプログラム２００で定義された全てのデータを格納できるスタック領域４０２を確保する。この場合、作業領域のスタックは、必ずしも同じ用途で使用する必要はなく、確保する大きさのみ一致すればよい。
【０１４４】
また、広域データ領域４２２についてもスタック領域４０２と同様に、プロセッサに依存しないよう共通のルールで順番及び配置を決定することで、そのまま他のプロセッサに引き継ぐことができる。例えば、広域データＰ及びＲは、プログラムソースコード上では１バイトで定義している場合を想定する。この場合、図３Ａに示すように、プロセッサＡ専用機械語プログラムでは、プロセッサＡが１バイト単位でのアクセスができないために２バイトの領域（＃０１００と＃０１０１など）を確保し、プロセッサＢでは１バイトの領域（＃０１００など）を確保する。
【０１４５】
これに対して、プロセッサ切り替え可能プログラムでは、図３Ｃに示すように、全て２バイトに統一される。すなわち、広域データＰ、Ｑ及びＲは、データメモリ５０の広域データ領域に２バイトの領域がそれぞれ確保される。
【０１４６】
なお、出力データ領域についても同様である。また、サブルーチン内で使用するレジスタの使用法については、サブルーチンの開始及び終端でのデータメモリ５０の一貫性に影響を与えないため、個々のプロセッサの特性に合わせてそれぞれに異なった最適化を行うことが可能である。
【０１４７】
以上により、プロセッサ切り替え時に必要なサブルーチンの開始、終了状態が全てデータメモリ５０によって引き継ぐことが可能である。さらに、プロセッサ毎のレジスタ本数の違いに依存しなくなるので、プロセッサ間での切り替えが可能となる。
【０１４８】
具体的には、スタックのデータ構造、すなわち、スタックに格納されるデータのサイズ及び配置を切り替え点で一致させているので、切り替え先のプロセッサでは、スタックをそのまま利用することができる。また、広域データのデータ構造を切り替え点で一致させているので、切り替え先のプロセッサでは、広域データをそのまま利用することができる。また、レジスタに格納された値が切り替え点を跨いで保証されない場合であっても、レジスタに格納された値をメモリに退避させているので、プロセッサの切り替えを行うことができる。
【０１４９】
図４Ａ及び図４Ｂは、本発明の実施の形態に係るプログラムアドレスリストの一例を示す図である。図４Ａは、プロセッサＡ１２０が参照するプログラムアドレスリストを示し、図４Ｂは、プロセッサＢ１２１が参照するプログラムアドレスリストを示している。
【０１５０】
切り替え可能プログラム生成部３０２及び３１２は、ソースプログラム２００中の同一の分岐を示す分岐先アドレスであって、複数のプロセッサ毎の切り替え可能プログラムにおける分岐先アドレスのそれぞれに共通の識別子を付与し、当該識別子と分岐先アドレスとを対応付けたプログラムアドレスリストを生成する。生成したプログラムアドレスリストは、例えば、データメモリ５０、又は、各プロセッサが保持する内部メモリなどに記憶される。
【０１５１】
具体的には、図４Ａ及び図４Ｂに示すように、それぞれのプロセッサの機械語プログラムで使用される分岐先のプログラムアドレスが、プログラムアドレスリストとして、管理されている。分岐先のプログラムアドレスは、具体的には、サブルーチンの分岐先、及び、サブルーチンからの戻り点（復帰点）などを示すアドレスである。
【０１５２】
前述の通り、異なる命令セットを有するプロセッサのコンパイラ間では、プログラムアドレスを一致させるのは不可能である。このため、本実施の形態では、分岐先アドレスをプログラム全体でリストとして管理し、処理中にプログラムアドレスをデータメモリ５０に格納する場合は、アドレスそのものでなく、プロセッサ共通の分岐先アドレス識別子を格納する。そして、分岐時には、各プロセッサは、データメモリ５０から分岐先アドレス識別子を読み出し、読み出した分岐先アドレス識別子をもとに、対応するプロセッサのプログラムアドレスリストを参照することでプログラムアドレスを引き出す。
【０１５３】
図４Ａ及び図４Ｂに示すプログラムリストには、複数の識別子のそれぞれに対応するプログラムアドレスが格納されており、それぞれのプロセッサの機械語プログラムに対応する分岐先プログラムアドレスが格納されている。プロセッサ間で対応する分岐先の識別子を一致させることで、プログラムアドレスが格納されるデータメモリもそのまま他のプロセッサで使用できる。
【０１５４】
ここで、プログラムアドレスリストのリスト構造、及び、プログラムアドレスリストからのプログラムアドレス導出方法の一例について説明する。
【０１５５】
プログラムアドレスリストは、例えば、プログラムアドレスのみがデータ配列としてデータメモリ５０に格納される。識別子は、０から始まる番号で表現され、データ配列の何番目に対応するプログラムアドレスがあるかを表す。例えば、プログラムアドレス１件あたりのデータサイズがｗ（ｓ）バイト（ｓはプロセッサ番号）であり、データ配列の先頭アドレスをＧ（ｓ）とすると、識別子がＮの分岐先に対応するプログラムアドレスは、データメモリのＧ（ｓ）＋（Ｎ×ｗ（ｓ））で表されるアドレスに格納されていることになる。各プロセッサは、このアドレスを読み出すことで、所望のプログラムアドレスを得ることができる。
【０１５６】
本実施の形態では、切り替え点決定部３０１及び３１１がサブルーチンの境界を切り替え点として決定するので、分岐先アドレスは切り替え点を示すアドレスに相当する。つまり、同一の切り替え点を示すプログラムアドレスには、同一の識別子が付される。
【０１５７】
したがって、ある切り替え点でプロセッサＡ１２０からプロセッサＢ１２１に切り替える場合、切り替え先のプロセッサＢ１２１は、図４Ｂに示すプロセッサＢ１２１のプログラムアドレスリストを参照することで、切り替え元のプロセッサＡ１２０が実行していたプログラムの切り替え点（分岐先アドレス）を示す識別子と同じ識別子に対応するプログラムアドレスを、データメモリ５０から取得する。
【０１５８】
このように、複数のプロセッサそれぞれの分岐先アドレスを共通の識別子に対応付けて管理するので、切り替え先のプロセッサは、切り替え元のプロセッサが次に実行する予定であった処理の分岐先アドレスの識別子を取得することで、自プロセッサに対応する分岐先アドレスを取得することができる。したがって、切り替え元のプロセッサが実行していたタスクを、切り替え先のプロセッサが継続して実行することができる。
【０１５９】
ここで、本発明の実施の形態に係るプログラム生成装置２０が生成する切り替え可能プログラムについて説明する。言い換えると、切り替え可能プログラムはプロセッサ装置４０によって実行されるので、ここでは、本発明の実施の形態に係るプロセッサ装置４０の動作について説明する。
【０１６０】
図５Ａ〜図５Ｃは、本発明の実施の形態に係るサブルーチンの呼び出し元のプログラムの一例を示す図である。最初に、図５Ａを用いて、サブルーチンの呼び出し元の通常のプログラムについて、すなわち、サブルーチンの呼び出し処理（サブルーチンコール）について説明する。
【０１６１】
プロセッサは、通常のプログラムを実行することで、まず、サブルーチンの呼び出し元では、入力となる引数をスタックに格納し（Ｓ１００）、さらに、サブルーチン終了後の戻りアドレス（サブルーチンからの復帰先）として呼び出し部分の直後のプログラムアドレスを、戻りアドレスとして格納する（Ｓ１１０）。そして、プロセッサは、サブルーチンの開始アドレスに分岐して、サブルーチンを開始する（Ｓ１２０）。
【０１６２】
これに対して、本実施の形態に係る切り替え可能プログラムのサブルーチンコールでは、プロセッサが切り替えられることを考慮し、アドレスそのものでなく、図４Ａ及び図４Ｂで示される識別子を格納する。
【０１６３】
具体的には、図５Ｂに示すように、サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納する（Ｓ１００）。そして、プロセッサは、図５Ａとは異なり、サブルーチンからの復帰先として、サブルーチン呼び出し部分の直後のプログラムアドレスそのものでなく、図４Ａ及び図４Ｂで説明したプログラムアドレスリストの識別子を、戻り点ＩＤとして格納する（Ｓ１１１）。そして、プロセッサは、サブルーチンの開始アドレスに分岐して、サブルーチンを開始する（Ｓ１２０）。
【０１６４】
なお、図５Ｂは、サブルーチン呼び出しがプロセッサ切り替え点ではない場合について示している。本実施の形態では、サブルーチン呼び出しをプロセッサ切り替え点として決定することができる。図５Ｃは、サブルーチン呼び出しがプロセッサ切り替え点である場合の切り替え可能プログラムの一例を示している。
【０１６５】
具体的には、切り替え可能プログラム中で、サブルーチン呼び出しをプロセッサ切り替え点として決定する場合では、サブルーチン呼び出しは、システムコール（Ｓ２００）を介して行われる。なお、システムコール（Ｓ２００）は、切り替えプログラムの一例であり、具体的には、図１に示すプロセッサＡ用切り替えプログラム２２０又はプロセッサＢ用切り替えプログラム２２１などである。
【０１６６】
サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納し（Ｓ１００）、戻り点ＩＤを格納する（Ｓ１１１）。その後、プロセッサは、分岐先サブルーチンのアドレス識別子を入力として、システムコール（Ｓ２００）を発生させる（Ｓ１１２）。
【０１６７】
以下は、システムコール（Ｓ２００）の処理である。
【０１６８】
まず、プロセッサは、システムコントローラ１３０（具体的には、プロセッサ切り替え制御部１３１）からのプロセッサ切り替え要求が発行されているかどうかを確認する（Ｓ２０１）。プロセッサ切り替え要求が発行されていれば（Ｓ２０２でＹｅｓ）、プロセッサは、後述する図７Ａのプロセッサ切り替えシーケンスを起動する（Ｓ２０５）。
【０１６９】
プロセッサ切り替え要求が発行されていなければ（Ｓ２０２でＮｏ）、プロセッサは、サブルーチンのアドレス識別子からサブルーチンの分岐先プログラムアドレス（サブルーチンアドレス）を導出する（Ｓ２０３）。そして、プロセッサは、サブルーチンアドレスに分岐して、サブルーチンを開始する（Ｓ２０４）。
【０１７０】
以上のように、本発明の実施の形態に係る切り替え可能プログラムは、サブルーチンの呼び出し元の呼び出し部分を切り替え点として決定された場合は、当該切り替え点においてシステムコールを発生させるための処理（Ｓ１１２）を含んでいる。これにより、システムコントローラ１３０からプロセッサの切り替えを要求された場合に、プロセッサ切り替え処理を実行することができる。
【０１７１】
図６Ａ〜図６Ｃは、本発明の実施の形態に係るサブルーチンからの復帰処理のプログラムの一例を示す図である。最初に、図６Ａを用いて、サブルーチンからの復帰処理の通常のプログラムについて、すなわち、サブルーチンからの通常の復帰処理について説明する。
【０１７２】
プロセッサは、通常のプログラムのサブルーチンの呼び出し先（すなわち、実行中のサブルーチンの終端）では、まず、サブルーチン戻りアドレスをスタックから取得する（Ｓ３００）。そして、プロセッサは、当該サブルーチンが進めたスタックポインタを戻した後（Ｓ３１０）、サブルーチン戻りアドレスに復帰する（Ｓ３２０）。
【０１７３】
これに対して、本発明の実施の形態に係る切り替え可能プログラムでの通常のサブルーチン復帰処理では、図６Ｂに示すように、まず、プロセッサは、スタックから戻りアドレスでなく、戻りアドレスの識別子（戻り点ＩＤ）を取得する（Ｓ３０１）。そして、プロセッサは、当該サブルーチンが進めたスタックポインタを戻す（Ｓ３１０）。
【０１７４】
その後、プロセッサは、図４Ａ及び図４Ｂに示すプログラムアドレスリストを参照することで、戻り点ＩＤをサブルーチン戻りアドレスに変換する（Ｓ３１１）。そして、プロセッサは、サブルーチン戻りアドレスに復帰する（Ｓ３２０）。
【０１７５】
なお、図６Ｂは、サブルーチンからの復帰がプロセッサ切り替え点ではない場合について示している。本実施の形態では、サブルーチンからの復帰をプロセッサ切り替え点として決定することができる。図６Ｃは、サブルーチンからの復帰がプロセッサ切り替え点である場合の切り替え可能プログラムの一例を示している。
【０１７６】
具体的には、切り替え可能プログラム中で、サブルーチンからの復帰をプロセッサ切り替え点として決定する場合では、まず、プロセッサは、スタックから戻り点ＩＤを取得する（Ｓ３０１）。そして、プロセッサは、サブルーチンが進めたスタックポインタを戻した後（Ｓ３１０）、戻り点ＩＤを入力として、システムコール（Ｓ４００）を発行する（Ｓ３１２）。なお、システムコール（Ｓ４００）は、切り替えプログラムの一例であり、具体的には、図１に示すプロセッサＡ用切り替えプログラム２２０又はプロセッサＢ用切り替えプログラム２２１などである。
【０１７７】
以下は、システムコール（Ｓ４００）の処理である。
【０１７８】
まず、プロセッサは、システムコントローラ１３０（具体的には、プロセッサ切り替え制御部１３１）からのプロセッサ切り替え要求が発行されているかどうかを確認する（Ｓ４０１）。プロセッサ切り替え要求が発行されていれば（Ｓ４０２でＹｅｓ）、プロセッサは、後述する図７Ａのプロセッサ切り替えシーケンスを起動する（Ｓ４０５）。
【０１７９】
プロセッサ切り替え要求が発行されていなければ（Ｓ４０２でＮｏ）、プロセッサは、戻り点ＩＤからプログラムアドレス（サブルーチン戻りアドレス）を導出し（Ｓ４０３）、サブルーチン戻りアドレスに復帰する（Ｓ４０４）。
【０１８０】
以上のように、本発明の実施の形態に係る切り替え可能プログラムは、サブルーチンの呼び出し先の終端を切り替え点として決定された場合は、当該切り替え点においてシステムコールを発生させるための処理（Ｓ３１２）を含んでいる。これにより、システムコントローラ１３０からプロセッサの切り替えを要求された場合に、プロセッサ切り替え処理を実行することができる。
【０１８１】
上記のように、本実施の形態に係るマルチプロセッサシステム１０では、システムコントローラ１３０からの要求があれば、プロセッサ切り替え処理が行われる。そして、システムコントローラ１３０からの要求がなければ、サブルーチンの呼び出し又はサブルーチンからの復帰が実行される。
【０１８２】
図７Ａは、システムコールにおける切り替え元のプロセッサの動作の一例を示すフローチャートである。また、図７Ｂは、システムコールにおける切り替え先のプロセッサの動作の一例を示すフローチャートである。
【０１８３】
切り替え元のプロセッサは、まず、切り替え点でのスタックポインタをシステムコントローラ１３０に通知する（Ｓ５０１）。さらに、切り替え元のプロセッサは、分岐先プログラムアドレスの識別子（戻り点ＩＤ）をシステムコントローラ１３０に通知する（Ｓ５０２）。
【０１８４】
このとき、戻り点ＩＤは、図５Ｂ又は図５ＣのステップＳ１１１において、スタックに格納された識別子であり、スタックから読み出される。あるいは、戻り点ＩＤは、図６Ｂ又は図６ＣのＳ３０１において、スタックから読み出された識別子である。なお、スタックポインタの通知（Ｓ５０１）と戻り点ＩＤの通知（Ｓ５０２）とは、いずれが先に実行されてもよい。
【０１８５】
そして、切り替え元のプロセッサは、処理停止完了をシステムコントローラ１３０に通知する（Ｓ５０３）。その後、切り替え元のプロセッサは、再度、切り替え元のプロセッサで処理が実行されることを想定し、処理再開待ち状態に移行する（Ｓ５０４）。この際、低電力の観点ではプロセッサを停止させるか休止状態にするのが望ましい。また、切り替え元プロセッサがマルチタスクシステムであれば、他のタスクに実行権を譲渡するのが望ましい。
【０１８６】
切り替え先のプロセッサは、まず、処理再開要求を受理する（Ｓ５１１）。そして、切り替え先のプロセッサは、スタックポインタをシステムコントローラ１３０から取得して、自プロセッサに適用する（Ｓ５１２）。さらに、切り替え先のプロセッサは、再開プログラムアドレスの識別子（戻り点ＩＤ）を取得する（Ｓ５１３）。
【０１８７】
次に、切り替え先のプロセッサは、図４Ａ又は図４Ｂに示すようなプログラムアドレスリストを参照することで、取得した識別子からプログラムアドレスを導出する（Ｓ５１４）。そして、切り替え先のプロセッサは、導出したプログラムアドレスへ分岐することで、処理を再開させる（Ｓ５１５）。これにより、切り替え先のプロセッサは、切り替え元のプロセッサが中断した位置に相当する切り替え先のプログラムアドレス、及び、中断時のスタックポインタから再開できる。
【０１８８】
なお、図５Ｃ及び図６Ｃに示すシステムコールは、同等の機能を有するプロセッサ機能を利用することでも実現できる。例えば、プロセッサのサブルーチン呼び出し又はサブルーチン復帰命令で、システムコントローラ１３０からの要求を、プロセッサレジスタ若しくは特定のデータメモリなどから判断してもよい。そして、要求がない場合は通常のサブルーチンコール又はサブルーチン復帰命令を実行し、要求がある場合は処理中断のシステムコールを動作させる。これにより、要求がない通常の場合での処理オーバーヘッドを軽減できる。
【０１８９】
続いて、本発明の実施の形態に係る切り替え可能プログラムの生成方法の一例について説明する。図８Ａ及び図８Ｂは、本発明の実施の形態に係るプログラム生成装置２０の動作の一例を示すフローチャートである。
【０１９０】
まず、切り替え可能プログラム生成有効化部３００及び３１０は、プロセッサ切り替え可能プログラムを生成する指示が出ているかを検知する（Ｓ６０１）。つまり、切り替え可能プログラム生成有効化部３００及び３０１は、切り替え可能プログラム生成指示部１１０から、切り替え可能プログラムの生成を指示されたか否かを判定する。
【０１９１】
プロセッサ切り替え可能プログラムを生成する指示がない場合（Ｓ６０２でＮｏ）、プログラム生成装置２０は、以下のように、通常の機械語プログラム、すなわち、各プロセッサに専用の機械語プログラムの生成を行う。
【０１９２】
なお、切り替え点決定部３０１及び３１１は、通常の機械語プログラムを作成する場合は不要となるため、無効化される。そして、切り替え可能プログラム生成部３０２及び３１２は、通常の機械語プログラムを生成する場合は、切り替え可能にするための配慮を行わず、プロセッサ独自のルールでプログラム生成を行う。
【０１９３】
まず、切り替え可能プログラム生成部３０２及び３１２は、広域データをリストに登録する（Ｓ６５１）。
【０１９４】
次に、切り替え可能プログラム生成部３０２及び３１２は、サブルーチンのスタック構造を、当該プロセッサのハードウェア及び命令セットの構成に最適となるような独自ルールに従って決定する。そして、切り替え可能プログラム生成部３０２及び３１２は、決定したスタック構造に基づいて機械語プログラムを生成するための中間コードを生成する（Ｓ６５２）。ここで、中間コードとは、プログラム及びデータのアドレスが他のサブルーチン、広域データの関係で決定されないシンボルで表現されたプログラムである。
【０１９５】
さらに、切り替え可能プログラム生成部３０２及び３１２は、使用される広域データのリストを追加していく（Ｓ６５３）。以上に示す中間コードの生成（Ｓ６５２）と広域データの追加（Ｓ６５３）とをプロセッサ毎及びサブルーチン毎に繰り返すことで、全てのサブルーチンの中間コードと広域データのリストとを作成する。
【０１９６】
そして、切り替え可能プログラム生成部３０２及び３１２は、作成した広域データのリストを元に、当該プロセッサハードウェア特性に合わせた独自ルールで各広域データのアドレスを決定する（Ｓ６５４）。
【０１９７】
なお、切り替え判断処理挿入部３０３及び３１３は、通常の機械語プログラムを作成する場合は、不要となるため、処理が無効化される。
【０１９８】
最後に、全サブルーチンをリンクする部分について説明する。
【０１９９】
まず、切り替え可能プログラム生成部３０２及び３１２は、個々のサブルーチンのプログラムアドレスを決定する（Ｓ６６１）。そして、切り替え可能プログラム生成部３０２及び３１２は、分岐アドレスと広域データアドレスとを中間コードに適用することで、最終の機械語プログラムを作成する（Ｓ６６２）。
【０２００】
続いて、プロセッサ切り替え可能プログラム生成指示が検出された場合（Ｓ６０２でＹｅｓ）について説明する。
【０２０１】
まず、切り替え点決定部３０１及び３１１は、サブルーチン毎に、当該サブルーチンの境界をサブルーチン切り替えの対象にするかどうかを決定する（Ｓ６１１）。サブルーチンの境界は、例えば、サブルーチンの呼び出し元の呼び出し部分、又は、サブルーチンの呼び出し先の先頭及び終端の少なくとも一方である。
【０２０２】
ここでは、全てのサブルーチンを対象にしてもよく、あるいは、サブルーチンの静的若しくは動的ステップ数又はサブルーチンのネストの深さなどを基準として、サブルーチンの境界を切り替え点として決定するか否かを判定してもよい。具体的な切り替え点の例については、後で説明する。
【０２０３】
次に、切り替え可能プログラム生成部３０２及び３１２は、まず、広域データをリストに登録する（Ｓ６２１）。
【０２０４】
さらに、切り替え可能プログラム生成部３０２及び３１２は、プロセッサ毎に、自サブルーチンのアドレス及びサブルーチン内でサブルーチンを呼び出す部分のアドレスを、シンボルで、図４Ａ及び図４Ｂで示すプログラムアドレスリストに登録する（Ｓ６２２）。さらに、切り替え可能プログラム生成部３０２及び３１２は、図３Ａ〜図３Ｃで説明した通り、複数のプロセッサ間の共通ルールでスタック構造を決定し、中間コードを生成する（Ｓ６２３）。ここでは、後で図１０から図１２で説明するようにスタック上の作業データの一貫性を保証するようにサブルーチン境界でのデータ状態を操作する。また、ここでは、スタックポインタの更新量は自プロセッサでの仮の値として設定する。
【０２０５】
次に、切り替え可能プログラム生成部３０２及び３１２は、一旦全プロセッサ分の当該サブルーチンのスタック使用量のうち最大のものを判定する（Ｓ６２４）。そして、切り替え可能プログラム生成部３０２及び３１２は、当該サブルーチンの全プロセッサのスタック確保量を全プロセッサのスタック使用量の最大値に変更する（Ｓ６２５）。具体的には、切り替え可能プログラム生成部３０２及び３１２は、最大のスタック使用量を全プロセッサに共通の当該サブルーチンのスタック使用量として、ステップＳ６２３で仮設定したスタック更新量を書き換える。
【０２０６】
また、切り替え可能プログラム生成部３０２及び３１２は、サブルーチン戻りアドレスのスタックからの取得処理などの、データメモリ５０から分岐先アドレスを取得する処理を、識別子からの変換処理に置換する（Ｓ６２６）。具体的には、切り替え可能プログラム生成部３０２及び３１２は、図４Ａ及び図４Ｂに示すプログラムアドレスリストを参照することで識別子から分岐先アドレスを取得する方式に、通常のアドレス取得処理を置換する。より具体的には、図６Ａに示すステップＳ３００の処理を、図６Ｂ及び図６Ｃに示すステップＳ３０１の処理に置換する。なお、本実施の形態では、この段階では全モジュールを確認しておらず識別子が決定していないため、モジュール名などのシンボルで中間コードを作成しておく。
【０２０７】
また、切り替え可能プログラム生成部３０２及び３１２は、サブルーチン呼び出し時の戻りアドレスの格納処理などの、データメモリ５０に分岐先アドレスを格納する処理を抽出し、識別子を格納する処理に置換する（Ｓ６２７）。具体的には、切り替え可能プログラム生成部３０２及び３１２は、図４Ａ及び図４Ｂのプログラムアドレスリストを参照することで分岐先アドレスを識別子に変換して格納する方式に、通常のアドレス格納処理を置換する。より具体的には、図５Ａに示すステップＳ１１０の処理を、図５Ｂ及び図５Ｃに示すステップＳ１１１の処理に置換する。なお、本実施の形態では、この段階では分岐先プログラムアドレスの識別子は全て決定していないので、シンボルによる中間コードとしてプログラムを生成する。
【０２０８】
以上に示す切り替え点の決定（Ｓ６１１）から格納処理の置換（Ｓ６２７）までをサブルーチン毎に繰り返した後、次に、切り替え可能プログラム生成部３０２及び３１２は、広域データのアドレスを複数のプロセッサ間の共通ルールで決定する（Ｓ６２８）。これにより、広域データのプロセッサ間の共有が可能になる。
【０２０９】
さらに、切り替え可能プログラム生成部３０２及び３１２は、登録したプログラムアドレス識別子のシンボルのリストから全ての識別子の実値を決定する。そして、切り替え可能プログラム生成部３０２及び３１２は、定数データ配列によるリストとして作成し、作成したリストを広域データとして追加する（Ｓ６２９）。
【０２１０】
次に、切り替え可能プログラム生成部３０２及び３１２は、ステップＳ６２７で生成した分岐先プログラムアドレスの識別子のシンボルを、ステップＳ６２９で生成した実値に変換する（Ｓ６３０）。なお、この変換処理は、全てのプロセッサについてプロセッサ毎に行われる。
【０２１１】
次に、切り替え判断処理挿入部３０３及び３１３は、ステップＳ６１１で決定したプロセッサ切り替え点と対象のサブルーチンに、システムコールを呼び出す処理を挿入する。具体的には、切り替え判断処理挿入部３０３及び３１３は、サブルーチンの呼び出し処理をシステムコール（図５ＣのステップＳ２００）に置換する（Ｓ６３１）。また、切り替え判断処理挿入部３０３及び３１３は、サブルーチンからの復帰処理もシステムコール（図６ＣのステップＳ４００）に置換する（Ｓ６３２）。これらの置換処理は、全てのプロセッサについてプロセッサ毎に行われる。
【０２１２】
最後に、全サブルーチンをリンクする部分について説明する。
【０２１３】
まず、切り替え可能プログラム生成部３０２及び３１２は、これまで作成した中間コードからプログラムアドレスを決定する（Ｓ６４１）。そして、切り替え可能プログラム生成部３０２及び３１２は、これらの決定した分岐先アドレス、広域データアドレス及び分岐先アドレス識別子を中間コードに適用することで、最終の機械語プログラムを生成する（Ｓ６４２）。
【０２１４】
図９は、本発明の実施の形態に係るマルチプロセッサシステム１０の動作の一例を示すシーケンス図である。
【０２１５】
まず、システムコントローラ１３０は、最初にプログラムを実行させるプロセッサを決定して実行を開始させる（Ｓ７００）。ここでは、最初にプログラムを実行させるプロセッサ、すなわち、切り替え元のプロセッサがプロセッサＡ１２０であり、切り替え先のプロセッサがプロセッサＢ１２１である場合について説明する。
【０２１６】
システムコントローラ１３０は、プログラムを実行させた後、常にシステムの状態の変化を検出し（Ｓ７０１）、実行プロセッサの変更が必要かどうかを判断する（Ｓ７０２）。この判断は、例えば、このプログラムの他にどのようなプログラムがどのプロセッサで実行されているか、どのようなプログラムの実行要求が来ているかなどを検出し、各プログラムが各プロセッサでどの位の処理時間で処理可能であるかを示したテーブルなどを参照することで実行される。例えば、電力を最小に抑えたい場合は、システムコントローラ１３０は、最小のプロセッサ数で全ての機能のリアルタイム性を実現できるようなプロセッサとプログラムとの割付の組み合わせを見つける。そして、システムコントローラ１３０は、現在実行されているプロセッサと新しい割付とが異なる場合は、切り替え処理が必要と判断する。
【０２１７】
切り替えが必要と判断した場合（Ｓ７０３でＹｅｓ）、システムコントローラ１３０は、切り替え元プロセッサであるプロセッサＡ１２０に切り替え要求を発行する（Ｓ７０４）。そして、システムコントローラ１３０は、切り替え元プロセッサでの処理中断完了を待機する（Ｓ７０５）。
【０２１８】
中断処理が完了した場合（Ｓ７０６でＹｅｓ）、システムコントローラ１３０は、中断時の切り替え元プロセッサの状態を取得する（Ｓ７０７）。具体的には、システムコントローラ１３０は、切り替え元プロセッサの中断時のスタックポインタ及び再開アドレスの情報を取得する。なお、システムコントローラ１３０は、これらの中断時の状態を示す情報（コンテキスト）を受け取ることで、中断処理が完了したと判断してもよい。あるいは、システムコントローラ１３０は、切り替え元プロセッサから中断処理が完了したことを示す通知を受け取ることで、中断処理が完了したと判断してもよい。
【０２１９】
そして、システムコントローラ１３０は、中断時の状態を示す情報を基に切り替え先プロセッサであるプロセッサＢ１２１に処理再開を要求する（Ｓ７０８）。そして、切り替え先プロセッサからの再開完了通知を待機し（Ｓ７０９）、完了通知が来ると（Ｓ７１０でＹｅｓ）、システム状態の変化検出を再開する。
【０２２０】
切り替え元プロセッサであるプロセッサＡ１２０は、最初、切り替え可能プログラムの実行を開始し（Ｓ７２０）、その後、プロセッサＡ１２０は、プログラムを実行しながら切り替え点でシステムコントローラ１３０からの切り替え要求の有無を確認する（Ｓ７２１）。
【０２２１】
そして、切り替え要求があれば（Ｓ７２２でＹｅｓ）、プロセッサＡ１２０は、図７Ａで説明した通り、中断地点（切り替え点）での情報（コンテキスト）と中断の完了とをシステムコントローラ１３０に通知する（Ｓ７２３及びＳ７２４）。そして、以降、プロセッサＡ１２０は、再度当該プロセッサで再開できるよう、切り替え先プロセッサの初期状態と同様の処理再開要求待ち状態になって停止する。すなわち、切り替え元プロセッサであったプロセッサＡ１２０は、マルチプロセッサシステム１０における立場が切り替え先プロセッサとなる。
【０２２２】
切り替え先プロセッサであるプロセッサＢ１２１は、処理再開要求待ち状態にある（Ｓ７３０）。プロセッサＢ１２１は、再開要求を待ち続け、要求があった場合（Ｓ７３１でＹｅｓ）、システムコントローラ１３０から、図７Ｂに示す手順で中断状態を取得する（Ｓ７３２）。
【０２２３】
そして、プロセッサＢ１２１は、中断状態を自プロセッサに設定し（Ｓ７３３）、中断アドレス、すなわち、切り替え点から処理を再開する（Ｓ７３４）。以降、切り替え先プロセッサであったプロセッサＢ１２１は、マルチプロセッサシステム１０における立場が切り替え元プロセッサとなる。
【０２２４】
ここで、プロセッサ切り替え可能プログラムの一例について説明する。
【０２２５】
図１０は、本発明の実施の形態に係るソースプログラムの一例である。また、図１１は、通常の機械語プログラムとプロセッサ切り替え可能プログラムの一例を示す図である。また、図１２は、本発明の実施の形態に係るスタック構造の一例を示す図である。
【０２２６】
まず、通常の機械語プログラムについて図１１（ａ）を用いて説明する。
【０２２７】
図１１（ａ）に示す機械語コード６０１は、図１０に示すソースコード５０１に相当する。具体的には、図１２（ａ）に示すスタックのアドレス＃０００４から引数ａｒｇ１を読み出してレジスタＲＥＧ０に格納し、アドレス＃０００５から引数ａｒｇ２を読み出してレジスタＲＥＧ１に格納している。
【０２２８】
機械語コード６０２は、図１０に示すソースコード５０２に相当する。具体的には、まず、レジスタＲＥＧ０に格納された引数ａｒｇ１とレジスタＲＥＧ１に格納された引数ａｒｇ２との減算を行い、減算結果（ａｒｇ１−ａｒｇ２）をレジスタＲＥＧ２に格納する。これにより、レジスタＲＥＧ２には、変数ｉ（＝ａｒｇ１−ａｒｇ２）が格納される。
【０２２９】
機械語コード６０３は、図１０に示すソースコード５０３に相当する。具体的には、レジスタＲＥＧ０に格納された引数ａｒｇ１と、レジスタＲＥＧ２に格納された減算結果、すなわち、変数ｉ（＝ａｒｇ１−ａｒｇ２）との乗算を行い、乗算結果をレジスタＲＥＧ３に格納する。これにより、レジスタＲＥＧ３には、変数ｊ（＝ａｒｇ１＊ｉ）が格納される。
【０２３０】
機械語コード６０４は、図１０に示すソースコード５０４に相当する。具体的には、サブルーチンｓｕｂ２を呼び出すために、当該サブルーチンからの戻り先として、サブルーチンコール命令（“ＣＡＬＬ  ｓｕｂ２”）のその次の機械語コード６０５の先頭プログラムアドレスＡＤＤＲ１を、図１２（ａ）に示すスタック（アドレス＃０００６及び＃０００７）に格納する。そして、サブルーチンｓｕｂ２を呼び出し、サブルーチンｓｕｂ２の処理を実行する。
【０２３１】
そして、戻りアドレスをスタックから読み出して、サブルーチンｓｕｂ２からの復帰し、機械語コード６０５を実行する。なお、機械語コード６０５は、図１０に示すソースコード５０５に相当する。具体的には、レジスタＲＥＧ２に格納されている変数ｉとレジスタＲＥＧ３に格納されている変数ｊとを加算し、加算結果（ｉ＋ｊ）をレジスタＲＥＧ２に格納する。これにより、レジスタＲＥＧ２には、変数ｉ（＝ｉ＋ｊ）が格納される。
【０２３２】
機械語コード６０６は、図１０に示すソースコード５０６に相当する。まず、レジスタＲＥＧ２に格納された変数ｉを、サブルーチンｓｕｂ１からの戻り値として、図１２（ａ）に示すスタック（アドレス＃０００２及び＃０００３）に格納する。そして、スタックから（アドレス＃００００及び＃０００１）から、サブルーチンｓｕｂ１からの戻りアドレスを取得し、レジスタＲＥＧ０に格納する。最後に、スタックポインタを戻し、レジスタＲＥＧ０に格納された戻りアドレスに戻る。
【０２３３】
次に、プロセッサ切り替え可能な機械語プログラムの場合について図１１（ｂ）を用いて説明する。なお、図１１（ｂ）は、図５Ｂに相当し、サブルーチンの分岐が切り替え点ではない場合を示している。
【０２３４】
本実施の形態では、ソースプログラムで明示されたサブルーチン引数及び一時データを必ずスタックに確保するという共通ルールを設け、全てのプロセッサのコンパイラが共通ルールに従って切り替え可能プログラムを生成することにする。また、スタックに確保されるデータ以外の作業データ、及び、レジスタに格納されるデータについては、全てサブルーチンを跨いでデータが残ることを保証されないことも共通ルールとする。
【０２３５】
例えば、切り替え可能プログラム生成部３０２及び３１２は、切り替え点の前でレジスタに格納されている値であり、切り替え点の後で利用される値を、データメモリ５０のスタック領域に格納するように、切り替え可能プログラムを生成する。これにより、サブルーチンを跨いだときに、プロセッサが切り替わっても、必要なデータのスタック内での生存が保障される。以下、この共通ルールの下に作成されたプログラムを説明する。
【０２３６】
まず、図１１（ｂ）に示す機械語コード６１１は、図１０に示すソースコード５０１に相当する。すなわち、機械語コード６１１を実行することで、スタックから引数ａｒｇ１及びａｒｇ２を取り出す。具体的には、図１２（ｂ）に示すスタックのアドレス＃０００４から引数ａｒｇ１を読み出してレジスタＲＥＧ０に格納し、アドレス＃０００６から引数ａｒｇ２を読み出してレジスタＲＥＧ１に格納している。
【０２３７】
次に、機械語コード６１２は、図１０に示すソースコード５０２に相当する。機械語コード６１２は、機械語コード６０２と同じであるので、説明を省略する。
【０２３８】
機械語コード６１３は、図１０に示すソースコード５０３に相当する。機械語コード６１３は、機械語コード６０３と同じであるので、説明を省略する。
【０２３９】
機械語コード６１４は、図１０に示すソースコード５０４に相当する。ここでは、サブルーチンｓｕｂ２を実行するので、プロセッサの切り替えが発生する可能性があり、レジスタの値をスタックに退避させる必要がある。
【０２４０】
具体的には、まず、レジスタＲＥＧ２に格納された変数ｉ（＝ａｒｇ１−ａｒｇ２）を、変数ｉのスタック領域（アドレス＃０００８及び＃０００９）に格納する。また、レジスタＲＥＧ３に格納された変数ｊ（＝ａｒｇ１＊ｉ）を、変数ｊのスタック領域（アドレス＃０００Ａ及び＃０００Ｂ）に格納する。サブルーチンを跨いでレジスタが生存しないという共通ルールに従うため、確保しているスタックに作業データｉ及びｊを退避している。
【０２４１】
そして、サブルーチンｓｕｂ２からの戻り先として、サブルーチンコール命令（“ＣＡＬＬ  ｓｕｂ２”）のその次の機械語コード（“ＬＤ  ＲＥＧ０，（ＳＰ＋８）”）の先頭プログラムアドレスの情報をスタック（アドレス＃０００Ｃ及び＃０００Ｄ）に格納する。具体的には、プログラムアドレスそのものではなく、図４Ａ及び図４Ｂのアドレス識別子を格納する。そして、サブルーチンｓｕｂ２を呼び出し、サブルーチンｓｕｂ２の処理を実行する。
【０２４２】
続いて、サブルーチンｓｕｂ２から復帰する際に、スタックに退避させておいた変数ｉ及びｊを読み出す。具体的には、図１２（ａ）に示すスタックのアドレス＃０００４から変数ｉを読み出して、読み出した変数ｉをレジスタＲＥＧ０に格納する。また、スタックのアドレス＃０００６から変数ｊを読み出して、読み出した変数ｊをレジスタＲＥＧ１に格納する。
【０２４３】
機械語コード６１５は、図１０に示すソースコード５０５に相当する。機械語コード６１５は、機械語コード６０５と同じであるので、説明を省略する。
【０２４４】
最後に、機械語コード６１６は、図１０に示すソースコード５０６に相当する。ここでは、機械語コード６０６と同様にして、サブルーチンｓｕｂ１からの復帰処理を行う。このとき、図１２（ａ）及び（ｂ）から分かるように、図１１（ａ）に示す通常機械語プログラムと、図１１（ｂ）に示すプロセッサ切り替え可能プログラムとでは、使用するスタック領域の大きさが異なっている。このため、機械語コード６１６と機械語コード６０６とでは、スタックポインタの戻す処理のみが異なっている。
【０２４５】
図１１（ｃ）は、図５Ｃに相当し、サブルーチンの分岐が切り替え点である場合を示している。なお、図１１（ｂ）と同じ点には同じ参照符号を付し、ここでは説明を省略する。
【０２４６】
上述したように、サブルーチンの分岐が切り替え点である場合、システムコールによってサブルーチンが実行される。したがって、図１１（ｃ）に示す機械語プログラムは、機械語コード６１４及び６１６の代わりに、システムコールを呼び出すための機械語コード６２４及び６２６を含んでいる。
【０２４７】
機械語コード６２４は、図１０に示すソースコード５０４に相当する。機械語コード６１４と同様に、スタックに変数ｉ及びｊを退避させ、かつ、サブルーチンｓｕｂ２からの戻り先として、システムコール（“ＳＹＳＣＡＬＬ”）のその次の機械語コード（“ＬＤ  ＲＥＧ０，（ＳＰ＋８）”）の先頭プログラムアドレスの識別子（ＡＤＤＲ１＿ＩＤ）をスタック（アドレス＃０００Ｃ及び＃０００Ｄ）に格納する。
【０２４８】
そして、レジスタＲＥＧ０にサブルーチンｓｕｂ２のアドレスの識別子（アドレスそのものではない）を格納する。なお、レジスタＲＥＧ０に格納した識別子は、システムコールの処理においてプロセッサ切り替え要求がない場合に、サブルーチンｓｕｂ２に分岐する際の飛び先情報として利用される。
【０２４９】
そして、システムコール（“ＳＹＳＣＡＬＬ”）が実行される。例えば、図５Ｃに示すステップＳ２００が実行される。以降、プロセッサの切り替え要求がない場合、スタックに退避させておいた変数ｉ及びｊを読み出してレジスタＲＥＧ０及びＲＥＧ１に格納する。
【０２５０】
機械語コード６２６は、図１０に示すソースコード５０６に相当する。ここでは、機械語コード６１６と同様にして、サブルーチンｓｕｂ１からの復帰処理を行う。このとき、サブルーチンｓｕｂ２への分岐の場合と同様に、システムコールを実行することで、プロセッサ切り替え要求の判定を行う。
【０２５１】
図１２は、本発明の実施形態に係るスタック構造の一例を示す図である。
【０２５２】
図１２（ａ）に示すように、通常のプログラムでは、スタックは、あるプロセッサがサブルーチンｓｕｂ１を実行するのに使用する最低限の＃００００から＃０００５までの領域を確保する。これに対して、図１２（ｂ）に示すように、プロセッサ切り替え可能プログラムでは、＃００００から＃０００Ｂまでの領域を確保する。これは、他のプロセッサの中に、レジスタ本数が少ないなどの理由で、より多数の作業領域を必要とするプロセッサがあったためで、当該プロセッサが必要なくても領域は確保する。そのため、図１１（ｂ）及び図１１（ｃ）に示すように、スタックポインタを初期化する際に、図１１（ｃ）より多い＃０００Ｃ（１６進数）だけ移動させている。
【０２５３】
以上のように、プロセッサ切り替え可能プログラムでは、サブルーチンｓｕｂ２の呼び出し及び戻り時に保証されるべきスタック量、スタック内容及びレジスタがプロセッサ間で共通となり、プロセッサが切り替わっても処理を継続することができる。
【０２５４】
ここで、切り替え点決定部３０１及び３１１が決定する切り替え点の具体例について説明する。
【０２５５】
図１３は、本発明の実施の形態において基本ブロックの境界を切り替え点として決定する例を説明するための図である。
【０２５６】
上述したように、本発明の実施の形態に係る切り替え点決定部３０１及び３１１は、ソースプログラムの基本ブロックの境界の少なくとも一部を、切り替え点として決定する。基本ブロックは、プログラム中の途中に分岐及び合流が存在しない部分であり、具体的には、サブルーチンである。
【０２５７】
図１３に示すように、本発明の実施の形態に係る切り替え点決定部３０１及び３１１は、基本ブロックの境界である先頭及び終端を、切り替え点として決定する。なお、切り替え点決定部３０１及び３１１は、全ての基本ブロックの先頭及び終端を切り替え点として決定しなくてもよい。すなわち、切り替え点決定部３０１及び３１１は、プログラムに含まれる複数の基本ブロックの境界から、選択的に切り替え点を選択すればよい。
【０２５８】
このように、基本ブロックは、途中に分岐及び合流を含まない処理のまとまりであるので、基本ブロックの境界を切り替え点とすることで、切り替え点の管理を容易に行うことができる。
【０２５９】
図１４Ａ〜図１４Ｃは、本発明の実施の形態においてサブルーチンの境界を切り替え点として決定する例を説明するための図である。上述したように、切り替え点決定部３０１及び３１１は、基本ブロックの一例であるサブルーチンの境界を、切り替え点として決定してもよい。
【０２６０】
例えば、切り替え点決定部３０１及び３１１は、図１４Ａに示すように、サブルーチンの呼び出し元（Ｃａｌｌｅｒ）の呼び出し部分を切り替え点として決定する。このときの具体的な動作は、図５Ｃに示す通りである。また、同様に、切り替え点決定部３０１及び３１１は、サブルーチンの呼び出し元の復帰部分を切り替え点として決定してもよい。
【０２６１】
また、切り替え点決定部３０１及び３１１は、図１４Ｂに示すように、サブルーチンの呼び出し先（Ｃａｌｌｅｅ）の先頭を切り替え点として決定することもできる。あるいは、切り替え点決定部３０１及び３１１は、サブルーチンの呼び出し先の終端を切り替え点として決定してもよい。このときの具体的な動作は、図６Ｃに示す通りである。
【０２６２】
また、ソースプログラムの例で示すと、図１４Ｃに示すように、切り替え点決定部３０１及び３１１は、サブルーチンである関数Ｆｕｎｃ１の先頭を切り替え点として決定することができる。また、切り替え点決定部３０１及び３１１は、メインルーチンの先頭を切り替え点として決定することもできる。
【０２６３】
このように、サブルーチンの境界を切り替え点とすることで、プロセッサの切り替えを容易に行うことができる。例えば、サブルーチンへの分岐先アドレス及びサブルーチンからの復帰先アドレスを、複数のプロセッサ間で対応付けて管理することで、切り替え先のプロセッサでの処理の継続を容易に行うことができる。具体的には、サブルーチンへの分岐先アドレス及びサブルーチンからの復帰先アドレスを複数のプロセッサ間で対応付けて管理する。そして、切り替え先のプロセッサは、対応する分岐先アドレス又は復帰先アドレスを取得して、処理の継続を容易に行うことができる。
【０２６４】
以上のように、本発明の実施の形態に係るプログラム生成装置は、ソースプログラム中の所定の位置を切り替え点として決定する切り替え点決定部と、切り替え点においてメモリのデータ構造が複数のプロセッサ間で一致するように、ソースプログラムから、機械語プログラムである切り替え可能プログラムをプロセッサ毎に生成するプログラム生成部と、切り替えプログラムを切り替え可能プログラムに挿入する挿入部とを備えることを特徴とする。本実施の形態では、切り替えプログラムは、第１プロセッサが実行中の、当該第１プロセッサに対応する切り替え可能プログラムを切り替え点で停止させ、かつ、第２プロセッサに対応する切り替え可能プログラムを切り替え点から継続して第２プロセッサに実行させるためのプログラムである。
【０２６５】
本実施の形態では、切り替え点ではメモリのデータ構造が一致しているため、切り替えプログラムを実行することで、プロセッサを切り替えることができる。ここでのプロセッサの切り替えとは、プログラムを実行中のプロセッサを停止し、停止した時点から他のプロセッサで継続してプログラムを実行させることである。
【０２６６】
したがって、第１プロセッサが実行中のタスクを第２プロセッサが継続して実行することができる。つまり、実行中のプロセッサでは、他のプロセッサで処理が継続できるようなデータメモリ状態で処理を中断し、他のプロセッサは、データメモリ状態を引き継ぎ、切り替え先の該当するプログラム位置から再開させることで同じデータメモリを共有しながら一貫性を保って処理を継続することができる。
【０２６７】
要するに、上記の構成から、クロスコンパイル環境で生成された機械語プログラムであって、命令セットの異なるプロセッサ毎の切り替え可能プログラムが生成される。この切り替え可能プログラムは、システムコントローラからの要求に基づいて、処理実行中のプロセッサが、データメモリの一貫性が保てる地点で切り替え要求をシステムコールで検知し、処理を中断してプロセッサ状態を保存する。そして、保存したプロセッサ状態を切り替え先プロセッサが引き継ぎ、再開することで、処理の一貫性の保った実行プロセッサの移動が可能となる。
【０２６８】
したがって、本発明の実施の形態によれば、命令セットの異なるプロセッサを持つマルチプロセッサシステムで処理を実行中であっても、実行プロセッサの変更が可能となる。したがって、機器の使用状態の変化に対し、実行中の処理を停止させることなく柔軟にシステム構成を変更でき、機器の処理性能、低電力性能の改善が可能となる。
【０２６９】
以上、本発明に係るプログラム生成装置、プロセッサ装置、マルチプロセッサシステム及びプログラム生成方法について、実施の形態に基づいて説明したが、本発明は、これらの実施の形態に限定されるものではない。本発明の趣旨を逸脱しない限り、当業者が思いつく各種変形を当該実施の形態に施したものや、異なる実施の形態における構成要素を組み合わせて構築される形態も、本発明の範囲内に含まれる。
【０２７０】
例えば、本発明の実施の形態に係る切り替え点決定部３０１及び３１１は、サブルーチンの階層の深さに基づいて切り替え点を決定してもよい。具体的な例について、図１５及び図１６を用いて説明する。
【０２７１】
図１５は、本発明の実施の形態の変形例においてサブルーチンの階層の深さに基づいて切り替え点を決定する例を説明するための図である。
【０２７２】
本発明の実施の形態に係る切り替え点決定部３０１及び３１１は、ソースプログラム中のサブルーチンの呼び出しの階層の深さが、所定の閾値より浅いサブルーチンの境界の少なくとも一部を、切り替え点として決定してもよい。すなわち、切り替え点決定部３０１及び３１１は、サブルーチンの階層が閾値より深いサブルーチンの境界を、切り替え点の対象から除外してもよい。
【０２７３】
例えば、プログラムのメインルーチンを第１階層（ｌｅｖｅｌ１）とみなす。このとき、閾値が例えば第３階層（ｌｅｖｅｌ３）であるとすると、切り替え点決定部３０１及び３１１は、第３階層までのサブルーチンの境界を切り替え点として決定する。図１５に示す例では、メインルーチン、サブルーチン１、及び、サブルーチン３〜５の境界が切り替え点として決定される。
【０２７４】
サブルーチン２及びサブルーチン６は、閾値である第３階層より深い第４階層又は第５階層で呼び出されるため、切り替え点決定部３０１及び３１１は、切り替え点の対象から除外する。すなわち、１つのサブルーチンが複数の異なる階層で呼び出される場合は、切り替え点決定部３０１及び３１１は、当該複数の階層のうち最も深い階層が閾値より深いか否かを判定することで、当該サブルーチンの境界を切り替え点として決定するか否かを判定する。切り替え点決定部３０１及び３１１は、最も深い階層が閾値より浅い場合に、当該サブルーチンの境界を切り替え点として決定する。
【０２７５】
図１６は、本発明の実施の形態の変形例においてサブルーチンの階層の深さに基づいて切り替え点を決定する別の例を説明するための図である。
【０２７６】
図１６に示す例でも、図１５に示す例と同様に、切り替え点決定部３０１及び３１１は、階層が所定の閾値より深いサブルーチンを切り替え点の対象から除外する。図１６に示す例では、同一のサブルーチンが複数の異なる階層で呼び出される場合は、当該サブルーチンの階層を個別に判定する点が、図１５に示す例と異なっている。
【０２７７】
つまり、切り替え点決定部３０１及び３１１は、同一のサブルーチンが複数の階層で呼び出されるか否かに関わらず、サブルーチンの呼び出し毎に階層が閾値より深いか否かを判定する。図１６に示す例では、サブルーチン２は、メインルーチンから第２階層で呼び出されるとともに、サブルーチン４から第４階層で呼び出される。
【０２７８】
このとき、切り替え点決定部３０１及び３１１は、閾値より浅い第２階層でメインルーチンから呼び出されるサブルーチン２の境界を切り替え点として決定する。一方で、切り替え点決定部３０１及び３１１は、閾値より深い第４階層でサブルーチン４から呼び出されるサブルーチン２を切り替え点の対象から除外する。
【０２７９】
切り替え点の対象となるサブルーチンは、切り替え点の対象とならないサブルーチンと比較して、機械語プログラムが異なる。このため、切り替え可能プログラム生成部３０２及び３１２は、サブルーチン２に相当する同一のソースプログラムから、２つの異なるサブルーチンに相当する機械語プログラムを生成する。すなわち、切り替え可能プログラム生成部３０２及び３１２は、切り替え点の対象となるサブルーチン２’と、切り替え点の対象とならないサブルーチン２とのそれぞれに対応する２種類の機械語プログラムを生成する。
【０２８０】
このように、全てのサブルーチンを切り替えの対象とはせずに、呼び出しの階層構造において浅いサブルーチンを切り替えの対象とすることで、切り替え点の数を制限することができる。切り替え点の数が多いと、切り替えの判断処理などが多くなるため、プログラムの処理が遅くなる場合があるので、切り替え点の数を制限することで、処理の低速化を抑制することができる。
【０２８１】
なお、本発明の実施の形態に係る切り替え点決定部３０１及び３１１は、ソースプログラムの分岐の少なくとも一部を切り替え点として決定してもよい。また、このとき、切り替え点決定部３０１及び３１１は、ソースプログラムの分岐のうち繰り返し処理への分岐を、切り替え点の対象から除外してもよい。
【０２８２】
図１７Ａは、本発明の実施の形態の変形例に係る分岐点に基づいて切り替え点を決定する例を説明するためのソースプログラムの一例である。図１７Ｂは、図１７Ａに示すソースプログラムに相当する機械語プログラムの一例である。
【０２８３】
図１７Ａに示すように、切り替え点決定部３０１及び３１１は、ｉｆ処理などの分岐点を切り替え点として決定する。一方で、切り替え点決定部３０１及び３１１は、ｆｏｒ処理などの繰り返し処理への分岐を切り替え点の対象から除外する。
【０２８４】
まず、図１７Ａに示すソースプログラムと図１７Ｂに示す通常の機械語プログラムとの関係について説明する。なお、スタックのスタックポインタＳＰが示す領域に、引数ａが格納されており、スタックポインタＳＰ＋１が示す領域に、引数ｂが格納されている場合を想定する。
【０２８５】
図１７Ａに示すソースコード７０１は、図１７Ｂに示す機械語コード８０１に相当する。具体的には、スタックから引数ｂを読み出してレジスタＲＥＧ０及びＲＥＧ１に格納する。レジスタＲＥＧ０の値が変数ｉに相当し、レジスタＲＥＧ１の値が変数ｊに相当する。そして、レジスタＲＥＧ０に格納した値である変数ｉをインクリメントする。
【０２８６】
ソースコード７０２は、機械語コード８０２に相当する。具体的には、スタックから引数ａを読み出してレジスタＲＥＧ２に格納する。そして、レジスタＲＥＧ２に格納した値と値０とを比較する。すなわち、引数ａが０であるか否かを判定する。引数が０である場合、プログラムアドレスａｄｒ０に処理が移行する。
【０２８７】
引数が０ではない場合、レジスタＲＥＧ０に格納された引数ｉとレジスタＲＥＧ１に格納された引数ｊとを加算し、加算結果をレジスタＲＥＧ１に格納する。すなわち、ｊ＋ｉを計算し、計算結果を新たなｊの値とする。
【０２８８】
ソースコード７０３は、機械語コード８０３に相当する。具体的には、まず、レジスタＲＥＧ３に値１００を格納する。なお、レジスタＲＥＧ３に値１００を格納する処理が、プログラムアドレスａｄｒ０によって示される処理である。そして、レジスタＲＥＧ１に格納した値である変数ｊをインクリメントする。なお、変数ｊのインクリメントは、プログラムアドレスａｄｒ４によって示される処理である。
【０２８９】
次に、レジスタＲＥＧ３に格納された値をデクリメントし、レジスタＲＥＧ３に格納された値が０でなければ、プログラムアドレスａｄｒ４に処理が移行する。つまり、レジスタＲＥＧ３に格納された値が０になるまで、変数ｊのインクリメントが繰り返される。
【０２９０】
ソースコード７０４は、機械語コード８０４に相当する。具体的には、まず、レジスタＲＥＧ０に格納されている値である変数ｉと、レジスタＲＥＧ１に格納されている値である変数ｊとの加算を行う。加算結果は、レジスタＲＥＧ２に格納される。そして、レジスタＲＥＧ２に格納された加算結果が、スタックのスタックポインタＳＰ＋５が示す領域に格納される。
【０２９１】
以上、図１７Ａに示すソースプログラムをプロセッサ独自のルールに従って変換することで生成される通常の機械語プログラムについて説明した。以下では、本発明の実施の形態におけるプロセッサ間での共通ルールに従って生成される切り替え可能プログラムについて説明する。
【０２９２】
図１７Ｂに示す機械語コード８１１は、ソースコード７０１に相当する。機械語コード８１１は、機械語コード８０１と比較すると、新たに、レジスタに格納された値をスタックに退避する機械語コード８２１が追加されている。具体的には、レジスタＲＥＧ０に格納された変数ｉを、スタックのスタックポインタＳＰ＋２が示す領域に格納し、レジスタＲＥＧ１に格納された変数ｊを、スタックのスタックポインタＳＰ＋３が示す領域に格納する。
【０２９３】
これは、以降の処理にサブルーチン（ｉｆ処理及びｆｏｒ処理）が含まれており、サブルーチンを跨いでレジスタの値が残ることは保証されていないためである。さらには、サブルーチンの境界が切り替え点として決定される場合、プロセッサが切り替わる可能性があるので、他のプロセッサでプログラムを継続して実行するために、共有メモリのスタックに変数を格納する必要があるためである。
【０２９４】
機械語コード８１２は、ソースコード７０２に相当する。機械語コード８１２は、機械語コード８０２と比較すると、新たに、システムコールを呼び出すための機械語コード８２２と、変数をスタックから読み出す機械語コード８２３と、変数をスタックに退避する機械語コード８２４とが追加されている。
【０２９５】
具体的には、ソースコード７０２によって示されるｉｆ処理の分岐点が切り替え点として決定されているので、機械語コード８２２を追加することで、プロセッサを切り替えるためのシステムコールを実行する。このとき、レジスタＲＥＧ０には、プログラムアドレスａｄｒ１の識別子が格納されている。システムコールの実行において、プロセッサの切り替え要求がない場合、当該識別子からプログラムアドレスａｄｒ１を取得し、取得したプログラムアドレスａｄｒ１が示す処理を実行する。
【０２９６】
また、機械語コード８２３は、機械語コード８２１によってスタックに格納された変数ｉ及び変数ｊを読み出すために追加されたコードである。通常プログラムでは、レジスタに値が格納されているので、スタックから読み出す必要はないのに対して、切り替え可能プログラムでは、プロセッサが切り替わる可能性を考慮してスタックに変数を退避させているので、スタックから変数を読み出す必要がある。
【０２９７】
また、機械語コード８２４は、変数ｉと変数ｊとの加算結果が格納されているレジスタＲＥＧ１の値を、スタックに格納するためのコードである。これも、機械語コード８２１と同様の理由による。
【０２９８】
機械語コード８１３は、ソースコード７０３に相当する。機械語コード８１３は、機械語コード８０３と比較すると、新たに、システムコールを呼び出すための機械語コード８２５と、変数をスタックから読み出す機械語コード８２６と、変数をスタックに退避する機械語コード８２７とが追加されている。これらは、機械語コード８１２に含まれる機械語コード８２２、８２３及び８２４とそれぞれ同じであるので、ここでは説明を省略する。
【０２９９】
なお、繰り返し処理の先頭は、切り替え点として決定されており、機械語コード８２５が挿入されている。これに対して、繰り返し処理の途中では、分岐が含まれているが、切り替え点の対象とはしない。これは、繰り返しの度にシステムコールが呼び出されることによる処理負荷の増大を防止するためである。
【０３００】
機械語コード８１４は、ソースコード７０４に相当する。機械語コード８１４は、機械語コード８０４と比較すると、新たに、システムコールを呼び出すための機械語コード８２８と、変数をスタックから読み出す機械語コード８２９とが追加されている。これらは、機械語コード８１２に含まれる機械語コード８２２及び８２３とそれぞれ同じであるので、ここでは説明を省略する。
【０３０１】
このように、分岐を切り替え点とすることで、プロセッサの切り替えを容易に行うことができる。例えば、分岐先アドレスを複数のプロセッサ間で対応付けて管理することで、切り替え先のプロセッサは、対応する分岐先アドレスを取得して、処理の継続を容易に行うことができる。また、繰り返し処理において繰り返しの度に切り替えの判断処理を行うことを防止することができ、処理の低速化を抑制することができる。
【０３０２】
なお、本発明の実施の形態に係る切り替え点決定部３０１及び３１１は、隣り合う切り替え点の間に含まれる処理を実行するのに要する期間が、予め定められた期間より短くなるように、前記切り替え点を決定してもよい。好ましくは、切り替え点決定部３０１及び３１１は、切り替え点間の処理を実行するのに要する期間が一定の期間となるように、切り替え点として決定してもよい。具体的な例について、図１８を用いて説明する。
【０３０３】
図１８は、本発明の実施の形態の変形例に係る一定間隔で切り替え点を決定する例を説明するための図である。
【０３０４】
サブルーチンＦｕｎｃ１には、処理１〜処理９が含まれている。プロセッサが処理１〜処理９のそれぞれを実行する場合に要する期間は、それぞれｔ１〜ｔ９である。
【０３０５】
切り替え点決定部３０１及び３１１は、処理を実行する順に処理に要する期間を加算する。そして、切り替え点決定部３０１及び３１１は、加算した期間が予め定められた期間Ｔを超えた場合に、最後に加算した期間に対応する処理の先頭を切り替え点として決定する。
【０３０６】
図１８に示す例では、処理１〜処理３までに要する期間（ｔ１＋ｔ２＋ｔ３）は、期間Ｔより短いが、処理１〜処理４までに要する期間（ｔ１＋ｔ２＋ｔ３＋ｔ４）は、期間Ｔより長くなる。したがって、切り替え点決定部３０１及び３１１は、最後に加算したｔ４に対応する処理４の先頭を、切り替え点として決定する。同様に、処理８の先頭も切り替え点として決定される。
【０３０７】
なお、切り替え点決定部３０１及び３１１は、最後から２番目に加算した期間に対応する処理の終端を、切り替え点として決定してもよい。この場合、図１８に示す例では、処理３の終端及び処理７の終端が切り替え点として決定される。
【０３０８】
このように、ほぼ一定期間毎に切り替え点が決定されるので、切り替えが要求された場合に、実際にプロセッサが切り替えられるまでの待ち時間が大きくなることを防止することができる。
【０３０９】
また、本発明の実施の形態に係る切り替え点決定部３０１及び３１１は、ソースプログラム中で予め定められた位置を、切り替え点として決定してもよい。つまり、切り替え点決定部３０１及び３１１は、ソースプログラム中にユーザ（プログラマなど）によって予め定められた位置を、切り替え点として決定してもよい。これにより、ユーザが、プロセッサの切り替え点を指定することができる。具体的な例について、図１９を用いて説明する。
【０３１０】
図１９は、本発明の実施の形態の変形例に係るユーザ指定によって切り替え点を決定する例を説明するための図である。
【０３１１】
ユーザが、ソースプログラム中に、切り替え点を指定するためのソースコードを所定の位置に追加することで、当該位置を切り替え点として指定することができる。例えば、図１９に示すように、ユーザは、ソースプログラム中に「＃ｐｒａｇｍａ  ＣＰＵＳＷＩＴＣＨ＿ＥＮＡＢＬＥ＿ＦＵＮＣ」、又は、「＃ｐｒａｇｍａ  ＣＰＵＳＷＩＴＣＨ＿ＥＮＡＢＬＥ＿ＰＯＩＮＴ」などのソースコード９０１又は９０２を追加することによって、当該ソースコードを記載した位置を切り替え点として指定することができる。
【０３１２】
切り替え点決定部３０１及び３１１は、ソースコード９０１及び９０２を認識することにより、ソースコード９０１及び９０２が記載された位置を切り替え点として決定する。これにより、図１９の例では、サブルーチンＦｕｎｃ１の先頭と、処理４及び処理５の間とが切り替え点として決定される。
【０３１３】
このように、ソースプログラムを生成する際にユーザによって切り替え点を指定することができるので、ユーザの意図した地点での切り替えを可能にすることができる。
【０３１４】
なお、上記の実施の形態では、切り替え点でシステムコールを呼び出すことによって、プロセッサの切り替えが要求されているか否かを判定する処理を行っていた。これに対して、システムコールではなく、切り替え判断処理挿入部３０３及び３１３は、プロセッサの切り替え要求の判定を行う切り替え専用プログラム（判定処理）を切り替え可能プログラムに挿入してもよい。例えば、切り替え可能プログラム生成部３０２及び３１２は、切り替え点として決定された呼び出し部分又は復帰部分を、切り替え専用プログラムに置き換えるように、切り替え可能プログラムを生成してもよい。
【０３１５】
図２０は、本発明の実施の形態の変形例に係る切り替え要求の判定処理の一例を示すフローチャートである。
【０３１６】
まず、プロセッサは、システムコントローラ１３０（具体的には、プロセッサ切り替え制御部１３１）からのプロセッサ切り替え要求が発行されているかどうかを確認する（Ｓ８０１）。プロセッサ切り替え要求が発行されていれば（Ｓ８０２でＹｅｓ）、プロセッサは、上述した図７Ａのプロセッサ切り替えシーケンスを起動する（Ｓ８０５）。
【０３１７】
プロセッサ切り替え要求が発行されていなければ（Ｓ８０２でＮｏ）、プロセッサは、サブルーチンのアドレス識別子からサブルーチンの分岐先プログラムアドレス（サブルーチンアドレス）を導出する（Ｓ８０３）。そして、プロセッサは、サブルーチンアドレスに分岐して、サブルーチンを開始する（Ｓ８０４）。
【０３１８】
なお、図２０に示す切り替え専用プログラムは、図５Ｃに示すシステムコール（Ｓ２００）による処理と同じである。すなわち、システムコールを介してプロセッサが判定処理を実行するか、システムコールではなく切り替え可能プログラム中で判定処理を実行するかが異なっている。
【０３１９】
具体的には、切り替え専用プログラムは、プロセッサの切り替えが要求されているか否かを、当該切り替え専用プログラムに対応するプロセッサに判断させ、切り替えが要求されている場合に、当該切り替え専用プログラムに対応するプロセッサが実行中の切り替え可能プログラムを切り替え点で停止させ、かつ、他のプロセッサに対応する切り替え可能プログラムを、切り替え点から継続して他のプロセッサに実行させ、切り替えが要求されていない場合に、当該切り替え専用プログラムに対応するプロセッサが実行中の切り替え可能プログラムを継続して実行させるためのプログラムである。
【０３２０】
このように、切り替え判断処理挿入部３０３及び３１３は、システムコールを呼び出すプログラムの代わりに、切り替え要求の判定処理を行う切り替え専用プログラムを切り替え可能プログラムに挿入してもよい。
【０３２１】
また、切り替え可能プログラム生成部３０２及び３１２は、切り替え点において、データメモリ５０に格納される構造化データ内のデータ構造が複数のプロセッサ間で一致するように、切り替え可能プログラムを生成することが好ましい。具体的な例について、図２１Ａ及び図２１Ｂを用いて説明する。
【０３２２】
図２１Ａは、本発明の実施の形態の変形例に係る構造化データの一例を示す図である。図２１Ｂは、本発明の実施の形態の変形例に係る構造化データのデータ構造の一例を示す図である。
【０３２３】
図２１Ａに示すように、ソースプログラム中で、変数ｉ、ｊ、ａ及びｂが構造化データとして定義される。ここで、構造化データは、構造体変数とも記載する。ここでは、変数ｉ及びａは、１６ビットで定義され、変数ｊ及びｂは８ビットで定義される。
【０３２４】
ここで、例えば、図２１Ｂに示すように、プロセッサＡ専用プログラムでは、定義された変数のデータ幅に従って、メモリ内に領域が確保される。すなわち、１６ビットの変数ｉ及びａには、それぞれ１６ビット（２バイト）分のメモリ領域が確保され、８ビットの変数ｊ及びｂには、それぞれ８ビット（１バイト）分のメモリ領域が確保される。
【０３２５】
また、プロセッサＢ専用プログラムでは、変数のデータ幅に関わらず、全ての変数に１６ビット分のメモリ領域が確保される。また、プロセッサＡでは、ｉ、ａ、ｊ、ｂの順でメモリに格納されるのに対して、プロセッサＢでは、ｉ、ｊ、ａ、ｂの順でメモリに格納される。このように、通常のプログラムでは、プロセッサ毎に構造体変数のデータ領域の大きさ及び配置が異なっている。
【０３２６】
これに対して、本発明の実施の形態の変形例に係る切り替え可能プログラムでは、構造体変数のデータ構造を複数のプロセッサ間で一致させる。具体的には、構造体変数のデータ領域の大きさ及び配置を一致させる。これにより、いずれのプロセッサからでも構造体変数の読み出し及び書き込みを行うことができるので、プロセッサの切り替えを行うことができる。
【０３２７】
なお、図２１Ｂに示す例では、切り替え可能プログラムにおける構造体変数のデータ構造は、プロセッサＢ専用プログラムにおける構造体変数のデータ構造と同じであるが、同じでなくてもよい。つまり、複数のプロセッサのいずれからもアクセスできるように、構造体変数のデータ領域の大きさ及びサイズを定めればよい。
【０３２８】
このように、構造化データ（構造体変数）のデータ構造を切り替え点で一致させているので、切り替え先のプロセッサでは、構造化データをそのまま利用することができる。
【０３２９】
また、切り替え可能プログラム生成部３０２及び３１２は、切り替え点において、ソースプログラム中にデータ幅が明記されないデータのデータ幅が複数のプロセッサ間で一致するように、切り替え可能プログラムを生成することが好ましい。具体的な例について、図２２Ａ及び図２２Ｂを用いて説明する。
【０３３０】
図２２Ａは、本発明の実施の形態の変形例に係るデータ幅が明記されていないデータの一例を示す図である。図２２Ｂは、本発明の実施の形態に係るデータ幅が明記されていないデータのデータ構造の一例を示す図である。
【０３３１】
図２２Ａに示す例では、ｉｎｔ宣言された変数ｉ及びｊと、ｃｈａｒ宣言された変数ｃ１及びｃ２とがある。ここでは、図２１Ａなどとは異なり、それぞれの変数のデータ幅（ビット数）は定義されていない。
【０３３２】
このため、図２２Ｂに示すように、プロセッサは独自に各変数のビット幅を定義している。具体的には、プロセッサＡ専用プログラムでは、変数ｉ、ｊ、ｃ１及びｃ２のそれぞれに対して、１バイトの領域をメモリ内に確保している。プロセッサＢ専用プログラムでは、変数ｉ及びｋには、２バイトの領域をメモリ内に確保し、変数ｃ１及びｃ２には、１バイトの領域を確保している。
【０３３３】
これに対して、本発明の実施の形態の変形例に係る切り替え可能プログラムでは、データ幅が明記されていないデータのデータ構造を複数のプロセッサ間で一致させる。具体的には、これらのデータのデータ領域の大きさ及び配置を一致させる。これにより、いずれのプロセッサからでもデータの読み出し及び書き込みを行うことができるので、プロセッサの切り替えを行うことができる。
【０３３４】
なお、図２２Ｂに示す例では、切り替え可能プログラムにおけるデータ幅が明記されていないデータのデータ構造は、プロセッサＢ専用プログラムにおけるデータ構造と同じであるが、同じでなくてもよい。つまり、複数のプロセッサのいずれからもアクセスできるように、データ幅が明記されていないデータのデータ領域の大きさ及びサイズを定めればよい。
【０３３５】
このように、データ幅が明記されていないデータのデータ幅を切り替え点で一致させているので、切り替え先のプロセッサでは、データをそのまま利用することができる。
【０３３６】
また、切り替え可能プログラム生成部３０２及び３１２は、切り替え点において、メモリに格納されるデータのエンディアンが複数のプロセッサ間で一致するように、切り替え可能プログラムを生成することが好ましい。具体的な例について、図２３Ａ及び図２３Ｂを用いて説明する。
【０３３７】
図２３Ａは、本発明の実施の形態の変形例に係るデータの一例を示す図である。図２３Ｂは、本発明の実施の形態に係るデータのエンディアンを複数のプロセッサ間で一致させることを説明するための図である。
【０３３８】
エンディアンは、多バイトのデータをメモリに配置する方式の種類を示す。具体的には、データの上位バイトからメモリに配置するビッグエンディアン、及び、データの下位バイトからメモリに配置するリトルエンディアンなどがある。エンディアンは、プロセッサ毎に異なっている。
【０３３９】
図２３Ａに示す例では、変数ｉは、１６バイトのデータである。プロセッサＡ専用プログラムでは、リトルエンディアンに従って、メモリのアドレス＃０００２には、変数ｉの下位ビットｉ［７：０］が格納され、アドレス＃０００３には、変数ｉの上位ビットｉ［１５：８］が格納される。一方で、プロセッサＢ専用プログラムでは、ビッグエンディアンに従って、メモリのアドレス＃０００２には、変数ｉの上位ビットｉ［１５：８］が格納され、アドレス＃０００３には、変数ｉの下位ビットｉ［７：０］が格納される。
【０３４０】
これに対して、本発明の実施の形態の変形例に係る切り替え可能プログラムでは、複数のプロセッサ間でデータのエンディアンを一致させる。このとき、切り替え可能プログラムで用いるエンディアンが、プロセッサが利用するエンディアンと異なっている場合は、当該プロセッサに対応する切り替え可能プログラムに、読み出したデータを並べ替えるための機械語コードを挿入する。これにより、いずれのプロセッサからでもデータの読み出し及び書き込みを行うことができるので、プロセッサの切り替えを行うことができる。
【０３４１】
なお、図２３Ｂに示す例では、切り替え可能プログラムにおけるエンディアンは、プロセッサＢ専用プログラムにおけるエンディアンと同じであるが、同じでなくてもよい。つまり、複数のプロセッサのいずれからもアクセスできるように、エンディアンを定めればよい。
【０３４２】
このように、データのエンディアンを切り替え点で一致させているので、切り替え先のプロセッサは、自プロセッサのエンディアンと、一致させたエンディアンとが同じである場合は、メモリからデータを読み出したデータをそのまま利用することができる。また、切り替え先のプロセッサは、自プロセッサのエンディアンと、一致させたエンディアンとが異なる場合は、読み出したデータの並び替えを行うことで、メモリから読み出したデータを利用することができる。
【０３４３】
また、切り替え可能プログラム生成部３０２及び３１２は、サブルーチンの階層に応じてメモリのデータ構造の一致を制御してもよい。具体的には、切り替え可能プログラム生成部３０２及び３１２は、切り替え点の対象となるサブルーチンと、当該サブルーチンの上位のサブルーチンとの間で、データメモリ５０のスタック領域のデータ構造を一致させるように、切り替え可能プログラムを生成する。
【０３４４】
図２４は、本発明の実施の形態に係るサブルーチンの階層に応じてメモリのデータ構造を一致させる処理の一例を説明するための図である。
【０３４５】
図２４では、一例として、サブルーチンｓｕｂ４が切り替え点の対象として決定された場合を示している。この場合、切り替え可能プログラム生成部３０２及び３１２は、サブルーチンｓｕｂ４の上位のサブルーチンであるサブルーチンｓｕｂ３及びメインルーチンＭＡＩＮと、サブルーチンｓｕｂ４との間で、メモリのスタック領域のデータ構造を一致させる。
【０３４６】
なお、対象サブルーチンの上位のサブルーチンとは、図２４に示すようなサブルーチンの階層ツリーにおいて、対象サブルーチンとメインルーチンとの間のサブルーチンであり、一本のルート（分岐なしのルート）上に位置するサブルーチンである。具体的には、上位のサブルーチンは、対象サブルーチンを呼び出したサブルーチンと、当該サブルーチンを呼び出したさらに上位のサブルーチンとを含んでいる。
【０３４７】
なお、対象サブルーチンより下位のサブルーチンには、切り替え点の対象となるサブルーチンが含まれていない。このため、下位のサブルーチンが実行されたとしても、その終了とともに、データ構造は元に戻るため、一致させる必要はない。
【０３４８】
一方で、対象サブルーチンの上位のサブルーチンを、対象サブルーチンとは異なるデータ構造を用いて実行した場合、対象サブルーチンの実行後に上位のサブルーチンに戻ったときに、データの一貫性が取れておらず、上位のサブルーチンを正しく実行することができない。このため、上位のサブルーチンと対象サブルーチンとの間で、データ構造を一致させておく必要がある。
【０３４９】
ここでは、対象サブルーチンの呼び出し及び復帰では、図５Ｃ及び図６Ｃに示す処理を行い、切り替え対象ではない上位のサブルーチンの呼び出し及び復帰では、スタック構造の一致のみを行い、図５Ｂ及び図６Ｂに示す処理を行う。なお、上位のサブルーチンから分岐するサブルーチンについては、データ構造を一致させる必要はない。
【０３５０】
このように、対象サブルーチンとその上位のサブルーチンとの間でデータの一貫性を取ることができ、正しく上位のサブルーチンを実行することができる。
【０３５１】
また、上記の実施の形態では、図４Ａ及び図４Ｂに示すように、分岐先アドレスと識別子とを対応付けたプログラムアドレスリストを生成したが、切り替え可能プログラム生成部３０２及び３１２は、複数のプロセッサ毎の切り替え可能プログラムにおける分岐先アドレスのそれぞれを互いに対応付けた構造化アドレスデータを生成してもよい。具体的な例について、図２５Ａ〜図２５Ｄを用いて説明する。
【０３５２】
図２５Ａは、本発明の実施の形態の変形例に係る構造化アドレスデータの一例を示す図である。
【０３５３】
切り替え可能プログラム生成部３０２及び３１２は、ソースプログラム中の同一の分岐を示す分岐先アドレスであって、複数のプロセッサ毎の切り替え可能プログラムにおける分岐先アドレスのそれぞれを対応付けた構造化アドレスデータを生成する。生成した構造化アドレスデータは、例えば、データメモリ５０に記憶される。
【０３５４】
図２５Ａに示すプロセッサＡ用のプログラムアドレスは、ソースコード中の１つの分岐先アドレスであり、機械語プログラムである切り替え可能プログラムＡにおける分岐先アドレスを示している。同様に、プロセッサＢ用のプログラムアドレスは、ソースコード中の１つの分岐先アドレスであり、機械語プログラムである切り替え可能プログラムＢにおける分岐先アドレスを示している。
【０３５５】
ここで、プロセッサＡ用のプログラムアドレスと、プロセッサＢ用のプログラムアドレスとは、ソースコード中で同一の分岐先アドレスに相当する。すなわち、プロセッサＡ１２０又はプロセッサＢ１２１はそれぞれ、図２５Ａに示す構造化アドレスデータを読み出し、自プロセッサに対応するプログラムアドレスを利用することで、所望の処理を実現することができる。例えば、プロセッサＡ１２０からプロセッサＢ１２１に切り替える際には、プロセッサＡが読み出すべき構造化アドレスデータを、プロセッサＢ１２１が読み出し、読み出した構造化アドレスデータのうちプロセッサＢ用のプログラムアドレスを利用することで、切り替え点から処理を継続することができる。
【０３５６】
図２５Ｂは、本発明の実施の形態の変形例に係るサブルーチンの呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。なお、図２５Ｂは、図５Ｂに示すフローチャートに相当し、サブルーチン呼び出しがプロセッサ切り替え点として決定されていない場合の例を示す。
【０３５７】
サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納する（Ｓ１００）。そして、プロセッサは、サブルーチンからの復帰先として、サブルーチン呼び出し部分の直後のプログラムアドレスそのものでなく、図２５Ａに示す構造化アドレスデータを格納する（Ｓ９１１）。そして、プロセッサは、サブルーチンの開始アドレスに分岐して、サブルーチンを開始する（Ｓ１２０）。
【０３５８】
図２５Ｃは、本発明の実施の形態の変形例に係るサブルーチンの呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。なお、図２５Ｃは、図５Ｃに示すフローチャートに相当し、サブルーチン呼び出しがプロセッサ切り替え点として決定されている場合の例を示す。
【０３５９】
サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納し（Ｓ１００）、構造化アドレスデータを格納する（Ｓ９１１）。その後、プロセッサは、構造化アドレスデータから自プロセッサ用のプログラムアドレスを抽出し、抽出したプログラムアドレスを入力として、システムコール（Ｓ２００）を発生させる（Ｓ９１２）。
【０３６０】
なお、システムコールの処理については、図５Ｃとほぼ同じであるので、ここでは説明を省略する。図２５Ｃの例では、図５Ｃとは異なり、識別子ではなくプログラムアドレスを取得するので、サブルーチンＩＤから分岐先アドレスを導出処理（Ｓ２０３）が省略されている。
【０３６１】
図２５Ｄは、本発明の実施の形態の変形例に係るサブルーチンからの復帰処理のプログラムの一例を示す図である。
【０３６２】
まず、プロセッサは、スタックから構造化アドレスデータを取得する（Ｓ９２１）。つまり、プロセッサは、サブルーチンからの戻りアドレスを含む構造化アドレスデータを取得する。そして、プロセッサは、構造化アドレスデータの中の自プロセッサ用のプログラムアドレスを抽出する（Ｓ９２２）。そして、プロセッサは、サブルーチン戻りアドレスに復帰する（Ｓ３２０）。
【０３６３】
このように、本発明の実施の形態の変形例では、識別子を用いずに、対応するプログラムアドレス同士を構造化アドレスデータとしてまとめて管理してもよい。つまり、複数のプロセッサそれぞれの分岐先アドレスを対応付けた構造化アドレスデータを管理する。
【０３６４】
これにより、切り替え先のプロセッサは、切り替え元のプロセッサが次に実行する予定であった処理の分岐先アドレスを含む構造化アドレスデータを取得することで、自プロセッサに対応する分岐先アドレスを取得することができる。したがって、切り替え元のプロセッサが実行していたタスクを、切り替え先のプロセッサが継続して実行することができる。
【０３６５】
また、切り替え判断処理挿入部３０３及び３１３は、システムコールの呼び出し命令の代わりに、専用のプロセッサ命令を挿入してもよい。例えば、切り替え可能プログラム生成部３０２及び３１２は、切り替え点として決定された呼び出し部分又は復帰部分を、専用のプロセッサ命令に置き換えるように、切り替え可能プログラムを生成してもよい。
【０３６６】
ここで、専用のプロセッサ命令は、プロセッサの切り替えが要求されているか否かを判定するサブルーチンを実行させるための命令である。具体的な例について、図２６Ａ〜図２６Ｃを用いて説明する。
【０３６７】
図２６Ａは、本発明の実施の形態の変形例に係るサブルーチン呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。なお、図２６Ａは、図５Ｃに示すフローチャートに相当し、サブルーチン呼び出しがプロセッサ切り替え点として決定されている場合の例を示す。
【０３６８】
サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納する（Ｓ１００）。そして、プロセッサは、サブルーチンからの復帰先として、サブルーチン呼び出し部分の直後のプログラムアドレスそのものでなく、図４Ａ及び図４Ｂで説明したプログラムアドレスリストの識別子を、戻り点ＩＤとして格納する（Ｓ１１１）。
【０３６９】
そして、プロセッサは、特殊サブルーチンコール命令を実行することでサブルーチンに分岐する（Ｓ１０２０）。特殊サブルーチンコール命令は、専用のプロセッサ命令の一例であり、図２６Ｃを用いて後で説明する。
【０３７０】
図２６Ｂは、本発明の実施の形態の変形例に係るサブルーチン呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。なお、図２６Ｂは、図５Ｂに示すフローチャートに相当し、サブルーチン呼び出しがプロセッサ切り替え点として決定されていない場合の例を示す。
【０３７１】
サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納する（Ｓ１００）。そして、プロセッサは、サブルーチンからの復帰先として、サブルーチン呼び出し部分の直後のプログラムアドレスそのものでなく、図４Ａ及び図４Ｂで説明したプログラムアドレスリストの識別子を、戻り点ＩＤとして格納する（Ｓ１１１）。
【０３７２】
そして、プロセッサは、通常サブルーチンコール命令を実行することでサブルーチンに分岐する（Ｓ１０２１）。通常サブルーチンコール命令は、従来から利用される一般的なサブルーチンコールであり、プロセッサは、サブルーチンの分岐先アドレスに分岐する。
【０３７３】
図２６Ｃは、本発明の実施の形態の変形例に係る特殊サブルーチンコール命令の一例を示すフローチャートである。
【０３７４】
プロセッサは、特殊サブルーチンコール命令を実行すると、まず、プロセッサ切り替え要求が発行されているか否かを判定する（Ｓ１１０１）。プロセッサ切り替え要求が発行されている場合（Ｓ１１０１でＹｅｓ）、プロセッサは、プロセッサ切り替えシステムコールを発行する（Ｓ１１０２）。ここでのシステムコールは、例えば、プロセッサの切り替え処理を起動するためのシステムコールであり、切り替え要求の判定処理などを含んでいない。
【０３７５】
プロセッサ切り替え要求が発行されていない場合（Ｓ１１０１でＮｏ）、サブルーチンにそのまま分岐する（Ｓ１１０３）。つまり、ここでは、サブルーチンＩＤを入力としたシステムコールを行っていないので、分岐先アドレスをそのまま利用することができる。
【０３７６】
このように、切り替えプログラムが専用のプロセッサ命令であるので、プロセッサ命令の実行によって、切り替えプログラムを実行することができる。これにより、専用のプロセッサ命令を利用することで、システムコールを呼び出すプログラムを挿入する場合に比べて、プロセッサの切り替え要求がない場合における切り替え判定のオーバーヘッドを軽減することができる。
【０３７７】
また、切り替え可能プログラム生成部３０２及び３１２は、さらに、切り替え点を含む所定の期間を、プロセッサの切り替え要求を受け付けることができる割り込み許可期間として設定してもよい。さらに、切り替え可能プログラム生成部３０２及び３１２は、割り込み許可期間以外の期間を、切り替え要求を受け付けない割り込み禁止期間として設定してもよい。具体的な例について、図２７Ａ及び図２７Ｂを用いて説明する。
【０３７８】
図２７Ａは、本発明の実施の形態の変形例に係る割り込み許可区間及び禁止区間の一例を示す図である。図２７Ｂは、本発明の実施の形態の変形例に係る割り込み禁止区間の一例を示す図である。
【０３７９】
図２７Ａに示すように、切り替え可能プログラム生成部３０２及び３１２は、サブルーチンの境界、すなわち、サブルーチン処理の前後に割り込み許可区間を設定するように、切り替え可能プログラムを生成する。切り替え可能プログラムを実行中のプロセッサは、システムコントローラ１３０からプロセッサの切り替え要求を受け取った場合、割り込み許可区間になった場合に、割り込みルーチンによりプロセッサ切り替えシステムコールを実行する。すなわち、プロセッサは、割り込み禁止区間で切り替え要求を受け取った場合、実行中の切り替え可能プログラムを継続して実行し、割り込み許可区間になってからシステムコールを実行する。
【０３８０】
また、サブルーチンの境界を切り替え点として決定されない場合は、図２７Ｂに示すように、サブルーチンの呼び出しからサブルーチンからの復帰までの期間を全て、割り込み禁止区間とすればよい。
【０３８１】
なお、割り込み許可区間は、サブルーチンの境界に限らない。すなわち、プロセッサの切り替え処理を実行可能な箇所に任意に割り込み許可区間を設定することができる。
【０３８２】
また、上記に示す割り込み禁止及び許可は、プロセッサの切り替え処理の割り込みのみを対象としてもよい。あるいは、全ての割り込み処理を対象としてもよい。
【０３８３】
このように、割り込み許可期間を設けることで、プロセッサの切り替えを行うことができる期間を明確にすることができ、意図しない位置での切り替えを防止することができる。
【０３８４】
また、上記の実施の形態に係るプロセッサ装置が、互いに命令セットの異なる複数のプロセッサ（すなわち、異種プロセッサ）を備える例について示したが、命令セットが共通のプロセッサ（すなわち、同種プロセッサ）を備えていてもよい。例えば、複数の同種プロセッサのそれぞれに対して、異なるコンパイラ（プログラム生成装置）が機械語プログラムを生成する場合に、本発明を適用することができる。これにより、タスクの実行中であってもプロセッサ間の切り替えを可能にし、システムの状況及びユースケースの変更に対応することができる。
【０３８５】
また、上記の実施の形態に係るプログラム生成装置が、互いに異なる複数のコンパイラを備える例について示したが、プログラム生成装置は、１つのみのコンパイラを備えていてもよい。この場合、当該１つのコンパイラは、プロセッサＡ用の機械語プログラムとプロセッサＢ用の機械語プログラムとの２種類の機械語プログラムを生成する。
【０３８６】
また、複数のプロセッサ間で、レジスタを共通化してもよい。つまり、切り替え可能プログラム生成部は、切り替え点で、現在プログラムを実行中の第１プロセッサが備えるレジスタに格納されているデータを、第２プロセッサが備えるレジスタに引き継ぐためのプログラムを生成してもよい。
【０３８７】
具体的には、切り替え元である第１プロセッサが備えるレジスタの値を読み出し、切り替え先の第２プロセッサが備えるレジスタに格納する。例えば、レジスタからの読み出しは、図７ＡのステップＳ５０１で実行され、及び、レジスタへの書き込みは、図７ＢにおけるステップＳ５１２で実行される。なお、第１プロセッサと第２プロセッサとでレジスタ本数などが同じであることが好ましい。
【０３８８】
また、上記の実施の形態では、２つのプロセッサ間での切り替えについて説明したが、３つ以上のプロセッサ間での切り替えを行ってもよい。
【０３８９】
また、本実施の形態に係るプログラム生成装置は、切り替え可能プログラムを生成する際に、個々のプロセッサ用のプログラムを共通のルールで作成するのに共通する最小公倍数的なルールに基づいて、それぞれに独立にプログラムを生成してもよい。あるいは、プログラム生成装置は、まず、一方のプログラムを生成し、生成したプログラムに他方のプログラムを合わせ込む方法を用いてもよい。
【０３９０】
また、上記実施の形態に係るプログラム生成装置又はプロセッサ装置に含まれる各処理部は、典型的には集積回路であるＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ）として実現される。これらは個別に１チップ化されてもよいし、一部又は全てを含むように１チップ化されてもよい。
【０３９１】
ここでは、ＬＳＩとしたが、集積度の違いにより、ＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）、システムＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。
【０３９２】
また、集積回路化はＬＳＩに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。ＬＳＩ製造後にプログラムすることが可能なＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）、又はＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブルプロセッサを利用してもよい。
【０３９３】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて各処理部の集積化を行ってもよい。バイオ技術の適用等が可能性として考えられる。
【０３９４】
また、本発明の実施の形態に係る、プログラム生成装置又はプロセッサ装置の機能の一部又は全てを、ＣＰＵ等のプロセッサがプログラムを実行することにより実現してもよい。
【０３９５】
さらに、本発明は上記プログラムであってもよいし、上記プログラムが記録された記録媒体であってもよい。また、上記プログラムは、インターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
【０３９６】
また、上記で用いた数字は、全て本発明を具体的に説明するために例示するものであり、本発明は例示された数字に制限されない。また、構成要素間の接続関係は、本発明を具体的に説明するために例示するものであり、本発明の機能を実現する接続関係はこれに限定されない。
【０３９７】
さらに、上記の実施の形態は、ハードウェア及び／又はソフトウェアを用いて構成されるが、ハードウェアを用いる構成は、ソフトウェアを用いても構成可能であり、ソフトウェアを用いる構成は、ハードウェアを用いても構成可能である。
【０３９８】
また、上記のプログラム生成装置、プロセッサ装置及びマルチプロセッサシステムの構成は、本発明を具体的に説明するために例示するためのものであり、本発明に係るプログラム生成装置、プロセッサ装置及びマルチプロセッサシステムは、上記構成の全てを必ずしも備える必要はない。言い換えると、本発明に係るプログラム生成装置、プロセッサ装置及びマルチプロセッサシステムは、本発明の効果を実現できる最小限の構成のみを備えればよい。
【０３９９】
同様に、上記のプログラム生成装置によるプログラム生成方法は、本発明を具体的に説明するために例示するためのものであり、本発明に係るプログラム生成装置によるプログラム生成方法は、上記ステップの全てを必ずしも含む必要はない。言い換えると、本発明に係るプログラム生成方法は、本発明の効果を実現できる最小限のステップのみを含めばよい。また、上記のステップが実行される順序は、本発明を具体的に説明するために例示するためのものであり、上記以外の順序であってもよい。また、上記ステップの一部が、他のステップと同時（並列）に実行されてもよい。
【産業上の利用可能性】
【０４００】
本発明は、タスクの実行中であってもプロセッサ間の切り替えを可能にし、システムの状況及びユースケースの変更に対応することができるという効果を奏し、例えば、コンパイラ、プロセッサ、計算機システム、家電機器などに利用することができる。
【符号の説明】
【０４０１】
１０  マルチプロセッサシステム
２０  プログラム生成装置
３０  プロセッサＡ用プログラムメモリ
３１  プロセッサＢ用プログラムメモリ
４０  プロセッサ装置
５０  データメモリ
１００  プロセッサＡ用コンパイラ
１０１  プロセッサＢ用コンパイラ
１１０  切り替え可能プログラム生成指示部
１２０  プロセッサＡ
１２１  プロセッサＢ
１３０  システムコントローラ
１３１  プロセッサ切り替え制御部
１４０  作業領域
１４１  入力データ領域
１４２  出力データ領域
２００  ソースプログラム
２１０  プロセッサＡ用機械語プログラム
２１１  プロセッサＢ用機械語プログラム
２２０  プロセッサＡ用切り替えプログラム
２２１  プロセッサＢ用切り替えプログラム
３００、３１０  切り替え可能プログラム生成有効化部
３０１、３１１  切り替え点決定部
３０２、３１２  切り替え可能プログラム生成部
３０３、３１３  切り替え判断処理挿入部
４００、４０１、４０２  スタック領域
４１０、４１１、４１２  レジスタ
４２０、４２１、４２２  広域データ領域
４３０、４３１、４３２  出力データ領域
５０１、５０２、５０３、５０４、５０５、５０６、７０１、７０２、７０３、７０４、９０１、９０２  ソースコード
６０１、６０２、６０３、６０４、６０５、６０６、６１１、６１２、６１３、６１４、６１５、６１６、６２４、６２６、８０１、８０２、８０３、８０４、８１１、８１２、８１３、８１４、８２１、８２２、８２３、８２４、８２５、８２６、８２７、８２８、８２９  機械語コード
【図１】
2012105174.tif 000003
【図２】
2012105174.tif 000004
【図３Ａ】
2012105174.tif 000005
【図３Ｂ】
2012105174.tif 000006
【図３Ｃ】
2012105174.tif 000007
【図４Ａ】
2012105174.tif 000008
【図４Ｂ】
2012105174.tif 000009
【図５Ａ】
2012105174.tif 000010
【図５Ｂ】
2012105174.tif 000011
【図５Ｃ】
2012105174.tif 000012
【図６Ａ】
2012105174.tif 000013
【図６Ｂ】
2012105174.tif 000014
【図６Ｃ】
2012105174.tif 000015
【図７Ａ】
2012105174.tif 000016
【図７Ｂ】
2012105174.tif 000017
【図８Ａ】
2012105174.tif 000018
【図８Ｂ】
2012105174.tif 000019
【図９】
2012105174.tif 000020
【図１０】
2012105174.tif 000021
【図１１】
2012105174.tif 000022
【図１２】
2012105174.tif 000023
【図１３】
2012105174.tif 000024
【図１４Ａ】
2012105174.tif 000025
【図１４Ｂ】
2012105174.tif 000026
【図１４Ｃ】
2012105174.tif 000027
【図１５】
2012105174.tif 000028
【図１６】
2012105174.tif 000029
【図１７Ａ】
2012105174.tif 000030
【図１７Ｂ】
2012105174.tif 000031
【図１８】
2012105174.tif 000032
【図１９】
2012105174.tif 000033
【図２０】
2012105174.tif 000034
【図２１Ａ】
2012105174.tif 000035
【図２１Ｂ】
2012105174.tif 000036
【図２２Ａ】
2012105174.tif 000037
【図２２Ｂ】
2012105174.tif 000038
【図２３Ａ】
2012105174.tif 000039
【図２３Ｂ】
2012105174.tif 000040
【図２４】
2012105174.tif 000041
【図２５Ａ】
2012105174.tif 000042
【図２５Ｂ】
2012105174.tif 000043
【図２５Ｃ】
2012105174.tif 000044
【図２５Ｄ】
2012105174.tif 000045
【図２６Ａ】
2012105174.tif 000046
【図２６Ｂ】
2012105174.tif 000047
【図２６Ｃ】
2012105174.tif 000048
【図２７Ａ】
2012105174.tif 000049
【図２７Ｂ】
2012105174.tif 000050
【国際調査報告】
2012105174.tif 000051
2012105174.tif 000052
2012105174.tif 000053
2012105174.tif 000054