以下、本発明の実施の形態に係るプログラム生成装置(コンパイラ)、プロセッサ装置及びプロセッサシステムについて、図面を用いて詳細に説明する。なお、以下で説明する実施の形態は、いずれも本発明の好ましい一具体例を示すものである。以下の実施の形態で示される数値、構成要素、構成要素の配置位置及び接続形態、ステップ、ステップの順序などは、一例であり、本発明を限定する主旨ではない。本発明は、請求の範囲だけによって限定される。よって、以下の実施の形態における構成要素のうち、本発明の最上位概念を示す独立請求項に記載されていない構成要素については、本発明の課題を達成するのに必ずしも必要ではないが、より好ましい形態を構成するものとして説明される。
本発明の実施の形態に係るプログラム生成装置は、互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサのそれぞれに対応する機械語プログラムを、同一のソースプログラムから生成する。本発明の実施の形態に係るプログラム生成装置は、ソースプログラム中の所定の位置を切り替え点として決定する切り替え点決定部と、切り替え点においてメモリのデータ構造が複数のプロセッサ間で一致するように、ソースプログラムから、機械語プログラムである切り替え可能プログラムをプロセッサ毎に生成するプログラム生成部と、切り替えプログラムを切り替え可能プログラムに挿入する挿入部とを備えることを特徴とする。
ここで、切り替えプログラムは、第1プロセッサが実行中の、当該第1プロセッサに対応する切り替え可能プログラムを切り替え点で停止させ、かつ、第2プロセッサに対応する切り替え可能プログラムを切り替え点から継続して第2プロセッサに実行させるためのプログラムである。
また、切り替え可能プログラムは、互いに異なる命令セットを有し、かつ、メモリを共有する複数のプロセッサの1つで実行される、ソースプログラムから生成された機械語プログラムである。切り替え可能プログラムは、ソースプログラム中の所定の位置である切り替え点においてメモリのデータ構造を複数のプロセッサ間で一致させる機能と、切り替え点で当該切り替え可能プログラムを停止するとともに、複数のプロセッサの1つである他のプロセッサに、当該他のプロセッサに対応し、ソースプログラムから生成された機械語プログラムを切り替え点から継続して実行させるための切り替えプログラムを実行する機能とを含んでいる。
要するに、本発明の実施の形態に係るプログラム生成装置(コンパイラ)は、C言語などの高級言語で記述されたソースプログラムを、互いに異なる命令セットを有する複数のプロセッサで実行可能なプログラムであって、複数のプロセッサそれぞれに対応する機械語プログラムに翻訳するクロスコンパイラである。これにより、処理途中の特定位置で処理を中断して、他のプロセッサで処理を再開させても、処理の一貫性が保つことができる。
また、本発明の実施の形態に係るプロセッサ装置は、上記の複数のプロセッサと、当該複数のプロセッサ間の切り替えを制御する制御部とを備えることを特徴とする。要するに、複数のプロセッサの1つである第1プロセッサは、制御部によって切り替えを要求された場合に、上記の切り替えプログラムを実行する。
図1は、本発明の実施の形態に係るクロスコンパイル環境を実現するマルチプロセッサシステム10の構成の一例を示すブロック図である。図1に示すように、マルチプロセッサシステム10は、プログラム生成装置20と、プロセッサA用プログラムメモリ30と、プロセッサB用プログラムメモリ31と、プロセッサ装置40と、データメモリ50とを備える。
プログラム生成装置20は、複数のプロセッサのそれぞれに対応する機械語プログラムを同一のソースプログラム200から生成する。ソースプログラム200は、高級言語で記述されたソースプログラム(ソースコード)である。高級言語は、C言語、Java(登録商標)、Perl及びFORTRANなどのプログラム言語である。機械語プログラムは、各プロセッサが理解し、実行可能なプログラム言語であり、例えば、2値の電気信号の集まりである。
図1に示すように、プログラム生成装置20は、プロセッサA用コンパイラ100と、プロセッサB用コンパイラ101と、切り替え可能プログラム生成指示部110とを備える。
プロセッサA用コンパイラ100は、ソースプログラム200を変換することで、プロセッサ装置40が備えるプロセッサA120に対応する機械語プログラムを生成する。プロセッサA用コンパイラ100は、切り替え可能プログラム生成指示部110からの指示を受けて、機械語プログラムの生成方法を切り替える。
具体的には、プロセッサA用コンパイラ100は、切り替え可能プログラム生成指示部110から切り替え可能プログラムの生成指示を受けた場合、ソースプログラム200中の所定の位置である切り替え点においてデータメモリ50のデータ構造が複数のプロセッサ間で一致するように、プロセッサA120に対応する切り替え可能プログラムAを生成する。言い換えると、プロセッサA用コンパイラ100は、複数のプロセッサ間での共通ルールに従ってソースプログラム200を変換することで、切り替え可能プログラムAを生成する。生成された切り替え可能プログラムAは、プロセッサA用機械語プログラム210として、プロセッサA用プログラムメモリ30に格納される。
また、プロセッサA用コンパイラ100は、切り替え可能プログラム生成指示部110から切り替え可能プログラムの生成指示を受けなかった場合、プロセッサA120の独自のルールに従ってソースプログラム200を変換することで、プロセッサA120に対応する専用機械語プログラムAを生成する。生成された専用機械語プログラムAは、プロセッサA用機械語プログラム210として、プロセッサA用プログラムメモリ30に格納される。
プロセッサB用コンパイラ101は、ソースプログラム200を変換することで、プロセッサ装置40が備えるプロセッサB121に対応する機械語プログラムを生成する。プロセッサB用コンパイラ101は、切り替え可能プログラム生成指示部110からの指示を受けて、機械語プログラムの生成方法を切り替える。
具体的には、プロセッサB用コンパイラ101は、切り替え可能プログラム生成指示部110から切り替え可能プログラムの生成指示を受けた場合、切り替え点においてデータメモリ50のデータ構造が複数のプロセッサ間で一致するように、プロセッサB121に対応する切り替え可能プログラムBを生成する。言い換えると、プロセッサB用コンパイラ101は、複数のプロセッサ間での共通ルールに従ってソースプログラム200を変換することで、切り替え可能プログラムBを生成する。生成された切り替え可能プログラムBは、プロセッサB用機械語プログラム211として、プロセッサB用プログラムメモリ31に格納される。
また、プロセッサB用コンパイラ101は、切り替え可能プログラム生成指示部110から切り替え可能プログラムの生成指示を受けなかった場合、プロセッサB121の独自のルールに従ってソースプログラム200を変換することで、プロセッサB121に対応する専用機械語プログラムBを生成する。生成された専用機械語プログラムBは、プロセッサB用機械語プログラム211として、プロセッサB用プログラムメモリ31に格納される。
切り替え可能プログラム生成指示部110は、指示部の一例であって、プロセッサA用コンパイラ100及びプロセッサB用コンパイラ101に、切り替え可能プログラムの生成を指示する。具体的には、切り替え可能プログラム生成指示部110は、ソースプログラム200に応じて、切り替え可能プログラムの生成を指示するか否かを判定する。
例えば、ソースプログラム200が特定のプロセッサでのみ実行可能なプログラムではない場合に、切り替え可能プログラム生成指示部110は、切り替え可能プログラムの生成を指示する。すなわち、ソースプログラム200がどのプロセッサでも実行可能なプログラムである場合に、切り替え可能プログラム生成指示部110は、切り替え可能プログラムの生成を指示する。
なお、プログラム生成装置20は、切り替え可能プログラム生成指示部110を備えることで、選択的に切り替え可能プログラムを生成することができる。例えば、ソースプログラム200が特定のプロセッサのみでしか実行できない場合などは、切り替え可能プログラムを生成する必要がない。このような場合に、切り替え可能プログラムの生成を指示しないことで、プログラム生成に係る処理量を削減することができる。
なお、プログラム生成装置20の詳細な構成については、図2を用いて後で説明する。
プロセッサA用プログラムメモリ30は、プロセッサA用コンパイラ100によって生成されたプロセッサA用機械語プログラム210を記憶するためのメモリである。具体的には、プロセッサA用プログラムメモリ30には、切り替え可能プログラムA又は専用機械語プログラムAが格納される。また、プロセッサA用プログラムメモリ30は、プロセッサA用切り替えプログラム220(以下、システムコール)を記憶している。
プロセッサB用プログラムメモリ31は、プロセッサB用コンパイラ101によって生成されたプロセッサB用機械語プログラム211を記憶するためのメモリである。具体的には、プロセッサB用プログラムメモリ31には、切り替え可能プログラムB又は専用機械語プログラムBが格納される。また、プロセッサB用プログラムメモリ31は、プロセッサB用切り替えプログラム221(以下、システムコール)を記憶している。
プロセッサA用切り替えプログラム220及びプロセッサB用切り替えプログラム221は、本発明に係る切り替えプログラムの一例であり、OS(Operation System)によって実行される。切り替えプログラムは、第1プロセッサが実行中の、当該第1プロセッサに対応する切り替え可能プログラムを切り替え点で停止させ、かつ、第2プロセッサに対応する切り替え可能プログラムを当該切り替え点から継続して第2プロセッサに実行させるためのプログラムである。
なお、第1プロセッサ及び第2プロセッサはそれぞれ、プロセッサ装置40が備える複数のプロセッサの1つである。第1プロセッサは、切り替え元のプロセッサであり、第2プロセッサは、第1プロセッサとは異なるプロセッサであって、切り替え先のプロセッサである。
具体的には、切り替えプログラムは、プロセッサ切り替え要求の検出と、切り替え点における第1プロセッサが実行中の処理の中断、及び、第2プロセッサでの切り替え点からの処理の再開とを各プロセッサに行わせるためのプログラムである。例えば、プロセッサA120からプロセッサB121に切り替える場合、プロセッサA用切り替えプログラム220がOSによって実行され、プロセッサB121からプロセッサA120に切り替える場合、プロセッサB用切り替えプログラム221がOSによって実行される。
プロセッサ装置40は、互いに異なる命令セットを有し、メモリを共有する複数のプロセッサを備え、同一のソースプログラムから生成された複数の機械語プログラムの少なくとも1つを、複数のプロセッサのうち対応するプロセッサで実行する。図1に示すように、本実施の形態に係るプロセッサ装置40は、プロセッサA120と、プロセッサB121と、システムコントローラ130とを備える。
プロセッサA120は、プロセッサ装置40が備える複数のプロセッサの1つであり、プロセッサB121が有する命令セットとは異なる命令セットを有する。また、プロセッサA120は、プロセッサB121との間でデータメモリ50を共有している。また、プロセッサA120は、少なくとも1つのレジスタを有し、当該レジスタ及びデータメモリ50を利用して、プロセッサA用プログラムメモリ30に記憶されているプロセッサA用機械語プログラム210を実行する。
プロセッサB121は、プロセッサ装置40が備える複数のプロセッサの1つであり、プロセッサA120が有する命令セットとは異なる命令セットを有する。また、プロセッサB121は、プロセッサA120との間でデータメモリ50を共有している。また、プロセッサB121は、少なくとも1つのレジスタを有し、当該レジスタ及びデータメモリ50を利用して、プロセッサB用プログラムメモリ31に記憶されているプロセッサB用機械語プログラム211を実行する。
システムコントローラ130は、プロセッサ装置40が備える複数のプロセッサを制御する。図1に示すように、システムコントローラ130は、プロセッサ切り替え制御部131を備える。
プロセッサ切り替え制御部131は、複数のプロセッサ間の切り替えを要求する。すなわち、プロセッサ切り替え制御部131は、プロセッサ切り替え時の全体シーケンスを制御する。例えば、プロセッサ切り替え制御部131は、マルチプロセッサシステム10の状態の変化を検出し、プロセッサの切り替えを行うべきか否かを判定する。
具体的には、プロセッサ切り替え制御部131は、省電力化などの観点からプロセッサの切り替えの要否を判定し、切り替えが必要であると判定した場合、プロセッサの切り替えをプロセッサ装置40に要求する。例えば、プロセッサ切り替え制御部131は、プロセッサを切り替えることで電力効率が高まる場合に、プロセッサの切り替えが必要であると判定する。あるいは、プロセッサ切り替え制御部131は、現在プログラムを実行中のプロセッサに優先的に他のプログラムを実行させる必要が発生した場合に、プロセッサの切り替えが必要であると判定してもよい。
データメモリ50は、プロセッサ装置40が備える複数のプロセッサによって共有されるメモリである。例えば、図1に示すように、データメモリ50は、作業領域140と、入力データ領域141と、出力データ領域142とを含んでいる。
作業領域140は、後述するように、スタック領域と、広域データ領域とを含んでいる。スタック領域は、後入れ先出し(LIFO:Last In First Out)方式でデータを保持するメモリ領域である。広域データ領域は、プログラムを実行中に、サブルーチンを跨いで参照されるデータ、すなわち、ソースプログラム中で広域定義されるデータ(広域データ)を保持するメモリ領域である。
入力データ領域141は、入力データを保持するメモリ領域である。出力データ領域142は、出力データを保持するメモリ領域である。
なお、本実施の形態では、プロセッサ装置40は、2つのプロセッサ(プロセッサA120及びプロセッサB121)を備えるが、3つ以上のプロセッサを備えていてもよい。また、プロセッサ装置40は、命令セットが共通のプロセッサを備えていてもよい。言い換えると、プロセッサA120及びプロセッサB121は、命令セットが同種であり、同じ機械語プログラムを実行可能であってもよい。
続いて、本発明の実施の形態に係るプログラム生成装置20の詳細な構成について説明する。図2は、本発明の実施の形態に係るプログラム生成装置20(コンパイラ)の詳細な構成の一例を示すブロック図である。
図2に示すように、プロセッサA用コンパイラ100は、切り替え可能プログラム生成有効化部300と、切り替え点決定部301と、切り替え可能プログラム生成部302と、切り替え判断処理挿入部303とを備える。プロセッサB用コンパイラ101は、切り替え可能プログラム生成有効化部310と、切り替え点決定部311と、切り替え可能プログラム生成部312と、切り替え判断処理挿入部313とを備える。
切り替え可能プログラム生成有効化部300は、切り替え可能プログラム生成指示部110から切り替え可能プログラムの生成指示を受けた場合、プロセッサA用コンパイラ100の機械語プログラムの生成モードを制御する。機械語プログラムの生成モードには、切り替え可能プログラムAを生成するモード、及び、専用機械語プログラムAを生成するモードが含まれる。
具体的には、切り替え可能プログラム生成有効化部300は、切り替え可能プログラムの生成指示を受けた場合、切り替え可能プログラムAを生成するモードを選択する。また、切り替え可能プログラム生成有効化部300は、切り替え可能プログラムの生成を受けていない場合、専用機械語プログラムAを生成するモードを選択する。選択結果は、切り替え点決定部301、切り替え可能プログラム生成部302及び切り替え判断処理挿入部303に出力される。
切り替え点決定部301は、切り替え可能プログラムAを生成するモードが選択された場合は、ソースプログラム200中の所定の位置をプロセッサ切り替え点(以下、単に切り替え点と記載する場合もある)として決定する。すなわち、切り替え点決定部301は、切り替え可能プログラム生成指示部110が切り替え可能プログラムの生成を指示した場合に、切り替え点を決定する。
また、切り替え点決定部301は、切り替え可能プログラム生成指示部110が切り替え可能プログラムの生成を指示しない場合、切り替え点を決定しない。つまり、この場合、切り替え点決定部301は、切り替え可能プログラム生成有効化部300によって無効化される。言い換えると、切り替え点決定部301は、切り替え可能プログラムの生成が指示された場合のみに、切り替え点を決定する。
例えば、切り替え点決定部301は、ソースプログラムの基本ブロックの境界の少なくとも一部を、切り替え点として決定する。基本ブロックは、例えば、ソースプログラムのサブルーチンである。この場合、切り替え点決定部301は、サブルーチンの境界の少なくとも一部を、切り替え点として決定する。具体的には、切り替え点決定部301は、サブルーチンの境界であるサブルーチンの呼び出し元の呼び出し部分を、切り替え点として決定する。あるいは、切り替え点決定部301は、サブルーチンの境界であるサブルーチンの呼び出し先の先頭及び終端の少なくとも一方を、切り替え点として決定してもよい。
切り替え可能プログラム生成部302は、切り替え点においてデータメモリ50のデータ構造が複数のプロセッサ間で一致するように、ソースプログラム200から、プロセッサA120に対応する機械語プログラムである切り替え可能プログラムAを生成する。すなわち、切り替え可能プログラム生成部302は、切り替え点における自プロセッサが対応する機械語プログラムを実行した場合と、他のプロセッサが対応する機械語プログラムを実行した場合とのデータメモリ状態の一貫性が保たれるように、プログラム生成を制御する。
例えば、切り替え可能プログラム生成部302は、データメモリ50のスタック領域のデータ構造が複数のプロセッサ間で一致するように、切り替え可能プログラムAを生成する。具体的には、切り替え可能プログラム生成部302は、データメモリ50のスタック領域に格納されるデータのデータサイズ及び配置が複数のプロセッサ間で一致するように、切り替え可能プログラムAを生成する。このとき、切り替え可能プログラム生成部302は、サブルーチンが利用する引数及び作業データを、プロセッサが有するレジスタではなく、データメモリ50のスタック領域に格納するように、切り替え可能プログラムAを生成する。
さらに、切り替え可能プログラム生成部302は、データメモリ50の広域データ領域のデータ構造が複数のプロセッサ間で一致するように、切り替え可能プログラムAを生成する。また、切り替え可能プログラム生成部302は、引数、作業データ及び広域データなどを格納するためにデータメモリ50内に確保する領域のデータサイズ及び配置が複数のプロセッサ間で一致するように、切り替え可能プログラムAを生成する。
具体的には、切り替え可能プログラム生成部302は、複数のプロセッサ間での一致を実現するために、複数のプロセッサ間での共通ルールに従って、切り替え可能プログラムAを生成する。共通ルールは、例えば、複数のプロセッサそれぞれの制約を最大公約数的に満たすルールである。より具体的な例については、図3A〜図3Cを用いて後で説明する。
なお、切り替え可能プログラム生成部302は、切り替え可能プログラム生成指示部110が切り替え可能プログラムの生成を指示しない場合、切り替え可能プログラムを生成しない。つまり、この場合、切り替え可能プログラム生成部302は、ソースプログラム200から、複数のプロセッサのうちプロセッサA120のみで実行可能なプログラム(専用機械語プログラムA)を生成する。言い換えると、切り替え点決定部301は、切り替え可能プログラムの生成が指示された場合のみに、切り替え可能プログラムを生成する。
切り替え判断処理挿入部303は、プロセッサA用切り替えプログラムを、切り替え可能プログラムAに挿入する。具体的には、切り替え判断処理挿入部303は、切り替え処理を行うシステムコールであるプロセッサA用切り替えプログラム220を呼び出すプログラムを、切り替え可能プログラムAに挿入する。
また、切り替え判断処理挿入部303は、切り替え可能プログラム生成指示部110が切り替え可能プログラムの生成を指示しない場合、切り替えプログラムを挿入しない。つまり、この場合、切り替え判断処理挿入部303は、切り替え可能プログラム生成有効化部300によって無効化される。言い換えると、切り替え判断処理挿入部303は、切り替え可能プログラムの生成が指示された場合のみに、切り替えプログラムを挿入する。
なお、プロセッサB用コンパイラ101が備える処理部は、プロセッサA用コンパイラ100が備える処理部と同じである。すなわち、切り替え可能プログラム生成有効化部310と、切り替え点決定部311と、切り替え可能プログラム生成部312と、切り替え判断処理挿入部313とはそれぞれ、上述した切り替え可能プログラム生成有効化部300と、切り替え点決定部301と、切り替え可能プログラム生成部302と、切り替え判断処理挿入部303とに相当する。したがって、ここでは説明を省略する。
以下、本実施の形態では、プロセッサ切り替え点の一例として、サブルーチンの境界を用いる例を説明する。
例えば、本実施の形態では、サブルーチンの呼び出し時、及び、サブルーチンから戻る点をプロセッサ切り替え点とする。これは、サブルーチンのスタック状態がソースプログラム上明確であり、複数のプロセッサ間での一致を取りやすいという効果を奏するためである。
図3A〜図3Cは、本発明の実施の形態に係るスタック領域、広域データ領域及び出力データ領域のデータ構造と、レジスタ構成との一例を示す図である。
具体的には、図3Aは、所定のサブルーチンに対応するプロセッサA専用機械語プログラムを実行する際にプロセッサA120が使用するメモリ資源の一例を示す図である。図3Bは、所定のサブルーチンに対応するプロセッサB専用機械語プログラムを実行する際にプロセッサB121が使用するメモリ資源の一例を示す図である。図3Cは、所定のサブルーチンに対応する切り替え可能プログラムを実行する際に各プロセッサが使用するメモリ資源の一例を示す図である。
図3A〜図3Cに示すように、メモリ資源は、スタック領域400、401又は402と、レジスタ410、411又は412と、広域データ領域420、421又は422と、出力データ領域430、431又は432とを含んでいる。スタック領域400、401又は402と、広域データ領域420、421又は422と、出力データ領域430、431又は432とは、データメモリ50のメモリ領域である。
レジスタ410は、プロセッサA120が備えるレジスタのうち、プロセッサA120が、上記の所定のサブルーチンをプロセッサA専用機械語プログラムに従って実行する際に利用するレジスタである。レジスタ411は、プロセッサB121が備えるレジスタのうち、プロセッサB121が、上記の所定のサブルーチンをプロセッサB専用機械語プログラムに従って実行する際に利用するレジスタである。レジスタ412は、プロセッサA120又はプロセッサB121が、上記の所定のサブルーチンを切り替え可能プログラムに従って実行する際に利用するレジスタである。
一般にコンパイラは、対応するプロセッサのハードウェアレジスタの本数、及び、メモリアクセスの制限の違いにより、スタック及びレジスタの使用方法が異なる機械語プログラムを生成する。
例えば、本サブルーチンの引数arg1が、ソースプログラムでは1バイトのデータとして定義されている場合を想定する。このとき、図3Aに示す例では、プロセッサA120のデータアクセスが2バイト単位でないと行えないという制限があることから、スタック領域400ではarg1用に2バイトの領域(#0000と#0001)を確保している。これに対し、プロセッサB121は、1バイトアクセスが可能であるため、メモリの利用効率の観点から、スタック領域400ではarg1用に1バイトの領域(#0000)のみを確保する。
ここで、仮にこのサブルーチンの最初若しくは途中で処理が中断されたとすると、そのスタックメモリをそのまま他のプロセッサが利用しても、データ配置が異なるために、正常に処理を継続することができない。例えば、プロセッサB121からプロセッサA120に切り替えた場合、プロセッサA120では、スタック領域401の“戻りアドレス”へのアクセスができなくなり、正常に動作を継続できないという課題がある。
これに対して、図3Cに示すように、本発明の実施の形態に係る切り替え可能プログラムでは、プロセッサA120が2バイト単位でしかアクセスできないという条件に基づいて、スタック領域402に引数arg1を2バイトの領域(#0000と#0001)で確保している。つまり、切り替え可能プログラム生成部302及び312は、各プロセッサからのアクセス単位のデータサイズの最小公倍数を満たす領域を1つのデータに対して確保するように、スタック領域402のデータ構造を決定する。これにより、1バイト単位でアクセス可能なプロセッサB121はもちろん、プロセッサA120もスタック領域402のデータの読み出し及び書き込みを正しく行うことができる。
すなわち、切り替え可能プログラム生成部302及び312は、プロセッサA120及びプロセッサB121のデータメモリ50へのアクセス条件の最大公約数的な条件を満たすように、スタック領域402のデータ構造を決定する。そして、切り替え可能プログラム生成部302及び312は、切り替え点において、決定したデータ構造が構成されるように、各プロセッサに対応する切り替え可能プログラムを生成する。
つまり、切り替え可能プログラム生成部302は、スタック領域の状態が一致しない問題に対し、複数のプロセッサ間で共通のスタック構造のルールを設定する。そして、プロセッサ切り替え可能プログラムを生成する場合は、共通のルールに従って切り替え可能プログラムを生成することで、プロセッサ間のスタック領域の内容の一貫性を保証することができる。例えば、入力引数arg1のような1バイトデータでは、プロセッサA120が1バイト単位でのアクセスができないことを配慮して、必ず2バイトのメモリ領域を確保する。
また、上記の所定のサブルーチンを実行中の作業データi及びjを保持するための領域は、図3Aに示すように、プロセッサA専用機械語プログラムでは、レジスタ410(REG0とREG1)である。一方で、プロセッサB専用機械語プログラムでは、図3Bに示すように、スタック領域401(#0003〜#0006)に、作業データi及びjが保持される。
これは、プロセッサA120が備えるレジスタ本数(図3Aの例では、4本)と、プロセッサB121が備えるレジスタ本数(図3Bの例では、3本)との違いに起因する違いである。つまり、プロセッサA120がレジスタ本数に余裕があり、性能向上のため、作業データi及びj専用にレジスタを確保していることなどに起因する。この結果、プロセッサA120で実行されているサブルーチンの途中でプロセッサB121に切り替えても、作業データi及びjは、スタック領域401には保持されておらず、プロセッサB121は、処理を継続することはできない。
これに対して、図3Cに示すように、本発明の実施の形態に係る切り替え可能プログラムでは、レジスタ412は全て作業領域として利用される。具体的には、切り替え時の状態の継承性、及び、プロセッサ毎のレジスタの本数の違いを考慮し、入力引数arg1及びarg2は、全てハードウェアレジスタではなくスタック領域402(#0000〜#0003)に格納する。また、作業データi及びjについても同様に、スタック領域402(#0006〜#0009)に格納する。さらに、下位のサブルーチンにアドレスを引き継ぐ必要のあるサブルーチン内のデータは、必ずスタック領域402上の同じ配置に領域を確保する。
なお、ここでは、複数のプロセッサのレジスタ構成にかかわらず、処理できる量を確保するため、ソースプログラム200で定義された全てのデータを格納できるスタック領域402を確保する。この場合、作業領域のスタックは、必ずしも同じ用途で使用する必要はなく、確保する大きさのみ一致すればよい。
また、広域データ領域422についてもスタック領域402と同様に、プロセッサに依存しないよう共通のルールで順番及び配置を決定することで、そのまま他のプロセッサに引き継ぐことができる。例えば、広域データP及びRは、プログラムソースコード上では1バイトで定義している場合を想定する。この場合、図3Aに示すように、プロセッサA専用機械語プログラムでは、プロセッサAが1バイト単位でのアクセスができないために2バイトの領域(#0100と#0101など)を確保し、プロセッサBでは1バイトの領域(#0100など)を確保する。
これに対して、プロセッサ切り替え可能プログラムでは、図3Cに示すように、全て2バイトに統一される。すなわち、広域データP、Q及びRは、データメモリ50の広域データ領域に2バイトの領域がそれぞれ確保される。
なお、出力データ領域についても同様である。また、サブルーチン内で使用するレジスタの使用法については、サブルーチンの開始及び終端でのデータメモリ50の一貫性に影響を与えないため、個々のプロセッサの特性に合わせてそれぞれに異なった最適化を行うことが可能である。
以上により、プロセッサ切り替え時に必要なサブルーチンの開始、終了状態が全てデータメモリ50によって引き継ぐことが可能である。さらに、プロセッサ毎のレジスタ本数の違いに依存しなくなるので、プロセッサ間での切り替えが可能となる。
具体的には、スタックのデータ構造、すなわち、スタックに格納されるデータのサイズ及び配置を切り替え点で一致させているので、切り替え先のプロセッサでは、スタックをそのまま利用することができる。また、広域データのデータ構造を切り替え点で一致させているので、切り替え先のプロセッサでは、広域データをそのまま利用することができる。また、レジスタに格納された値が切り替え点を跨いで保証されない場合であっても、レジスタに格納された値をメモリに退避させているので、プロセッサの切り替えを行うことができる。
図4A及び図4Bは、本発明の実施の形態に係るプログラムアドレスリストの一例を示す図である。図4Aは、プロセッサA120が参照するプログラムアドレスリストを示し、図4Bは、プロセッサB121が参照するプログラムアドレスリストを示している。
切り替え可能プログラム生成部302及び312は、ソースプログラム200中の同一の分岐を示す分岐先アドレスであって、複数のプロセッサ毎の切り替え可能プログラムにおける分岐先アドレスのそれぞれに共通の識別子を付与し、当該識別子と分岐先アドレスとを対応付けたプログラムアドレスリストを生成する。生成したプログラムアドレスリストは、例えば、データメモリ50、又は、各プロセッサが保持する内部メモリなどに記憶される。
具体的には、図4A及び図4Bに示すように、それぞれのプロセッサの機械語プログラムで使用される分岐先のプログラムアドレスが、プログラムアドレスリストとして、管理されている。分岐先のプログラムアドレスは、具体的には、サブルーチンの分岐先、及び、サブルーチンからの戻り点(復帰点)などを示すアドレスである。
前述の通り、異なる命令セットを有するプロセッサのコンパイラ間では、プログラムアドレスを一致させるのは不可能である。このため、本実施の形態では、分岐先アドレスをプログラム全体でリストとして管理し、処理中にプログラムアドレスをデータメモリ50に格納する場合は、アドレスそのものでなく、プロセッサ共通の分岐先アドレス識別子を格納する。そして、分岐時には、各プロセッサは、データメモリ50から分岐先アドレス識別子を読み出し、読み出した分岐先アドレス識別子をもとに、対応するプロセッサのプログラムアドレスリストを参照することでプログラムアドレスを引き出す。
図4A及び図4Bに示すプログラムリストには、複数の識別子のそれぞれに対応するプログラムアドレスが格納されており、それぞれのプロセッサの機械語プログラムに対応する分岐先プログラムアドレスが格納されている。プロセッサ間で対応する分岐先の識別子を一致させることで、プログラムアドレスが格納されるデータメモリもそのまま他のプロセッサで使用できる。
ここで、プログラムアドレスリストのリスト構造、及び、プログラムアドレスリストからのプログラムアドレス導出方法の一例について説明する。
プログラムアドレスリストは、例えば、プログラムアドレスのみがデータ配列としてデータメモリ50に格納される。識別子は、0から始まる番号で表現され、データ配列の何番目に対応するプログラムアドレスがあるかを表す。例えば、プログラムアドレス1件あたりのデータサイズがw(s)バイト(sはプロセッサ番号)であり、データ配列の先頭アドレスをG(s)とすると、識別子がNの分岐先に対応するプログラムアドレスは、データメモリのG(s)+(N×w(s))で表されるアドレスに格納されていることになる。各プロセッサは、このアドレスを読み出すことで、所望のプログラムアドレスを得ることができる。
本実施の形態では、切り替え点決定部301及び311がサブルーチンの境界を切り替え点として決定するので、分岐先アドレスは切り替え点を示すアドレスに相当する。つまり、同一の切り替え点を示すプログラムアドレスには、同一の識別子が付される。
したがって、ある切り替え点でプロセッサA120からプロセッサB121に切り替える場合、切り替え先のプロセッサB121は、図4Bに示すプロセッサB121のプログラムアドレスリストを参照することで、切り替え元のプロセッサA120が実行していたプログラムの切り替え点(分岐先アドレス)を示す識別子と同じ識別子に対応するプログラムアドレスを、データメモリ50から取得する。
このように、複数のプロセッサそれぞれの分岐先アドレスを共通の識別子に対応付けて管理するので、切り替え先のプロセッサは、切り替え元のプロセッサが次に実行する予定であった処理の分岐先アドレスの識別子を取得することで、自プロセッサに対応する分岐先アドレスを取得することができる。したがって、切り替え元のプロセッサが実行していたタスクを、切り替え先のプロセッサが継続して実行することができる。
ここで、本発明の実施の形態に係るプログラム生成装置20が生成する切り替え可能プログラムについて説明する。言い換えると、切り替え可能プログラムはプロセッサ装置40によって実行されるので、ここでは、本発明の実施の形態に係るプロセッサ装置40の動作について説明する。
図5A〜図5Cは、本発明の実施の形態に係るサブルーチンの呼び出し元のプログラムの一例を示す図である。最初に、図5Aを用いて、サブルーチンの呼び出し元の通常のプログラムについて、すなわち、サブルーチンの呼び出し処理(サブルーチンコール)について説明する。
プロセッサは、通常のプログラムを実行することで、まず、サブルーチンの呼び出し元では、入力となる引数をスタックに格納し(S100)、さらに、サブルーチン終了後の戻りアドレス(サブルーチンからの復帰先)として呼び出し部分の直後のプログラムアドレスを、戻りアドレスとして格納する(S110)。そして、プロセッサは、サブルーチンの開始アドレスに分岐して、サブルーチンを開始する(S120)。
これに対して、本実施の形態に係る切り替え可能プログラムのサブルーチンコールでは、プロセッサが切り替えられることを考慮し、アドレスそのものでなく、図4A及び図4Bで示される識別子を格納する。
具体的には、図5Bに示すように、サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納する(S100)。そして、プロセッサは、図5Aとは異なり、サブルーチンからの復帰先として、サブルーチン呼び出し部分の直後のプログラムアドレスそのものでなく、図4A及び図4Bで説明したプログラムアドレスリストの識別子を、戻り点IDとして格納する(S111)。そして、プロセッサは、サブルーチンの開始アドレスに分岐して、サブルーチンを開始する(S120)。
なお、図5Bは、サブルーチン呼び出しがプロセッサ切り替え点ではない場合について示している。本実施の形態では、サブルーチン呼び出しをプロセッサ切り替え点として決定することができる。図5Cは、サブルーチン呼び出しがプロセッサ切り替え点である場合の切り替え可能プログラムの一例を示している。
具体的には、切り替え可能プログラム中で、サブルーチン呼び出しをプロセッサ切り替え点として決定する場合では、サブルーチン呼び出しは、システムコール(S200)を介して行われる。なお、システムコール(S200)は、切り替えプログラムの一例であり、具体的には、図1に示すプロセッサA用切り替えプログラム220又はプロセッサB用切り替えプログラム221などである。
サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納し(S100)、戻り点IDを格納する(S111)。その後、プロセッサは、分岐先サブルーチンのアドレス識別子を入力として、システムコール(S200)を発生させる(S112)。
以下は、システムコール(S200)の処理である。
まず、プロセッサは、システムコントローラ130(具体的には、プロセッサ切り替え制御部131)からのプロセッサ切り替え要求が発行されているかどうかを確認する(S201)。プロセッサ切り替え要求が発行されていれば(S202でYes)、プロセッサは、後述する図7Aのプロセッサ切り替えシーケンスを起動する(S205)。
プロセッサ切り替え要求が発行されていなければ(S202でNo)、プロセッサは、サブルーチンのアドレス識別子からサブルーチンの分岐先プログラムアドレス(サブルーチンアドレス)を導出する(S203)。そして、プロセッサは、サブルーチンアドレスに分岐して、サブルーチンを開始する(S204)。
以上のように、本発明の実施の形態に係る切り替え可能プログラムは、サブルーチンの呼び出し元の呼び出し部分を切り替え点として決定された場合は、当該切り替え点においてシステムコールを発生させるための処理(S112)を含んでいる。これにより、システムコントローラ130からプロセッサの切り替えを要求された場合に、プロセッサ切り替え処理を実行することができる。
図6A〜図6Cは、本発明の実施の形態に係るサブルーチンからの復帰処理のプログラムの一例を示す図である。最初に、図6Aを用いて、サブルーチンからの復帰処理の通常のプログラムについて、すなわち、サブルーチンからの通常の復帰処理について説明する。
プロセッサは、通常のプログラムのサブルーチンの呼び出し先(すなわち、実行中のサブルーチンの終端)では、まず、サブルーチン戻りアドレスをスタックから取得する(S300)。そして、プロセッサは、当該サブルーチンが進めたスタックポインタを戻した後(S310)、サブルーチン戻りアドレスに復帰する(S320)。
これに対して、本発明の実施の形態に係る切り替え可能プログラムでの通常のサブルーチン復帰処理では、図6Bに示すように、まず、プロセッサは、スタックから戻りアドレスでなく、戻りアドレスの識別子(戻り点ID)を取得する(S301)。そして、プロセッサは、当該サブルーチンが進めたスタックポインタを戻す(S310)。
その後、プロセッサは、図4A及び図4Bに示すプログラムアドレスリストを参照することで、戻り点IDをサブルーチン戻りアドレスに変換する(S311)。そして、プロセッサは、サブルーチン戻りアドレスに復帰する(S320)。
なお、図6Bは、サブルーチンからの復帰がプロセッサ切り替え点ではない場合について示している。本実施の形態では、サブルーチンからの復帰をプロセッサ切り替え点として決定することができる。図6Cは、サブルーチンからの復帰がプロセッサ切り替え点である場合の切り替え可能プログラムの一例を示している。
具体的には、切り替え可能プログラム中で、サブルーチンからの復帰をプロセッサ切り替え点として決定する場合では、まず、プロセッサは、スタックから戻り点IDを取得する(S301)。そして、プロセッサは、サブルーチンが進めたスタックポインタを戻した後(S310)、戻り点IDを入力として、システムコール(S400)を発行する(S312)。なお、システムコール(S400)は、切り替えプログラムの一例であり、具体的には、図1に示すプロセッサA用切り替えプログラム220又はプロセッサB用切り替えプログラム221などである。
以下は、システムコール(S400)の処理である。
まず、プロセッサは、システムコントローラ130(具体的には、プロセッサ切り替え制御部131)からのプロセッサ切り替え要求が発行されているかどうかを確認する(S401)。プロセッサ切り替え要求が発行されていれば(S402でYes)、プロセッサは、後述する図7Aのプロセッサ切り替えシーケンスを起動する(S405)。
プロセッサ切り替え要求が発行されていなければ(S402でNo)、プロセッサは、戻り点IDからプログラムアドレス(サブルーチン戻りアドレス)を導出し(S403)、サブルーチン戻りアドレスに復帰する(S404)。
以上のように、本発明の実施の形態に係る切り替え可能プログラムは、サブルーチンの呼び出し先の終端を切り替え点として決定された場合は、当該切り替え点においてシステムコールを発生させるための処理(S312)を含んでいる。これにより、システムコントローラ130からプロセッサの切り替えを要求された場合に、プロセッサ切り替え処理を実行することができる。
上記のように、本実施の形態に係るマルチプロセッサシステム10では、システムコントローラ130からの要求があれば、プロセッサ切り替え処理が行われる。そして、システムコントローラ130からの要求がなければ、サブルーチンの呼び出し又はサブルーチンからの復帰が実行される。
図7Aは、システムコールにおける切り替え元のプロセッサの動作の一例を示すフローチャートである。また、図7Bは、システムコールにおける切り替え先のプロセッサの動作の一例を示すフローチャートである。
切り替え元のプロセッサは、まず、切り替え点でのスタックポインタをシステムコントローラ130に通知する(S501)。さらに、切り替え元のプロセッサは、分岐先プログラムアドレスの識別子(戻り点ID)をシステムコントローラ130に通知する(S502)。
このとき、戻り点IDは、図5B又は図5CのステップS111において、スタックに格納された識別子であり、スタックから読み出される。あるいは、戻り点IDは、図6B又は図6CのS301において、スタックから読み出された識別子である。なお、スタックポインタの通知(S501)と戻り点IDの通知(S502)とは、いずれが先に実行されてもよい。
そして、切り替え元のプロセッサは、処理停止完了をシステムコントローラ130に通知する(S503)。その後、切り替え元のプロセッサは、再度、切り替え元のプロセッサで処理が実行されることを想定し、処理再開待ち状態に移行する(S504)。この際、低電力の観点ではプロセッサを停止させるか休止状態にするのが望ましい。また、切り替え元プロセッサがマルチタスクシステムであれば、他のタスクに実行権を譲渡するのが望ましい。
切り替え先のプロセッサは、まず、処理再開要求を受理する(S511)。そして、切り替え先のプロセッサは、スタックポインタをシステムコントローラ130から取得して、自プロセッサに適用する(S512)。さらに、切り替え先のプロセッサは、再開プログラムアドレスの識別子(戻り点ID)を取得する(S513)。
次に、切り替え先のプロセッサは、図4A又は図4Bに示すようなプログラムアドレスリストを参照することで、取得した識別子からプログラムアドレスを導出する(S514)。そして、切り替え先のプロセッサは、導出したプログラムアドレスへ分岐することで、処理を再開させる(S515)。これにより、切り替え先のプロセッサは、切り替え元のプロセッサが中断した位置に相当する切り替え先のプログラムアドレス、及び、中断時のスタックポインタから再開できる。
なお、図5C及び図6Cに示すシステムコールは、同等の機能を有するプロセッサ機能を利用することでも実現できる。例えば、プロセッサのサブルーチン呼び出し又はサブルーチン復帰命令で、システムコントローラ130からの要求を、プロセッサレジスタ若しくは特定のデータメモリなどから判断してもよい。そして、要求がない場合は通常のサブルーチンコール又はサブルーチン復帰命令を実行し、要求がある場合は処理中断のシステムコールを動作させる。これにより、要求がない通常の場合での処理オーバーヘッドを軽減できる。
続いて、本発明の実施の形態に係る切り替え可能プログラムの生成方法の一例について説明する。図8A及び図8Bは、本発明の実施の形態に係るプログラム生成装置20の動作の一例を示すフローチャートである。
まず、切り替え可能プログラム生成有効化部300及び310は、プロセッサ切り替え可能プログラムを生成する指示が出ているかを検知する(S601)。つまり、切り替え可能プログラム生成有効化部300及び301は、切り替え可能プログラム生成指示部110から、切り替え可能プログラムの生成を指示されたか否かを判定する。
プロセッサ切り替え可能プログラムを生成する指示がない場合(S602でNo)、プログラム生成装置20は、以下のように、通常の機械語プログラム、すなわち、各プロセッサに専用の機械語プログラムの生成を行う。
なお、切り替え点決定部301及び311は、通常の機械語プログラムを作成する場合は不要となるため、無効化される。そして、切り替え可能プログラム生成部302及び312は、通常の機械語プログラムを生成する場合は、切り替え可能にするための配慮を行わず、プロセッサ独自のルールでプログラム生成を行う。
まず、切り替え可能プログラム生成部302及び312は、広域データをリストに登録する(S651)。
次に、切り替え可能プログラム生成部302及び312は、サブルーチンのスタック構造を、当該プロセッサのハードウェア及び命令セットの構成に最適となるような独自ルールに従って決定する。そして、切り替え可能プログラム生成部302及び312は、決定したスタック構造に基づいて機械語プログラムを生成するための中間コードを生成する(S652)。ここで、中間コードとは、プログラム及びデータのアドレスが他のサブルーチン、広域データの関係で決定されないシンボルで表現されたプログラムである。
さらに、切り替え可能プログラム生成部302及び312は、使用される広域データのリストを追加していく(S653)。以上に示す中間コードの生成(S652)と広域データの追加(S653)とをプロセッサ毎及びサブルーチン毎に繰り返すことで、全てのサブルーチンの中間コードと広域データのリストとを作成する。
そして、切り替え可能プログラム生成部302及び312は、作成した広域データのリストを元に、当該プロセッサハードウェア特性に合わせた独自ルールで各広域データのアドレスを決定する(S654)。
なお、切り替え判断処理挿入部303及び313は、通常の機械語プログラムを作成する場合は、不要となるため、処理が無効化される。
最後に、全サブルーチンをリンクする部分について説明する。
まず、切り替え可能プログラム生成部302及び312は、個々のサブルーチンのプログラムアドレスを決定する(S661)。そして、切り替え可能プログラム生成部302及び312は、分岐アドレスと広域データアドレスとを中間コードに適用することで、最終の機械語プログラムを作成する(S662)。
続いて、プロセッサ切り替え可能プログラム生成指示が検出された場合(S602でYes)について説明する。
まず、切り替え点決定部301及び311は、サブルーチン毎に、当該サブルーチンの境界をサブルーチン切り替えの対象にするかどうかを決定する(S611)。サブルーチンの境界は、例えば、サブルーチンの呼び出し元の呼び出し部分、又は、サブルーチンの呼び出し先の先頭及び終端の少なくとも一方である。
ここでは、全てのサブルーチンを対象にしてもよく、あるいは、サブルーチンの静的若しくは動的ステップ数又はサブルーチンのネストの深さなどを基準として、サブルーチンの境界を切り替え点として決定するか否かを判定してもよい。具体的な切り替え点の例については、後で説明する。
次に、切り替え可能プログラム生成部302及び312は、まず、広域データをリストに登録する(S621)。
さらに、切り替え可能プログラム生成部302及び312は、プロセッサ毎に、自サブルーチンのアドレス及びサブルーチン内でサブルーチンを呼び出す部分のアドレスを、シンボルで、図4A及び図4Bで示すプログラムアドレスリストに登録する(S622)。さらに、切り替え可能プログラム生成部302及び312は、図3A〜図3Cで説明した通り、複数のプロセッサ間の共通ルールでスタック構造を決定し、中間コードを生成する(S623)。ここでは、後で図10から図12で説明するようにスタック上の作業データの一貫性を保証するようにサブルーチン境界でのデータ状態を操作する。また、ここでは、スタックポインタの更新量は自プロセッサでの仮の値として設定する。
次に、切り替え可能プログラム生成部302及び312は、一旦全プロセッサ分の当該サブルーチンのスタック使用量のうち最大のものを判定する(S624)。そして、切り替え可能プログラム生成部302及び312は、当該サブルーチンの全プロセッサのスタック確保量を全プロセッサのスタック使用量の最大値に変更する(S625)。具体的には、切り替え可能プログラム生成部302及び312は、最大のスタック使用量を全プロセッサに共通の当該サブルーチンのスタック使用量として、ステップS623で仮設定したスタック更新量を書き換える。
また、切り替え可能プログラム生成部302及び312は、サブルーチン戻りアドレスのスタックからの取得処理などの、データメモリ50から分岐先アドレスを取得する処理を、識別子からの変換処理に置換する(S626)。具体的には、切り替え可能プログラム生成部302及び312は、図4A及び図4Bに示すプログラムアドレスリストを参照することで識別子から分岐先アドレスを取得する方式に、通常のアドレス取得処理を置換する。より具体的には、図6Aに示すステップS300の処理を、図6B及び図6Cに示すステップS301の処理に置換する。なお、本実施の形態では、この段階では全モジュールを確認しておらず識別子が決定していないため、モジュール名などのシンボルで中間コードを作成しておく。
また、切り替え可能プログラム生成部302及び312は、サブルーチン呼び出し時の戻りアドレスの格納処理などの、データメモリ50に分岐先アドレスを格納する処理を抽出し、識別子を格納する処理に置換する(S627)。具体的には、切り替え可能プログラム生成部302及び312は、図4A及び図4Bのプログラムアドレスリストを参照することで分岐先アドレスを識別子に変換して格納する方式に、通常のアドレス格納処理を置換する。より具体的には、図5Aに示すステップS110の処理を、図5B及び図5Cに示すステップS111の処理に置換する。なお、本実施の形態では、この段階では分岐先プログラムアドレスの識別子は全て決定していないので、シンボルによる中間コードとしてプログラムを生成する。
以上に示す切り替え点の決定(S611)から格納処理の置換(S627)までをサブルーチン毎に繰り返した後、次に、切り替え可能プログラム生成部302及び312は、広域データのアドレスを複数のプロセッサ間の共通ルールで決定する(S628)。これにより、広域データのプロセッサ間の共有が可能になる。
さらに、切り替え可能プログラム生成部302及び312は、登録したプログラムアドレス識別子のシンボルのリストから全ての識別子の実値を決定する。そして、切り替え可能プログラム生成部302及び312は、定数データ配列によるリストとして作成し、作成したリストを広域データとして追加する(S629)。
次に、切り替え可能プログラム生成部302及び312は、ステップS627で生成した分岐先プログラムアドレスの識別子のシンボルを、ステップS629で生成した実値に変換する(S630)。なお、この変換処理は、全てのプロセッサについてプロセッサ毎に行われる。
次に、切り替え判断処理挿入部303及び313は、ステップS611で決定したプロセッサ切り替え点と対象のサブルーチンに、システムコールを呼び出す処理を挿入する。具体的には、切り替え判断処理挿入部303及び313は、サブルーチンの呼び出し処理をシステムコール(図5CのステップS200)に置換する(S631)。また、切り替え判断処理挿入部303及び313は、サブルーチンからの復帰処理もシステムコール(図6CのステップS400)に置換する(S632)。これらの置換処理は、全てのプロセッサについてプロセッサ毎に行われる。
最後に、全サブルーチンをリンクする部分について説明する。
まず、切り替え可能プログラム生成部302及び312は、これまで作成した中間コードからプログラムアドレスを決定する(S641)。そして、切り替え可能プログラム生成部302及び312は、これらの決定した分岐先アドレス、広域データアドレス及び分岐先アドレス識別子を中間コードに適用することで、最終の機械語プログラムを生成する(S642)。
図9は、本発明の実施の形態に係るマルチプロセッサシステム10の動作の一例を示すシーケンス図である。
まず、システムコントローラ130は、最初にプログラムを実行させるプロセッサを決定して実行を開始させる(S700)。ここでは、最初にプログラムを実行させるプロセッサ、すなわち、切り替え元のプロセッサがプロセッサA120であり、切り替え先のプロセッサがプロセッサB121である場合について説明する。
システムコントローラ130は、プログラムを実行させた後、常にシステムの状態の変化を検出し(S701)、実行プロセッサの変更が必要かどうかを判断する(S702)。この判断は、例えば、このプログラムの他にどのようなプログラムがどのプロセッサで実行されているか、どのようなプログラムの実行要求が来ているかなどを検出し、各プログラムが各プロセッサでどの位の処理時間で処理可能であるかを示したテーブルなどを参照することで実行される。例えば、電力を最小に抑えたい場合は、システムコントローラ130は、最小のプロセッサ数で全ての機能のリアルタイム性を実現できるようなプロセッサとプログラムとの割付の組み合わせを見つける。そして、システムコントローラ130は、現在実行されているプロセッサと新しい割付とが異なる場合は、切り替え処理が必要と判断する。
切り替えが必要と判断した場合(S703でYes)、システムコントローラ130は、切り替え元プロセッサであるプロセッサA120に切り替え要求を発行する(S704)。そして、システムコントローラ130は、切り替え元プロセッサでの処理中断完了を待機する(S705)。
中断処理が完了した場合(S706でYes)、システムコントローラ130は、中断時の切り替え元プロセッサの状態を取得する(S707)。具体的には、システムコントローラ130は、切り替え元プロセッサの中断時のスタックポインタ及び再開アドレスの情報を取得する。なお、システムコントローラ130は、これらの中断時の状態を示す情報(コンテキスト)を受け取ることで、中断処理が完了したと判断してもよい。あるいは、システムコントローラ130は、切り替え元プロセッサから中断処理が完了したことを示す通知を受け取ることで、中断処理が完了したと判断してもよい。
そして、システムコントローラ130は、中断時の状態を示す情報を基に切り替え先プロセッサであるプロセッサB121に処理再開を要求する(S708)。そして、切り替え先プロセッサからの再開完了通知を待機し(S709)、完了通知が来ると(S710でYes)、システム状態の変化検出を再開する。
切り替え元プロセッサであるプロセッサA120は、最初、切り替え可能プログラムの実行を開始し(S720)、その後、プロセッサA120は、プログラムを実行しながら切り替え点でシステムコントローラ130からの切り替え要求の有無を確認する(S721)。
そして、切り替え要求があれば(S722でYes)、プロセッサA120は、図7Aで説明した通り、中断地点(切り替え点)での情報(コンテキスト)と中断の完了とをシステムコントローラ130に通知する(S723及びS724)。そして、以降、プロセッサA120は、再度当該プロセッサで再開できるよう、切り替え先プロセッサの初期状態と同様の処理再開要求待ち状態になって停止する。すなわち、切り替え元プロセッサであったプロセッサA120は、マルチプロセッサシステム10における立場が切り替え先プロセッサとなる。
切り替え先プロセッサであるプロセッサB121は、処理再開要求待ち状態にある(S730)。プロセッサB121は、再開要求を待ち続け、要求があった場合(S731でYes)、システムコントローラ130から、図7Bに示す手順で中断状態を取得する(S732)。
そして、プロセッサB121は、中断状態を自プロセッサに設定し(S733)、中断アドレス、すなわち、切り替え点から処理を再開する(S734)。以降、切り替え先プロセッサであったプロセッサB121は、マルチプロセッサシステム10における立場が切り替え元プロセッサとなる。
ここで、プロセッサ切り替え可能プログラムの一例について説明する。
図10は、本発明の実施の形態に係るソースプログラムの一例である。また、図11は、通常の機械語プログラムとプロセッサ切り替え可能プログラムの一例を示す図である。また、図12は、本発明の実施の形態に係るスタック構造の一例を示す図である。
まず、通常の機械語プログラムについて図11(a)を用いて説明する。
図11(a)に示す機械語コード601は、図10に示すソースコード501に相当する。具体的には、図12(a)に示すスタックのアドレス#0004から引数arg1を読み出してレジスタREG0に格納し、アドレス#0005から引数arg2を読み出してレジスタREG1に格納している。
機械語コード602は、図10に示すソースコード502に相当する。具体的には、まず、レジスタREG0に格納された引数arg1とレジスタREG1に格納された引数arg2との減算を行い、減算結果(arg1−arg2)をレジスタREG2に格納する。これにより、レジスタREG2には、変数i(=arg1−arg2)が格納される。
機械語コード603は、図10に示すソースコード503に相当する。具体的には、レジスタREG0に格納された引数arg1と、レジスタREG2に格納された減算結果、すなわち、変数i(=arg1−arg2)との乗算を行い、乗算結果をレジスタREG3に格納する。これにより、レジスタREG3には、変数j(=arg1*i)が格納される。
機械語コード604は、図10に示すソースコード504に相当する。具体的には、サブルーチンsub2を呼び出すために、当該サブルーチンからの戻り先として、サブルーチンコール命令(“CALL sub2”)のその次の機械語コード605の先頭プログラムアドレスADDR1を、図12(a)に示すスタック(アドレス#0006及び#0007)に格納する。そして、サブルーチンsub2を呼び出し、サブルーチンsub2の処理を実行する。
そして、戻りアドレスをスタックから読み出して、サブルーチンsub2からの復帰し、機械語コード605を実行する。なお、機械語コード605は、図10に示すソースコード505に相当する。具体的には、レジスタREG2に格納されている変数iとレジスタREG3に格納されている変数jとを加算し、加算結果(i+j)をレジスタREG2に格納する。これにより、レジスタREG2には、変数i(=i+j)が格納される。
機械語コード606は、図10に示すソースコード506に相当する。まず、レジスタREG2に格納された変数iを、サブルーチンsub1からの戻り値として、図12(a)に示すスタック(アドレス#0002及び#0003)に格納する。そして、スタックから(アドレス#0000及び#0001)から、サブルーチンsub1からの戻りアドレスを取得し、レジスタREG0に格納する。最後に、スタックポインタを戻し、レジスタREG0に格納された戻りアドレスに戻る。
次に、プロセッサ切り替え可能な機械語プログラムの場合について図11(b)を用いて説明する。なお、図11(b)は、図5Bに相当し、サブルーチンの分岐が切り替え点ではない場合を示している。
本実施の形態では、ソースプログラムで明示されたサブルーチン引数及び一時データを必ずスタックに確保するという共通ルールを設け、全てのプロセッサのコンパイラが共通ルールに従って切り替え可能プログラムを生成することにする。また、スタックに確保されるデータ以外の作業データ、及び、レジスタに格納されるデータについては、全てサブルーチンを跨いでデータが残ることを保証されないことも共通ルールとする。
例えば、切り替え可能プログラム生成部302及び312は、切り替え点の前でレジスタに格納されている値であり、切り替え点の後で利用される値を、データメモリ50のスタック領域に格納するように、切り替え可能プログラムを生成する。これにより、サブルーチンを跨いだときに、プロセッサが切り替わっても、必要なデータのスタック内での生存が保障される。以下、この共通ルールの下に作成されたプログラムを説明する。
まず、図11(b)に示す機械語コード611は、図10に示すソースコード501に相当する。すなわち、機械語コード611を実行することで、スタックから引数arg1及びarg2を取り出す。具体的には、図12(b)に示すスタックのアドレス#0004から引数arg1を読み出してレジスタREG0に格納し、アドレス#0006から引数arg2を読み出してレジスタREG1に格納している。
次に、機械語コード612は、図10に示すソースコード502に相当する。機械語コード612は、機械語コード602と同じであるので、説明を省略する。
機械語コード613は、図10に示すソースコード503に相当する。機械語コード613は、機械語コード603と同じであるので、説明を省略する。
機械語コード614は、図10に示すソースコード504に相当する。ここでは、サブルーチンsub2を実行するので、プロセッサの切り替えが発生する可能性があり、レジスタの値をスタックに退避させる必要がある。
具体的には、まず、レジスタREG2に格納された変数i(=arg1−arg2)を、変数iのスタック領域(アドレス#0008及び#0009)に格納する。また、レジスタREG3に格納された変数j(=arg1*i)を、変数jのスタック領域(アドレス#000A及び#000B)に格納する。サブルーチンを跨いでレジスタが生存しないという共通ルールに従うため、確保しているスタックに作業データi及びjを退避している。
そして、サブルーチンsub2からの戻り先として、サブルーチンコール命令(“CALL sub2”)のその次の機械語コード(“LD REG0,(SP+8)”)の先頭プログラムアドレスの情報をスタック(アドレス#000C及び#000D)に格納する。具体的には、プログラムアドレスそのものではなく、図4A及び図4Bのアドレス識別子を格納する。そして、サブルーチンsub2を呼び出し、サブルーチンsub2の処理を実行する。
続いて、サブルーチンsub2から復帰する際に、スタックに退避させておいた変数i及びjを読み出す。具体的には、図12(a)に示すスタックのアドレス#0004から変数iを読み出して、読み出した変数iをレジスタREG0に格納する。また、スタックのアドレス#0006から変数jを読み出して、読み出した変数jをレジスタREG1に格納する。
機械語コード615は、図10に示すソースコード505に相当する。機械語コード615は、機械語コード605と同じであるので、説明を省略する。
最後に、機械語コード616は、図10に示すソースコード506に相当する。ここでは、機械語コード606と同様にして、サブルーチンsub1からの復帰処理を行う。このとき、図12(a)及び(b)から分かるように、図11(a)に示す通常機械語プログラムと、図11(b)に示すプロセッサ切り替え可能プログラムとでは、使用するスタック領域の大きさが異なっている。このため、機械語コード616と機械語コード606とでは、スタックポインタの戻す処理のみが異なっている。
図11(c)は、図5Cに相当し、サブルーチンの分岐が切り替え点である場合を示している。なお、図11(b)と同じ点には同じ参照符号を付し、ここでは説明を省略する。
上述したように、サブルーチンの分岐が切り替え点である場合、システムコールによってサブルーチンが実行される。したがって、図11(c)に示す機械語プログラムは、機械語コード614及び616の代わりに、システムコールを呼び出すための機械語コード624及び626を含んでいる。
機械語コード624は、図10に示すソースコード504に相当する。機械語コード614と同様に、スタックに変数i及びjを退避させ、かつ、サブルーチンsub2からの戻り先として、システムコール(“SYSCALL”)のその次の機械語コード(“LD REG0,(SP+8)”)の先頭プログラムアドレスの識別子(ADDR1_ID)をスタック(アドレス#000C及び#000D)に格納する。
そして、レジスタREG0にサブルーチンsub2のアドレスの識別子(アドレスそのものではない)を格納する。なお、レジスタREG0に格納した識別子は、システムコールの処理においてプロセッサ切り替え要求がない場合に、サブルーチンsub2に分岐する際の飛び先情報として利用される。
そして、システムコール(“SYSCALL”)が実行される。例えば、図5Cに示すステップS200が実行される。以降、プロセッサの切り替え要求がない場合、スタックに退避させておいた変数i及びjを読み出してレジスタREG0及びREG1に格納する。
機械語コード626は、図10に示すソースコード506に相当する。ここでは、機械語コード616と同様にして、サブルーチンsub1からの復帰処理を行う。このとき、サブルーチンsub2への分岐の場合と同様に、システムコールを実行することで、プロセッサ切り替え要求の判定を行う。
図12は、本発明の実施形態に係るスタック構造の一例を示す図である。
図12(a)に示すように、通常のプログラムでは、スタックは、あるプロセッサがサブルーチンsub1を実行するのに使用する最低限の#0000から#0005までの領域を確保する。これに対して、図12(b)に示すように、プロセッサ切り替え可能プログラムでは、#0000から#000Bまでの領域を確保する。これは、他のプロセッサの中に、レジスタ本数が少ないなどの理由で、より多数の作業領域を必要とするプロセッサがあったためで、当該プロセッサが必要なくても領域は確保する。そのため、図11(b)及び図11(c)に示すように、スタックポインタを初期化する際に、図11(c)より多い#000C(16進数)だけ移動させている。
以上のように、プロセッサ切り替え可能プログラムでは、サブルーチンsub2の呼び出し及び戻り時に保証されるべきスタック量、スタック内容及びレジスタがプロセッサ間で共通となり、プロセッサが切り替わっても処理を継続することができる。
ここで、切り替え点決定部301及び311が決定する切り替え点の具体例について説明する。
図13は、本発明の実施の形態において基本ブロックの境界を切り替え点として決定する例を説明するための図である。
上述したように、本発明の実施の形態に係る切り替え点決定部301及び311は、ソースプログラムの基本ブロックの境界の少なくとも一部を、切り替え点として決定する。基本ブロックは、プログラム中の途中に分岐及び合流が存在しない部分であり、具体的には、サブルーチンである。
図13に示すように、本発明の実施の形態に係る切り替え点決定部301及び311は、基本ブロックの境界である先頭及び終端を、切り替え点として決定する。なお、切り替え点決定部301及び311は、全ての基本ブロックの先頭及び終端を切り替え点として決定しなくてもよい。すなわち、切り替え点決定部301及び311は、プログラムに含まれる複数の基本ブロックの境界から、選択的に切り替え点を選択すればよい。
このように、基本ブロックは、途中に分岐及び合流を含まない処理のまとまりであるので、基本ブロックの境界を切り替え点とすることで、切り替え点の管理を容易に行うことができる。
図14A〜図14Cは、本発明の実施の形態においてサブルーチンの境界を切り替え点として決定する例を説明するための図である。上述したように、切り替え点決定部301及び311は、基本ブロックの一例であるサブルーチンの境界を、切り替え点として決定してもよい。
例えば、切り替え点決定部301及び311は、図14Aに示すように、サブルーチンの呼び出し元(Caller)の呼び出し部分を切り替え点として決定する。このときの具体的な動作は、図5Cに示す通りである。また、同様に、切り替え点決定部301及び311は、サブルーチンの呼び出し元の復帰部分を切り替え点として決定してもよい。
また、切り替え点決定部301及び311は、図14Bに示すように、サブルーチンの呼び出し先(Callee)の先頭を切り替え点として決定することもできる。あるいは、切り替え点決定部301及び311は、サブルーチンの呼び出し先の終端を切り替え点として決定してもよい。このときの具体的な動作は、図6Cに示す通りである。
また、ソースプログラムの例で示すと、図14Cに示すように、切り替え点決定部301及び311は、サブルーチンである関数Func1の先頭を切り替え点として決定することができる。また、切り替え点決定部301及び311は、メインルーチンの先頭を切り替え点として決定することもできる。
このように、サブルーチンの境界を切り替え点とすることで、プロセッサの切り替えを容易に行うことができる。例えば、サブルーチンへの分岐先アドレス及びサブルーチンからの復帰先アドレスを、複数のプロセッサ間で対応付けて管理することで、切り替え先のプロセッサでの処理の継続を容易に行うことができる。具体的には、サブルーチンへの分岐先アドレス及びサブルーチンからの復帰先アドレスを複数のプロセッサ間で対応付けて管理する。そして、切り替え先のプロセッサは、対応する分岐先アドレス又は復帰先アドレスを取得して、処理の継続を容易に行うことができる。
以上のように、本発明の実施の形態に係るプログラム生成装置は、ソースプログラム中の所定の位置を切り替え点として決定する切り替え点決定部と、切り替え点においてメモリのデータ構造が複数のプロセッサ間で一致するように、ソースプログラムから、機械語プログラムである切り替え可能プログラムをプロセッサ毎に生成するプログラム生成部と、切り替えプログラムを切り替え可能プログラムに挿入する挿入部とを備えることを特徴とする。本実施の形態では、切り替えプログラムは、第1プロセッサが実行中の、当該第1プロセッサに対応する切り替え可能プログラムを切り替え点で停止させ、かつ、第2プロセッサに対応する切り替え可能プログラムを切り替え点から継続して第2プロセッサに実行させるためのプログラムである。
本実施の形態では、切り替え点ではメモリのデータ構造が一致しているため、切り替えプログラムを実行することで、プロセッサを切り替えることができる。ここでのプロセッサの切り替えとは、プログラムを実行中のプロセッサを停止し、停止した時点から他のプロセッサで継続してプログラムを実行させることである。
したがって、第1プロセッサが実行中のタスクを第2プロセッサが継続して実行することができる。つまり、実行中のプロセッサでは、他のプロセッサで処理が継続できるようなデータメモリ状態で処理を中断し、他のプロセッサは、データメモリ状態を引き継ぎ、切り替え先の該当するプログラム位置から再開させることで同じデータメモリを共有しながら一貫性を保って処理を継続することができる。
要するに、上記の構成から、クロスコンパイル環境で生成された機械語プログラムであって、命令セットの異なるプロセッサ毎の切り替え可能プログラムが生成される。この切り替え可能プログラムは、システムコントローラからの要求に基づいて、処理実行中のプロセッサが、データメモリの一貫性が保てる地点で切り替え要求をシステムコールで検知し、処理を中断してプロセッサ状態を保存する。そして、保存したプロセッサ状態を切り替え先プロセッサが引き継ぎ、再開することで、処理の一貫性の保った実行プロセッサの移動が可能となる。
したがって、本発明の実施の形態によれば、命令セットの異なるプロセッサを持つマルチプロセッサシステムで処理を実行中であっても、実行プロセッサの変更が可能となる。したがって、機器の使用状態の変化に対し、実行中の処理を停止させることなく柔軟にシステム構成を変更でき、機器の処理性能、低電力性能の改善が可能となる。
以上、本発明に係るプログラム生成装置、プロセッサ装置、マルチプロセッサシステム及びプログラム生成方法について、実施の形態に基づいて説明したが、本発明は、これらの実施の形態に限定されるものではない。本発明の趣旨を逸脱しない限り、当業者が思いつく各種変形を当該実施の形態に施したものや、異なる実施の形態における構成要素を組み合わせて構築される形態も、本発明の範囲内に含まれる。
例えば、本発明の実施の形態に係る切り替え点決定部301及び311は、サブルーチンの階層の深さに基づいて切り替え点を決定してもよい。具体的な例について、図15及び図16を用いて説明する。
図15は、本発明の実施の形態の変形例においてサブルーチンの階層の深さに基づいて切り替え点を決定する例を説明するための図である。
本発明の実施の形態に係る切り替え点決定部301及び311は、ソースプログラム中のサブルーチンの呼び出しの階層の深さが、所定の閾値より浅いサブルーチンの境界の少なくとも一部を、切り替え点として決定してもよい。すなわち、切り替え点決定部301及び311は、サブルーチンの階層が閾値より深いサブルーチンの境界を、切り替え点の対象から除外してもよい。
例えば、プログラムのメインルーチンを第1階層(level1)とみなす。このとき、閾値が例えば第3階層(level3)であるとすると、切り替え点決定部301及び311は、第3階層までのサブルーチンの境界を切り替え点として決定する。図15に示す例では、メインルーチン、サブルーチン1、及び、サブルーチン3〜5の境界が切り替え点として決定される。
サブルーチン2及びサブルーチン6は、閾値である第3階層より深い第4階層又は第5階層で呼び出されるため、切り替え点決定部301及び311は、切り替え点の対象から除外する。すなわち、1つのサブルーチンが複数の異なる階層で呼び出される場合は、切り替え点決定部301及び311は、当該複数の階層のうち最も深い階層が閾値より深いか否かを判定することで、当該サブルーチンの境界を切り替え点として決定するか否かを判定する。切り替え点決定部301及び311は、最も深い階層が閾値より浅い場合に、当該サブルーチンの境界を切り替え点として決定する。
図16は、本発明の実施の形態の変形例においてサブルーチンの階層の深さに基づいて切り替え点を決定する別の例を説明するための図である。
図16に示す例でも、図15に示す例と同様に、切り替え点決定部301及び311は、階層が所定の閾値より深いサブルーチンを切り替え点の対象から除外する。図16に示す例では、同一のサブルーチンが複数の異なる階層で呼び出される場合は、当該サブルーチンの階層を個別に判定する点が、図15に示す例と異なっている。
つまり、切り替え点決定部301及び311は、同一のサブルーチンが複数の階層で呼び出されるか否かに関わらず、サブルーチンの呼び出し毎に階層が閾値より深いか否かを判定する。図16に示す例では、サブルーチン2は、メインルーチンから第2階層で呼び出されるとともに、サブルーチン4から第4階層で呼び出される。
このとき、切り替え点決定部301及び311は、閾値より浅い第2階層でメインルーチンから呼び出されるサブルーチン2の境界を切り替え点として決定する。一方で、切り替え点決定部301及び311は、閾値より深い第4階層でサブルーチン4から呼び出されるサブルーチン2を切り替え点の対象から除外する。
切り替え点の対象となるサブルーチンは、切り替え点の対象とならないサブルーチンと比較して、機械語プログラムが異なる。このため、切り替え可能プログラム生成部302及び312は、サブルーチン2に相当する同一のソースプログラムから、2つの異なるサブルーチンに相当する機械語プログラムを生成する。すなわち、切り替え可能プログラム生成部302及び312は、切り替え点の対象となるサブルーチン2’と、切り替え点の対象とならないサブルーチン2とのそれぞれに対応する2種類の機械語プログラムを生成する。
このように、全てのサブルーチンを切り替えの対象とはせずに、呼び出しの階層構造において浅いサブルーチンを切り替えの対象とすることで、切り替え点の数を制限することができる。切り替え点の数が多いと、切り替えの判断処理などが多くなるため、プログラムの処理が遅くなる場合があるので、切り替え点の数を制限することで、処理の低速化を抑制することができる。
なお、本発明の実施の形態に係る切り替え点決定部301及び311は、ソースプログラムの分岐の少なくとも一部を切り替え点として決定してもよい。また、このとき、切り替え点決定部301及び311は、ソースプログラムの分岐のうち繰り返し処理への分岐を、切り替え点の対象から除外してもよい。
図17Aは、本発明の実施の形態の変形例に係る分岐点に基づいて切り替え点を決定する例を説明するためのソースプログラムの一例である。図17Bは、図17Aに示すソースプログラムに相当する機械語プログラムの一例である。
図17Aに示すように、切り替え点決定部301及び311は、if処理などの分岐点を切り替え点として決定する。一方で、切り替え点決定部301及び311は、for処理などの繰り返し処理への分岐を切り替え点の対象から除外する。
まず、図17Aに示すソースプログラムと図17Bに示す通常の機械語プログラムとの関係について説明する。なお、スタックのスタックポインタSPが示す領域に、引数aが格納されており、スタックポインタSP+1が示す領域に、引数bが格納されている場合を想定する。
図17Aに示すソースコード701は、図17Bに示す機械語コード801に相当する。具体的には、スタックから引数bを読み出してレジスタREG0及びREG1に格納する。レジスタREG0の値が変数iに相当し、レジスタREG1の値が変数jに相当する。そして、レジスタREG0に格納した値である変数iをインクリメントする。
ソースコード702は、機械語コード802に相当する。具体的には、スタックから引数aを読み出してレジスタREG2に格納する。そして、レジスタREG2に格納した値と値0とを比較する。すなわち、引数aが0であるか否かを判定する。引数が0である場合、プログラムアドレスadr0に処理が移行する。
引数が0ではない場合、レジスタREG0に格納された引数iとレジスタREG1に格納された引数jとを加算し、加算結果をレジスタREG1に格納する。すなわち、j+iを計算し、計算結果を新たなjの値とする。
ソースコード703は、機械語コード803に相当する。具体的には、まず、レジスタREG3に値100を格納する。なお、レジスタREG3に値100を格納する処理が、プログラムアドレスadr0によって示される処理である。そして、レジスタREG1に格納した値である変数jをインクリメントする。なお、変数jのインクリメントは、プログラムアドレスadr4によって示される処理である。
次に、レジスタREG3に格納された値をデクリメントし、レジスタREG3に格納された値が0でなければ、プログラムアドレスadr4に処理が移行する。つまり、レジスタREG3に格納された値が0になるまで、変数jのインクリメントが繰り返される。
ソースコード704は、機械語コード804に相当する。具体的には、まず、レジスタREG0に格納されている値である変数iと、レジスタREG1に格納されている値である変数jとの加算を行う。加算結果は、レジスタREG2に格納される。そして、レジスタREG2に格納された加算結果が、スタックのスタックポインタSP+5が示す領域に格納される。
以上、図17Aに示すソースプログラムをプロセッサ独自のルールに従って変換することで生成される通常の機械語プログラムについて説明した。以下では、本発明の実施の形態におけるプロセッサ間での共通ルールに従って生成される切り替え可能プログラムについて説明する。
図17Bに示す機械語コード811は、ソースコード701に相当する。機械語コード811は、機械語コード801と比較すると、新たに、レジスタに格納された値をスタックに退避する機械語コード821が追加されている。具体的には、レジスタREG0に格納された変数iを、スタックのスタックポインタSP+2が示す領域に格納し、レジスタREG1に格納された変数jを、スタックのスタックポインタSP+3が示す領域に格納する。
これは、以降の処理にサブルーチン(if処理及びfor処理)が含まれており、サブルーチンを跨いでレジスタの値が残ることは保証されていないためである。さらには、サブルーチンの境界が切り替え点として決定される場合、プロセッサが切り替わる可能性があるので、他のプロセッサでプログラムを継続して実行するために、共有メモリのスタックに変数を格納する必要があるためである。
機械語コード812は、ソースコード702に相当する。機械語コード812は、機械語コード802と比較すると、新たに、システムコールを呼び出すための機械語コード822と、変数をスタックから読み出す機械語コード823と、変数をスタックに退避する機械語コード824とが追加されている。
具体的には、ソースコード702によって示されるif処理の分岐点が切り替え点として決定されているので、機械語コード822を追加することで、プロセッサを切り替えるためのシステムコールを実行する。このとき、レジスタREG0には、プログラムアドレスadr1の識別子が格納されている。システムコールの実行において、プロセッサの切り替え要求がない場合、当該識別子からプログラムアドレスadr1を取得し、取得したプログラムアドレスadr1が示す処理を実行する。
また、機械語コード823は、機械語コード821によってスタックに格納された変数i及び変数jを読み出すために追加されたコードである。通常プログラムでは、レジスタに値が格納されているので、スタックから読み出す必要はないのに対して、切り替え可能プログラムでは、プロセッサが切り替わる可能性を考慮してスタックに変数を退避させているので、スタックから変数を読み出す必要がある。
また、機械語コード824は、変数iと変数jとの加算結果が格納されているレジスタREG1の値を、スタックに格納するためのコードである。これも、機械語コード821と同様の理由による。
機械語コード813は、ソースコード703に相当する。機械語コード813は、機械語コード803と比較すると、新たに、システムコールを呼び出すための機械語コード825と、変数をスタックから読み出す機械語コード826と、変数をスタックに退避する機械語コード827とが追加されている。これらは、機械語コード812に含まれる機械語コード822、823及び824とそれぞれ同じであるので、ここでは説明を省略する。
なお、繰り返し処理の先頭は、切り替え点として決定されており、機械語コード825が挿入されている。これに対して、繰り返し処理の途中では、分岐が含まれているが、切り替え点の対象とはしない。これは、繰り返しの度にシステムコールが呼び出されることによる処理負荷の増大を防止するためである。
機械語コード814は、ソースコード704に相当する。機械語コード814は、機械語コード804と比較すると、新たに、システムコールを呼び出すための機械語コード828と、変数をスタックから読み出す機械語コード829とが追加されている。これらは、機械語コード812に含まれる機械語コード822及び823とそれぞれ同じであるので、ここでは説明を省略する。
このように、分岐を切り替え点とすることで、プロセッサの切り替えを容易に行うことができる。例えば、分岐先アドレスを複数のプロセッサ間で対応付けて管理することで、切り替え先のプロセッサは、対応する分岐先アドレスを取得して、処理の継続を容易に行うことができる。また、繰り返し処理において繰り返しの度に切り替えの判断処理を行うことを防止することができ、処理の低速化を抑制することができる。
なお、本発明の実施の形態に係る切り替え点決定部301及び311は、隣り合う切り替え点の間に含まれる処理を実行するのに要する期間が、予め定められた期間より短くなるように、前記切り替え点を決定してもよい。好ましくは、切り替え点決定部301及び311は、切り替え点間の処理を実行するのに要する期間が一定の期間となるように、切り替え点として決定してもよい。具体的な例について、図18を用いて説明する。
図18は、本発明の実施の形態の変形例に係る一定間隔で切り替え点を決定する例を説明するための図である。
サブルーチンFunc1には、処理1〜処理9が含まれている。プロセッサが処理1〜処理9のそれぞれを実行する場合に要する期間は、それぞれt1〜t9である。
切り替え点決定部301及び311は、処理を実行する順に処理に要する期間を加算する。そして、切り替え点決定部301及び311は、加算した期間が予め定められた期間Tを超えた場合に、最後に加算した期間に対応する処理の先頭を切り替え点として決定する。
図18に示す例では、処理1〜処理3までに要する期間(t1+t2+t3)は、期間Tより短いが、処理1〜処理4までに要する期間(t1+t2+t3+t4)は、期間Tより長くなる。したがって、切り替え点決定部301及び311は、最後に加算したt4に対応する処理4の先頭を、切り替え点として決定する。同様に、処理8の先頭も切り替え点として決定される。
なお、切り替え点決定部301及び311は、最後から2番目に加算した期間に対応する処理の終端を、切り替え点として決定してもよい。この場合、図18に示す例では、処理3の終端及び処理7の終端が切り替え点として決定される。
このように、ほぼ一定期間毎に切り替え点が決定されるので、切り替えが要求された場合に、実際にプロセッサが切り替えられるまでの待ち時間が大きくなることを防止することができる。
また、本発明の実施の形態に係る切り替え点決定部301及び311は、ソースプログラム中で予め定められた位置を、切り替え点として決定してもよい。つまり、切り替え点決定部301及び311は、ソースプログラム中にユーザ(プログラマなど)によって予め定められた位置を、切り替え点として決定してもよい。これにより、ユーザが、プロセッサの切り替え点を指定することができる。具体的な例について、図19を用いて説明する。
図19は、本発明の実施の形態の変形例に係るユーザ指定によって切り替え点を決定する例を説明するための図である。
ユーザが、ソースプログラム中に、切り替え点を指定するためのソースコードを所定の位置に追加することで、当該位置を切り替え点として指定することができる。例えば、図19に示すように、ユーザは、ソースプログラム中に「#pragma CPUSWITCH_ENABLE_FUNC」、又は、「#pragma CPUSWITCH_ENABLE_POINT」などのソースコード901又は902を追加することによって、当該ソースコードを記載した位置を切り替え点として指定することができる。
切り替え点決定部301及び311は、ソースコード901及び902を認識することにより、ソースコード901及び902が記載された位置を切り替え点として決定する。これにより、図19の例では、サブルーチンFunc1の先頭と、処理4及び処理5の間とが切り替え点として決定される。
このように、ソースプログラムを生成する際にユーザによって切り替え点を指定することができるので、ユーザの意図した地点での切り替えを可能にすることができる。
なお、上記の実施の形態では、切り替え点でシステムコールを呼び出すことによって、プロセッサの切り替えが要求されているか否かを判定する処理を行っていた。これに対して、システムコールではなく、切り替え判断処理挿入部303及び313は、プロセッサの切り替え要求の判定を行う切り替え専用プログラム(判定処理)を切り替え可能プログラムに挿入してもよい。例えば、切り替え可能プログラム生成部302及び312は、切り替え点として決定された呼び出し部分又は復帰部分を、切り替え専用プログラムに置き換えるように、切り替え可能プログラムを生成してもよい。
図20は、本発明の実施の形態の変形例に係る切り替え要求の判定処理の一例を示すフローチャートである。
まず、プロセッサは、システムコントローラ130(具体的には、プロセッサ切り替え制御部131)からのプロセッサ切り替え要求が発行されているかどうかを確認する(S801)。プロセッサ切り替え要求が発行されていれば(S802でYes)、プロセッサは、上述した図7Aのプロセッサ切り替えシーケンスを起動する(S805)。
プロセッサ切り替え要求が発行されていなければ(S802でNo)、プロセッサは、サブルーチンのアドレス識別子からサブルーチンの分岐先プログラムアドレス(サブルーチンアドレス)を導出する(S803)。そして、プロセッサは、サブルーチンアドレスに分岐して、サブルーチンを開始する(S804)。
なお、図20に示す切り替え専用プログラムは、図5Cに示すシステムコール(S200)による処理と同じである。すなわち、システムコールを介してプロセッサが判定処理を実行するか、システムコールではなく切り替え可能プログラム中で判定処理を実行するかが異なっている。
具体的には、切り替え専用プログラムは、プロセッサの切り替えが要求されているか否かを、当該切り替え専用プログラムに対応するプロセッサに判断させ、切り替えが要求されている場合に、当該切り替え専用プログラムに対応するプロセッサが実行中の切り替え可能プログラムを切り替え点で停止させ、かつ、他のプロセッサに対応する切り替え可能プログラムを、切り替え点から継続して他のプロセッサに実行させ、切り替えが要求されていない場合に、当該切り替え専用プログラムに対応するプロセッサが実行中の切り替え可能プログラムを継続して実行させるためのプログラムである。
このように、切り替え判断処理挿入部303及び313は、システムコールを呼び出すプログラムの代わりに、切り替え要求の判定処理を行う切り替え専用プログラムを切り替え可能プログラムに挿入してもよい。
また、切り替え可能プログラム生成部302及び312は、切り替え点において、データメモリ50に格納される構造化データ内のデータ構造が複数のプロセッサ間で一致するように、切り替え可能プログラムを生成することが好ましい。具体的な例について、図21A及び図21Bを用いて説明する。
図21Aは、本発明の実施の形態の変形例に係る構造化データの一例を示す図である。図21Bは、本発明の実施の形態の変形例に係る構造化データのデータ構造の一例を示す図である。
図21Aに示すように、ソースプログラム中で、変数i、j、a及びbが構造化データとして定義される。ここで、構造化データは、構造体変数とも記載する。ここでは、変数i及びaは、16ビットで定義され、変数j及びbは8ビットで定義される。
ここで、例えば、図21Bに示すように、プロセッサA専用プログラムでは、定義された変数のデータ幅に従って、メモリ内に領域が確保される。すなわち、16ビットの変数i及びaには、それぞれ16ビット(2バイト)分のメモリ領域が確保され、8ビットの変数j及びbには、それぞれ8ビット(1バイト)分のメモリ領域が確保される。
また、プロセッサB専用プログラムでは、変数のデータ幅に関わらず、全ての変数に16ビット分のメモリ領域が確保される。また、プロセッサAでは、i、a、j、bの順でメモリに格納されるのに対して、プロセッサBでは、i、j、a、bの順でメモリに格納される。このように、通常のプログラムでは、プロセッサ毎に構造体変数のデータ領域の大きさ及び配置が異なっている。
これに対して、本発明の実施の形態の変形例に係る切り替え可能プログラムでは、構造体変数のデータ構造を複数のプロセッサ間で一致させる。具体的には、構造体変数のデータ領域の大きさ及び配置を一致させる。これにより、いずれのプロセッサからでも構造体変数の読み出し及び書き込みを行うことができるので、プロセッサの切り替えを行うことができる。
なお、図21Bに示す例では、切り替え可能プログラムにおける構造体変数のデータ構造は、プロセッサB専用プログラムにおける構造体変数のデータ構造と同じであるが、同じでなくてもよい。つまり、複数のプロセッサのいずれからもアクセスできるように、構造体変数のデータ領域の大きさ及びサイズを定めればよい。
このように、構造化データ(構造体変数)のデータ構造を切り替え点で一致させているので、切り替え先のプロセッサでは、構造化データをそのまま利用することができる。
また、切り替え可能プログラム生成部302及び312は、切り替え点において、ソースプログラム中にデータ幅が明記されないデータのデータ幅が複数のプロセッサ間で一致するように、切り替え可能プログラムを生成することが好ましい。具体的な例について、図22A及び図22Bを用いて説明する。
図22Aは、本発明の実施の形態の変形例に係るデータ幅が明記されていないデータの一例を示す図である。図22Bは、本発明の実施の形態に係るデータ幅が明記されていないデータのデータ構造の一例を示す図である。
図22Aに示す例では、int宣言された変数i及びjと、char宣言された変数c1及びc2とがある。ここでは、図21Aなどとは異なり、それぞれの変数のデータ幅(ビット数)は定義されていない。
このため、図22Bに示すように、プロセッサは独自に各変数のビット幅を定義している。具体的には、プロセッサA専用プログラムでは、変数i、j、c1及びc2のそれぞれに対して、1バイトの領域をメモリ内に確保している。プロセッサB専用プログラムでは、変数i及びkには、2バイトの領域をメモリ内に確保し、変数c1及びc2には、1バイトの領域を確保している。
これに対して、本発明の実施の形態の変形例に係る切り替え可能プログラムでは、データ幅が明記されていないデータのデータ構造を複数のプロセッサ間で一致させる。具体的には、これらのデータのデータ領域の大きさ及び配置を一致させる。これにより、いずれのプロセッサからでもデータの読み出し及び書き込みを行うことができるので、プロセッサの切り替えを行うことができる。
なお、図22Bに示す例では、切り替え可能プログラムにおけるデータ幅が明記されていないデータのデータ構造は、プロセッサB専用プログラムにおけるデータ構造と同じであるが、同じでなくてもよい。つまり、複数のプロセッサのいずれからもアクセスできるように、データ幅が明記されていないデータのデータ領域の大きさ及びサイズを定めればよい。
このように、データ幅が明記されていないデータのデータ幅を切り替え点で一致させているので、切り替え先のプロセッサでは、データをそのまま利用することができる。
また、切り替え可能プログラム生成部302及び312は、切り替え点において、メモリに格納されるデータのエンディアンが複数のプロセッサ間で一致するように、切り替え可能プログラムを生成することが好ましい。具体的な例について、図23A及び図23Bを用いて説明する。
図23Aは、本発明の実施の形態の変形例に係るデータの一例を示す図である。図23Bは、本発明の実施の形態に係るデータのエンディアンを複数のプロセッサ間で一致させることを説明するための図である。
エンディアンは、多バイトのデータをメモリに配置する方式の種類を示す。具体的には、データの上位バイトからメモリに配置するビッグエンディアン、及び、データの下位バイトからメモリに配置するリトルエンディアンなどがある。エンディアンは、プロセッサ毎に異なっている。
図23Aに示す例では、変数iは、16バイトのデータである。プロセッサA専用プログラムでは、リトルエンディアンに従って、メモリのアドレス#0002には、変数iの下位ビットi[7:0]が格納され、アドレス#0003には、変数iの上位ビットi[15:8]が格納される。一方で、プロセッサB専用プログラムでは、ビッグエンディアンに従って、メモリのアドレス#0002には、変数iの上位ビットi[15:8]が格納され、アドレス#0003には、変数iの下位ビットi[7:0]が格納される。
これに対して、本発明の実施の形態の変形例に係る切り替え可能プログラムでは、複数のプロセッサ間でデータのエンディアンを一致させる。このとき、切り替え可能プログラムで用いるエンディアンが、プロセッサが利用するエンディアンと異なっている場合は、当該プロセッサに対応する切り替え可能プログラムに、読み出したデータを並べ替えるための機械語コードを挿入する。これにより、いずれのプロセッサからでもデータの読み出し及び書き込みを行うことができるので、プロセッサの切り替えを行うことができる。
なお、図23Bに示す例では、切り替え可能プログラムにおけるエンディアンは、プロセッサB専用プログラムにおけるエンディアンと同じであるが、同じでなくてもよい。つまり、複数のプロセッサのいずれからもアクセスできるように、エンディアンを定めればよい。
このように、データのエンディアンを切り替え点で一致させているので、切り替え先のプロセッサは、自プロセッサのエンディアンと、一致させたエンディアンとが同じである場合は、メモリからデータを読み出したデータをそのまま利用することができる。また、切り替え先のプロセッサは、自プロセッサのエンディアンと、一致させたエンディアンとが異なる場合は、読み出したデータの並び替えを行うことで、メモリから読み出したデータを利用することができる。
また、切り替え可能プログラム生成部302及び312は、サブルーチンの階層に応じてメモリのデータ構造の一致を制御してもよい。具体的には、切り替え可能プログラム生成部302及び312は、切り替え点の対象となるサブルーチンと、当該サブルーチンの上位のサブルーチンとの間で、データメモリ50のスタック領域のデータ構造を一致させるように、切り替え可能プログラムを生成する。
図24は、本発明の実施の形態に係るサブルーチンの階層に応じてメモリのデータ構造を一致させる処理の一例を説明するための図である。
図24では、一例として、サブルーチンsub4が切り替え点の対象として決定された場合を示している。この場合、切り替え可能プログラム生成部302及び312は、サブルーチンsub4の上位のサブルーチンであるサブルーチンsub3及びメインルーチンMAINと、サブルーチンsub4との間で、メモリのスタック領域のデータ構造を一致させる。
なお、対象サブルーチンの上位のサブルーチンとは、図24に示すようなサブルーチンの階層ツリーにおいて、対象サブルーチンとメインルーチンとの間のサブルーチンであり、一本のルート(分岐なしのルート)上に位置するサブルーチンである。具体的には、上位のサブルーチンは、対象サブルーチンを呼び出したサブルーチンと、当該サブルーチンを呼び出したさらに上位のサブルーチンとを含んでいる。
なお、対象サブルーチンより下位のサブルーチンには、切り替え点の対象となるサブルーチンが含まれていない。このため、下位のサブルーチンが実行されたとしても、その終了とともに、データ構造は元に戻るため、一致させる必要はない。
一方で、対象サブルーチンの上位のサブルーチンを、対象サブルーチンとは異なるデータ構造を用いて実行した場合、対象サブルーチンの実行後に上位のサブルーチンに戻ったときに、データの一貫性が取れておらず、上位のサブルーチンを正しく実行することができない。このため、上位のサブルーチンと対象サブルーチンとの間で、データ構造を一致させておく必要がある。
ここでは、対象サブルーチンの呼び出し及び復帰では、図5C及び図6Cに示す処理を行い、切り替え対象ではない上位のサブルーチンの呼び出し及び復帰では、スタック構造の一致のみを行い、図5B及び図6Bに示す処理を行う。なお、上位のサブルーチンから分岐するサブルーチンについては、データ構造を一致させる必要はない。
このように、対象サブルーチンとその上位のサブルーチンとの間でデータの一貫性を取ることができ、正しく上位のサブルーチンを実行することができる。
また、上記の実施の形態では、図4A及び図4Bに示すように、分岐先アドレスと識別子とを対応付けたプログラムアドレスリストを生成したが、切り替え可能プログラム生成部302及び312は、複数のプロセッサ毎の切り替え可能プログラムにおける分岐先アドレスのそれぞれを互いに対応付けた構造化アドレスデータを生成してもよい。具体的な例について、図25A〜図25Dを用いて説明する。
図25Aは、本発明の実施の形態の変形例に係る構造化アドレスデータの一例を示す図である。
切り替え可能プログラム生成部302及び312は、ソースプログラム中の同一の分岐を示す分岐先アドレスであって、複数のプロセッサ毎の切り替え可能プログラムにおける分岐先アドレスのそれぞれを対応付けた構造化アドレスデータを生成する。生成した構造化アドレスデータは、例えば、データメモリ50に記憶される。
図25Aに示すプロセッサA用のプログラムアドレスは、ソースコード中の1つの分岐先アドレスであり、機械語プログラムである切り替え可能プログラムAにおける分岐先アドレスを示している。同様に、プロセッサB用のプログラムアドレスは、ソースコード中の1つの分岐先アドレスであり、機械語プログラムである切り替え可能プログラムBにおける分岐先アドレスを示している。
ここで、プロセッサA用のプログラムアドレスと、プロセッサB用のプログラムアドレスとは、ソースコード中で同一の分岐先アドレスに相当する。すなわち、プロセッサA120又はプロセッサB121はそれぞれ、図25Aに示す構造化アドレスデータを読み出し、自プロセッサに対応するプログラムアドレスを利用することで、所望の処理を実現することができる。例えば、プロセッサA120からプロセッサB121に切り替える際には、プロセッサAが読み出すべき構造化アドレスデータを、プロセッサB121が読み出し、読み出した構造化アドレスデータのうちプロセッサB用のプログラムアドレスを利用することで、切り替え点から処理を継続することができる。
図25Bは、本発明の実施の形態の変形例に係るサブルーチンの呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。なお、図25Bは、図5Bに示すフローチャートに相当し、サブルーチン呼び出しがプロセッサ切り替え点として決定されていない場合の例を示す。
サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納する(S100)。そして、プロセッサは、サブルーチンからの復帰先として、サブルーチン呼び出し部分の直後のプログラムアドレスそのものでなく、図25Aに示す構造化アドレスデータを格納する(S911)。そして、プロセッサは、サブルーチンの開始アドレスに分岐して、サブルーチンを開始する(S120)。
図25Cは、本発明の実施の形態の変形例に係るサブルーチンの呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。なお、図25Cは、図5Cに示すフローチャートに相当し、サブルーチン呼び出しがプロセッサ切り替え点として決定されている場合の例を示す。
サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納し(S100)、構造化アドレスデータを格納する(S911)。その後、プロセッサは、構造化アドレスデータから自プロセッサ用のプログラムアドレスを抽出し、抽出したプログラムアドレスを入力として、システムコール(S200)を発生させる(S912)。
なお、システムコールの処理については、図5Cとほぼ同じであるので、ここでは説明を省略する。図25Cの例では、図5Cとは異なり、識別子ではなくプログラムアドレスを取得するので、サブルーチンIDから分岐先アドレスを導出処理(S203)が省略されている。
図25Dは、本発明の実施の形態の変形例に係るサブルーチンからの復帰処理のプログラムの一例を示す図である。
まず、プロセッサは、スタックから構造化アドレスデータを取得する(S921)。つまり、プロセッサは、サブルーチンからの戻りアドレスを含む構造化アドレスデータを取得する。そして、プロセッサは、構造化アドレスデータの中の自プロセッサ用のプログラムアドレスを抽出する(S922)。そして、プロセッサは、サブルーチン戻りアドレスに復帰する(S320)。
このように、本発明の実施の形態の変形例では、識別子を用いずに、対応するプログラムアドレス同士を構造化アドレスデータとしてまとめて管理してもよい。つまり、複数のプロセッサそれぞれの分岐先アドレスを対応付けた構造化アドレスデータを管理する。
これにより、切り替え先のプロセッサは、切り替え元のプロセッサが次に実行する予定であった処理の分岐先アドレスを含む構造化アドレスデータを取得することで、自プロセッサに対応する分岐先アドレスを取得することができる。したがって、切り替え元のプロセッサが実行していたタスクを、切り替え先のプロセッサが継続して実行することができる。
また、切り替え判断処理挿入部303及び313は、システムコールの呼び出し命令の代わりに、専用のプロセッサ命令を挿入してもよい。例えば、切り替え可能プログラム生成部302及び312は、切り替え点として決定された呼び出し部分又は復帰部分を、専用のプロセッサ命令に置き換えるように、切り替え可能プログラムを生成してもよい。
ここで、専用のプロセッサ命令は、プロセッサの切り替えが要求されているか否かを判定するサブルーチンを実行させるための命令である。具体的な例について、図26A〜図26Cを用いて説明する。
図26Aは、本発明の実施の形態の変形例に係るサブルーチン呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。なお、図26Aは、図5Cに示すフローチャートに相当し、サブルーチン呼び出しがプロセッサ切り替え点として決定されている場合の例を示す。
サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納する(S100)。そして、プロセッサは、サブルーチンからの復帰先として、サブルーチン呼び出し部分の直後のプログラムアドレスそのものでなく、図4A及び図4Bで説明したプログラムアドレスリストの識別子を、戻り点IDとして格納する(S111)。
そして、プロセッサは、特殊サブルーチンコール命令を実行することでサブルーチンに分岐する(S1020)。特殊サブルーチンコール命令は、専用のプロセッサ命令の一例であり、図26Cを用いて後で説明する。
図26Bは、本発明の実施の形態の変形例に係るサブルーチン呼び出し元の切り替え可能プログラムの一例を示すフローチャートである。なお、図26Bは、図5Bに示すフローチャートに相当し、サブルーチン呼び出しがプロセッサ切り替え点として決定されていない場合の例を示す。
サブルーチンの呼び出し元では、まず、プロセッサは、入力となる引数をスタックに格納する(S100)。そして、プロセッサは、サブルーチンからの復帰先として、サブルーチン呼び出し部分の直後のプログラムアドレスそのものでなく、図4A及び図4Bで説明したプログラムアドレスリストの識別子を、戻り点IDとして格納する(S111)。
そして、プロセッサは、通常サブルーチンコール命令を実行することでサブルーチンに分岐する(S1021)。通常サブルーチンコール命令は、従来から利用される一般的なサブルーチンコールであり、プロセッサは、サブルーチンの分岐先アドレスに分岐する。
図26Cは、本発明の実施の形態の変形例に係る特殊サブルーチンコール命令の一例を示すフローチャートである。
プロセッサは、特殊サブルーチンコール命令を実行すると、まず、プロセッサ切り替え要求が発行されているか否かを判定する(S1101)。プロセッサ切り替え要求が発行されている場合(S1101でYes)、プロセッサは、プロセッサ切り替えシステムコールを発行する(S1102)。ここでのシステムコールは、例えば、プロセッサの切り替え処理を起動するためのシステムコールであり、切り替え要求の判定処理などを含んでいない。
プロセッサ切り替え要求が発行されていない場合(S1101でNo)、サブルーチンにそのまま分岐する(S1103)。つまり、ここでは、サブルーチンIDを入力としたシステムコールを行っていないので、分岐先アドレスをそのまま利用することができる。
このように、切り替えプログラムが専用のプロセッサ命令であるので、プロセッサ命令の実行によって、切り替えプログラムを実行することができる。これにより、専用のプロセッサ命令を利用することで、システムコールを呼び出すプログラムを挿入する場合に比べて、プロセッサの切り替え要求がない場合における切り替え判定のオーバーヘッドを軽減することができる。
また、切り替え可能プログラム生成部302及び312は、さらに、切り替え点を含む所定の期間を、プロセッサの切り替え要求を受け付けることができる割り込み許可期間として設定してもよい。さらに、切り替え可能プログラム生成部302及び312は、割り込み許可期間以外の期間を、切り替え要求を受け付けない割り込み禁止期間として設定してもよい。具体的な例について、図27A及び図27Bを用いて説明する。
図27Aは、本発明の実施の形態の変形例に係る割り込み許可区間及び禁止区間の一例を示す図である。図27Bは、本発明の実施の形態の変形例に係る割り込み禁止区間の一例を示す図である。
図27Aに示すように、切り替え可能プログラム生成部302及び312は、サブルーチンの境界、すなわち、サブルーチン処理の前後に割り込み許可区間を設定するように、切り替え可能プログラムを生成する。切り替え可能プログラムを実行中のプロセッサは、システムコントローラ130からプロセッサの切り替え要求を受け取った場合、割り込み許可区間になった場合に、割り込みルーチンによりプロセッサ切り替えシステムコールを実行する。すなわち、プロセッサは、割り込み禁止区間で切り替え要求を受け取った場合、実行中の切り替え可能プログラムを継続して実行し、割り込み許可区間になってからシステムコールを実行する。
また、サブルーチンの境界を切り替え点として決定されない場合は、図27Bに示すように、サブルーチンの呼び出しからサブルーチンからの復帰までの期間を全て、割り込み禁止区間とすればよい。
なお、割り込み許可区間は、サブルーチンの境界に限らない。すなわち、プロセッサの切り替え処理を実行可能な箇所に任意に割り込み許可区間を設定することができる。
また、上記に示す割り込み禁止及び許可は、プロセッサの切り替え処理の割り込みのみを対象としてもよい。あるいは、全ての割り込み処理を対象としてもよい。
このように、割り込み許可期間を設けることで、プロセッサの切り替えを行うことができる期間を明確にすることができ、意図しない位置での切り替えを防止することができる。
また、上記の実施の形態に係るプロセッサ装置が、互いに命令セットの異なる複数のプロセッサ(すなわち、異種プロセッサ)を備える例について示したが、命令セットが共通のプロセッサ(すなわち、同種プロセッサ)を備えていてもよい。例えば、複数の同種プロセッサのそれぞれに対して、異なるコンパイラ(プログラム生成装置)が機械語プログラムを生成する場合に、本発明を適用することができる。これにより、タスクの実行中であってもプロセッサ間の切り替えを可能にし、システムの状況及びユースケースの変更に対応することができる。
また、上記の実施の形態に係るプログラム生成装置が、互いに異なる複数のコンパイラを備える例について示したが、プログラム生成装置は、1つのみのコンパイラを備えていてもよい。この場合、当該1つのコンパイラは、プロセッサA用の機械語プログラムとプロセッサB用の機械語プログラムとの2種類の機械語プログラムを生成する。
また、複数のプロセッサ間で、レジスタを共通化してもよい。つまり、切り替え可能プログラム生成部は、切り替え点で、現在プログラムを実行中の第1プロセッサが備えるレジスタに格納されているデータを、第2プロセッサが備えるレジスタに引き継ぐためのプログラムを生成してもよい。
具体的には、切り替え元である第1プロセッサが備えるレジスタの値を読み出し、切り替え先の第2プロセッサが備えるレジスタに格納する。例えば、レジスタからの読み出しは、図7AのステップS501で実行され、及び、レジスタへの書き込みは、図7BにおけるステップS512で実行される。なお、第1プロセッサと第2プロセッサとでレジスタ本数などが同じであることが好ましい。
また、上記の実施の形態では、2つのプロセッサ間での切り替えについて説明したが、3つ以上のプロセッサ間での切り替えを行ってもよい。
また、本実施の形態に係るプログラム生成装置は、切り替え可能プログラムを生成する際に、個々のプロセッサ用のプログラムを共通のルールで作成するのに共通する最小公倍数的なルールに基づいて、それぞれに独立にプログラムを生成してもよい。あるいは、プログラム生成装置は、まず、一方のプログラムを生成し、生成したプログラムに他方のプログラムを合わせ込む方法を用いてもよい。
また、上記実施の形態に係るプログラム生成装置又はプロセッサ装置に含まれる各処理部は、典型的には集積回路であるLSI(Large Scale Integration)として実現される。これらは個別に1チップ化されてもよいし、一部又は全てを含むように1チップ化されてもよい。
ここでは、LSIとしたが、集積度の違いにより、IC(Integrated Circuit)、システムLSI、スーパーLSI、ウルトラLSIと呼称されることもある。
また、集積回路化はLSIに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。LSI製造後にプログラムすることが可能なFPGA(Field Programmable Gate Array)、又はLSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブルプロセッサを利用してもよい。
さらには、半導体技術の進歩又は派生する別技術によりLSIに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて各処理部の集積化を行ってもよい。バイオ技術の適用等が可能性として考えられる。
また、本発明の実施の形態に係る、プログラム生成装置又はプロセッサ装置の機能の一部又は全てを、CPU等のプロセッサがプログラムを実行することにより実現してもよい。
さらに、本発明は上記プログラムであってもよいし、上記プログラムが記録された記録媒体であってもよい。また、上記プログラムは、インターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
また、上記で用いた数字は、全て本発明を具体的に説明するために例示するものであり、本発明は例示された数字に制限されない。また、構成要素間の接続関係は、本発明を具体的に説明するために例示するものであり、本発明の機能を実現する接続関係はこれに限定されない。
さらに、上記の実施の形態は、ハードウェア及び/又はソフトウェアを用いて構成されるが、ハードウェアを用いる構成は、ソフトウェアを用いても構成可能であり、ソフトウェアを用いる構成は、ハードウェアを用いても構成可能である。
また、上記のプログラム生成装置、プロセッサ装置及びマルチプロセッサシステムの構成は、本発明を具体的に説明するために例示するためのものであり、本発明に係るプログラム生成装置、プロセッサ装置及びマルチプロセッサシステムは、上記構成の全てを必ずしも備える必要はない。言い換えると、本発明に係るプログラム生成装置、プロセッサ装置及びマルチプロセッサシステムは、本発明の効果を実現できる最小限の構成のみを備えればよい。
同様に、上記のプログラム生成装置によるプログラム生成方法は、本発明を具体的に説明するために例示するためのものであり、本発明に係るプログラム生成装置によるプログラム生成方法は、上記ステップの全てを必ずしも含む必要はない。言い換えると、本発明に係るプログラム生成方法は、本発明の効果を実現できる最小限のステップのみを含めばよい。また、上記のステップが実行される順序は、本発明を具体的に説明するために例示するためのものであり、上記以外の順序であってもよい。また、上記ステップの一部が、他のステップと同時(並列)に実行されてもよい。