(57)【要約】【課題】キャッシュミスによるプログラム実行性能の低下を抑えることができる制御装置を提供する。【解決手段】ＣＰＵとメモリを有し、メモリに格納された命令コードをＣＰＵで実行しメモリに格納されたデータを処理する制御装置であって、ＣＰＵは、命令コードに記述されたｎ番目に実行される関数の実行前、または、実行中にｎ＋１番目以降に実行される関数で使用する命令コード、または、データに対するプリフェッチ命令の開始を実行する。【選択図】図５
2016115232.tif 000002
【特許請求の範囲】
【請求項１】
ＣＰＵとメモリを有し、前記メモリに格納された命令コードを前記ＣＰＵで実行し前記メモリに格納されたデータを処理する制御装置であって、
前記ＣＰＵは、前記命令コードに記述されたｎ番目に実行される関数の実行前、または、実行中にｎ＋１番目以降に実行される関数で使用する命令コード、または、データに対するプリフェッチ命令の開始を実行することを特徴とする制御装置。
【請求項２】
請求項１に記載の制御装置であって、
前記メモリに格納された命令コードは前記関数を上位の関数内で呼び出す形式のものであって、前記ｎ番目に実行される関数を呼び出す前に前記ｎ＋１番目以降に実行される関数で使用する命令コード、または、データに対するプリフェッチ命令の開始を実行することを特徴とする制御装置。
【請求項３】
請求項１に記載の制御装置であって、
前記命令コードは前記関数を上位の関数内で呼び出す形式のものであって、前記ｎ番目に実行される関数を呼び出す際に前記ｎ＋１番目以降に実行される関数で使用する命令コード、または、データに関する情報を渡し、
前記ｎ番目に実行される関数の中で前記上位の関数から渡された前記ｎ＋１番目以降に実行される関数で使用する命令コード、または、データに関する情報に基づきプリフェッチ命令の開始を実行することを特徴とする制御装置。
【請求項４】
請求項１に記載の制御装置であって、
前記命令コードは条件分岐によって使用する命令コード、または、データが実行する度に異なる形式のものであって、複数の条件に対応する命令コード、または、データの一部または全てに対するプリフェッチ命令の開始を実行することを特徴とする制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＣＰＵとメモリを搭載した制御装置に係り、特にキャッシュミスによるプログラム実行性能の低下を防止することができる制御装置に関する。
【背景技術】
【０００２】
高度な制御を行う制御装置では、ＣＰＵ（ｃｅｎｔｒａｌ  ｐｒｏｃｅｓｓｉｎｇ  ｕｎｉｔ）とメモリを搭載し、メモリに格納された命令コードをＣＰＵで実行し、メモリに格納されたデータをＣＰＵで処理する方式が用いられている。この場合に、通常ＣＰＵに比べてメモリは低速であり、メモリのアクセス時間が性能向上の阻害要因となる場合がある。
【０００３】
メモリのアクセス時間を短縮する方法として、キャッシュメモリを使用する方法がある。キャッシュメモリは小容量の高速なメモリであり、低速なメモリに格納された命令コードやデータの一部のコピーを格納する。ＣＰＵが実行する命令コードや処理するデータのコピーがキャッシュメモリに格納されている場合は、ＣＰＵは低速なメモリをアクセスせずキャッシュメモリをアクセスすることにより、処理時間を短縮することができる。しかしながら、命令コードやデータのコピーがキャッシュメモリに格納されていない場合（キャッシュミス）には、低速なメモリから命令コードやデータをキャッシュメモリに転送する必要があり、転送している間はＣＰＵの動作が停止するため、性能が低下する。
【０００４】
キャッシュミスによる性能低下を防止する方法として、プリフェッチと呼ばれる技術がある。
【０００５】
プリフェッチに関する背景技術として、特許文献１がある。特許文献１には「ｉ番めのループ繰り返しで配列要素Ａ（ｉ）を参照するようなループ（５０３〜５０５）があった場合、まず、ループの１回の繰り返しにかかる実行サイクル数ｃを見積もり、データをメモリからキャッシュに移動するのに要するサイクル数（メモリレイテンシ）Ｌをｃで割った値α＝［Ｌ／ｃ］（ここで、［］は、小数点以下切り上げを表す記号）を計算する。そして、ｉ回目の繰り返しで配列要素Ａ（ｉ＋α）をプリフェッチする命令を配列要素Ａ（ｉ）の直前に挿入する」、「このようにα回後の繰り返しで参照するデータに対して予めプリフェッチ命令を発行しておくことにより、Ｌ（＝ｃ＊α）サイクル後にそのデータを参照するときは当該データが既にキャッシュに到着しているので、キャッシュヒットとなる。これによりキャッシュミスによるプログラム実行性能の低下が防止できる」、「プリフェッチの対象とするメモリ参照を含む第１のループがその内側に第２のループを有する場合に、当該第２のループのループ繰り返し１回あたりの実行サイクル数と、データをプリフェッチするのに要するサイクル数であるメモリレイテンシとに基づいて、当該メモリレイテンシに相当する第２のループの繰り返し回数βを求め、前記第２のループを、終わりのβ回を実行する後半ループと、その前までの繰り返しを実行する前半ループとに分割し、前半ループと後半ループの間にプリフェッチ命令を挿入する」とある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０００−２０７２２４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
要するに特許文献１には、ループ繰り返しで配列要素を参照する場合に、将来参照するデータに対して予めプリフェッチ命令を発行しておくことで、キャッシュミスによるプログラム実行性能の低下を防止する方法が記載されている。
【０００８】
しかし、特許文献１の技術はループ処理のみに適用が可能であり、それ以外の処理には適用することができない。
【０００９】
また、ループ処理であっても、「配列要素Ａ（ｉ＋α）をプリフェッチする命令を配列要素Ａ（ｉ）の直前に挿入する」とあることから、配列要素Ａ（０）からＡ（α−１）に対してはプリフェッチが実行されず、キャッシュミスによるプログラム実行性能の低下が発生する。
【００１０】
以上のことから本発明においては、キャッシュミスによるプログラム実行性能の低下を抑えることができる制御装置を提供することを目的としている。
【課題を解決するための手段】
【００１１】
上記課題を解決するため、例えば特許請求の範囲に記載の構成を採用する。
【００１２】
本発明は上記課題を解決する手段を複数含んでいるが、その一例を挙げるならば、ＣＰＵとメモリを有し、メモリに格納された命令コードをＣＰＵで実行しメモリに格納されたデータを処理する制御装置であって、ＣＰＵは、命令コードに記述されたｎ番目に実行される関数の実行前、または、実行中にｎ＋１番目以降に実行される関数で使用する命令コード、または、データに対するプリフェッチ命令の開始を実行することを特徴とする。
【発明の効果】
【００１３】
本発明によれば、ｎ＋１番目以降に実行される関数で使用する命令コード、または、データに対するプリフェッチ命令を前もって実行することが可能となり、関数の処理内容によらず、関数で使用する全ての命令コード、または、データを前もってキャッシュメモリに転送することによりキャッシュミスによるプログラム実行性能の低下を防止することができる。
【００１４】
上記した以外の課題、構成及び効果は、以下の実施形態の説明により明らかにされる。
【図面の簡単な説明】
【００１５】
【図１】本発明を適用した制御システムの構成例を示す図。
【図２】図１の制御システムのＲＯＭ１１８に格納する命令コードを生成する処理フローの第１の例を示す図。
【図３】図１の制御システムのＣＰＵ１０６の処理内容の一部を示すソースコードの第１の例であり、図２のソースコード２０２の一部に相当するソースコードＳＣ１を示す図。
【図４】図３のソースコードＳＣ１にプリフェッチ命令を付加せずに図１の制御システムで実行した場合の処理時間を示すタイミングチャートを示す図。
【図５】図３のソースコードの上位関数ｆｕｎｃ０にプリフェッチ命令を付加した実施例１のソースコードを示す図。
【図６】図５のプリフェッチ付ソースコードＳＣ２を図１の制御システムで実行した場合の処理時間を示すタイミングチャートの第１の例を示す図。
【図７】キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が４個であると仮定した場合のタイミングチャートを示す図。
【図８】図３のソースコードの上位関数ｆｕｎｃ０にプリフェッチ命令を付加した実施例２のソースコードを示す図。
【図９】図３のソースコードの関数ｆｕｎｃ１にプリフェッチ命令を付加した実施例２のソースコードＳＣ４の例を示す図。
【図１０】図８、及び図９のプリフェッチ付ソースコード（ＳＣ３、ＳＣ４）を図１の制御システムで実行した場合の処理時間を示すタイミングチャートを示す図。
【図１１】図１の制御システムのＣＰＵ１０６の処理内容の一部を示すソースコードＳＣ１の第２の例（ソースコードＳＣ５）を示す図。
【図１２】図１１のソースコードの上位関数ｆｕｎｃ０にプリフェッチ命令を付加した実施例３のソースコード６を示す図。
【図１３】図１１のソースコードの関数ｆｕｎｃにプリフェッチ命令を付加した実施例３のソースコードＳＣ７を示す図。
【図１４】図１２、及び図１３のプリフェッチ付ソースコードを図１の制御システムで実行した場合の処理時間を示すタイミングチャートを示す図。
【図１５】図１の制御システムのＣＰＵ１０６の処理内容の一部を示すソースコードＳＣ１の第３の例（ソースコードＳＣ８）を示す図。
【図１６】図１５のソースコードの上位関数ｆｕｎｃ０にプリフェッチ命令を付加した実施例４のソースコードの例を示す図。
【図１７】図１５のソースコードの関数ｆｕｎｃ１にプリフェッチ命令を付加した実施例４のソースコードの例を示す図。
【図１８】図１６、及び図１７のプリフェッチ付ソースコードを図１の制御システムで実行した場合の処理時間を示すタイミングチャートの例を示す図。
【図１９】図１の制御システムのＲＯＭ１１８に格納する命令コードを生成する処理フローの第２の例を示す図。
【発明を実施するための形態】
【００１６】
以下、本発明の実施例について図面を用いて説明する。
【実施例１】
【００１７】
以下実施例１について説明するが、その前に前提となる本発明の制御装置の構成を図１で説明し、プリフェッチソースコードの生成過程を図２で説明し、プリフェッチを実行しない場合のソースコードとこの結果待ち時間が生じることについて図３、図４を用いて説明しておく。実施例１については、その後図５、図６を用いて説明を行う。
【００１８】
図１は、本発明を適用した制御システムの構成例を示す図である。
【００１９】
本発明を適用した制御システムは、制御装置１０２と制御対象の機器１２８を有する。制御装置１０２は、プロセッサ１０４、ＲＡＭ（ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ）１１６、ＲＯＭ（ｒｅａｄ  ｏｎｌｙ  ｍｅｍｏｒｙ）１１８、入出力回路１２２、通信回路１２４を有する。プロセッサ１０４は、ＣＰＵ１０６、キャッシュメモリ１０８、インタフェース回路１１０を有する。
【００２０】
ＣＰＵ１０６は、信号線１１２を経由してキャッシュメモリ１０８から命令コードを受け取り、実行する。ＣＰＵ１０６はまた、実行した命令コードに従い、信号線１１２を経由してキャッシュメモリ１０８からデータを読み出し、処理を施したのち、信号線１１２を経由して結果をキャッシュメモリ１０８に書き込む。ＣＰＵ１０６はまた、実行した命令コードがプリフェッチ命令であった場合には、信号線１１２を経由してキャッシュメモリ１０８にプリフェッチ命令で指示された命令コード、またはデータの転送を指示し、キャッシュメモリ１０８からのデータの転送終了を待たずに次の命令の処理に進む。
【００２１】
キャッシュメモリ１０８は、信号線１１２を経由してＣＰＵ１０６から命令コード、またはデータの読み出し要求を受け取ると、該当する命令コード、またはデータのコピーが内部に格納されているかどうかを調べる。内部に格納されている場合には、格納されている命令コード、またはデータを、信号線１１２を経由してＣＰＵ１０６に渡し、処理を終了する。この場合、ＣＰＵ１０６の動作を停止する必要が無いため、高速に処理を行うことが可能である。
【００２２】
該当する命令コード、またはデータのコピーがキャッシュメモリ１０８内部に格納されていなかった場合、キャッシュメモリ１０８は、命令コード、またはデータのアドレスがＲＡＭ１１６、ＲＯＭ１１８、入出力回路１２２、通信回路１２４のいずれに対応するかを調べる。要求のあったアドレスがＲＡＭ１１６、またはＲＯＭ１１８に対応する場合には、ＣＰＵ１０６から要求のあったアドレスを含む３２バイトの領域に対する読み出し要求を、信号線１１４を経由してインタフェース回路１１０に出力する。対応する３２バイトの命令コード、またはデータを、信号線１１４を経由してインタフェース回路１１０から受け取ると、内部に格納するとともに、ＣＰＵ１０６から要求のあったアドレスの命令コード、またはデータを、信号線１１２を経由してＣＰＵ１０６に渡す。
【００２３】
この場合、ＲＡＭ１１６、またはＲＯＭ１１８から命令コード、またはデータを転送している期間はＣＰＵ１０６が停止するため、性能が低下する。但し、３２バイトの領域単位で転送を行うため、連続するアドレスに対する要求があった場合は３２バイトに１回のみ転送を行えばよいことになり、要求のあったアドレスだけを転送する場合に比べると性能が向上する。
【００２４】
要求のあったアドレスが入出力回路１２２、または通信回路１２４に対応する場合は、キャッシュメモリ１０８は、対応するアドレスのみに対する読み出し要求を、信号線１１４を経由してインタフェース回路１１０に出力する。対応するデータを、信号線１１４を経由してインタフェース回路１１０から受け取ると、内部には格納せずに信号線１１２を経由してＣＰＵ１０６に渡す。入出力回路１２２、及び通信回路１２４から読み出したデータを内部に格納しないのは、入出力回路１２２、及び通信回路１２４はＣＰＵ１０６とは独立に動作している関係で書き込みを行わなくても内部状態が変わることがあり、キャッシュメモリ１０８に格納するとその後の内部状態の変化を反映できなくなるためである。
【００２５】
キャッシュメモリ１０８はまた、信号線１１２を経由してＣＰＵ１０６からデータの書き込み要求を受け取ると、該当するデータの書き込み要求を、信号線１１４を経由してインタフェース回路１１０に出力する。また、該当するデータのコピーが内部に格納されている場合は、内部に格納されているデータを、信号線１１２を経由してＣＰＵ１０６から受け取ったデータで上書きする。
【００２６】
キャッシュメモリ１０８はまた、信号線１１２を経由してＣＰＵ１０６からプリフェッチ命令の転送要求を受け取ると、該当する命令コード、またはデータのコピーが内部に格納されているかどうかを調べる。内部に格納されている場合には処理を終了し、内部に格納されていなかった場合は、命令コード、またはデータのアドレスがＲＡＭ１１６、ＲＯＭ１１８、入出力回路１２２、通信回路１２４のいずれに対応するかを調べる。要求のあったアドレスがＲＡＭ１１６、またはＲＯＭ１１８に対応する場合には、ＣＰＵ１０６から要求のあったアドレスを含む３２バイトの領域に対する読み出し要求を、信号線１１４を経由してインタフェース回路１１０に出力する。対応する３２バイトの命令コード、またはデータを、信号線１１４を経由してインタフェース回路１１０から受け取ると、内部に格納する。要求のあったアドレスが入出力回路１２２、または通信回路１２４に対応する場合には、転送を行わずに処理を終了する。
【００２７】
キャッシュメモリ１０８は、命令コードを格納する領域とデータを格納する領域が分割されており、命令コードのアクセスとデータのアクセスを並列に処理することが可能である。
【００２８】
なお、キャッシュメモリの動作に関しては様々な方法が知られており、本実施例はその１つの例である。本発明はキャッシュメモリの動作方法によらず適用が可能である。
【００２９】
インタフェース回路１１０は、信号線１１４を経由してキャッシュメモリ１０８から命令コード、またはデータの読み出し要求を受け取ると、バス１２０を経由してＲＡＭ１１６、ＲＯＭ１１８、入出力回路１２２、または通信回路１２４に読み出し要求を出力する。対応する命令コード、またはデータを、バス１２０を経由してＲＡＭ１１６、ＲＯＭ１１８、入出力回路１２２、または通信回路１２４から受け取ると、信号線１１４を経由してキャッシュメモリ１０８に渡す。
【００３０】
インタフェース回路１１０はまた、信号線１１４を経由してキャッシュメモリ１０８からデータの書き込み要求を受け取ると、バス１２０を経由してＲＡＭ１１６、ＲＯＭ１１８、入出力回路１２２、または通信回路１２４に書き込み要求を出力する。
【００３１】
ＲＡＭ１１６は、バス１２０を経由してインタフェース回路１１０、または通信回路１２４から命令コード、またはデータの読み出し要求を受け取ると、指定されたアドレスに格納された命令コード、またはデータを読み出し、バス１２０を経由してインタフェース回路１１０、または通信回路１２４に渡す。
【００３２】
ＲＡＭ１１６はまた、バス１２０を経由してインタフェース回路１１０、または通信回路１２４からデータの書き込み要求を受け取ると、指定されたアドレスにデータを書き込む。
【００３３】
ＲＡＭ１１６は揮発性のメモリであり、電源投入直後の初期値は不定である。ＣＰＵ１０６から書き込みを行うことにより初めて値が定まる。ＲＡＭ１１６に命令コードや初期値の定められたデータを格納する場合は、ＣＰＵ１０６がＲＯＭ１１８からＲＡＭ１１６に該当する命令コードやデータをコピーする。
【００３４】
ＲＯＭ１１８の動作もＲＡＭ１１６と同様である。ＲＯＭ１１８は不揮発性のメモリであり、電源投入直後の初期値は前回電源を遮断した時に格納していた値と同じである。ＲＯＭ１１８は命令コードや初期値の定められたデータを格納するために用いられる。通常書き込みは行われないが、プログラムのバージョンアップ等の際にはＣＰＵ１０６から書き込みが行われる。書き込まれる命令コード、またはデータは、信号線１２６に接続されたＰＣから通信回路１２４、ＲＡＭ１１６を経由してＣＰＵ１０６に供給される。
【００３５】
入出力回路１２２は、バス１２０を経由してインタフェース回路１１０から読み出し要求を受け取ると、信号線１３０を経由して機器１２８の状態を読み出し、バス１２０を経由してインタフェース回路１１０に出力する。
【００３６】
入出力回路１２２はまた、バス１２０を経由してインタフェース回路１１０から書き込み要求を受け取ると、機器１２８の制御信号１３２を指定された値に変化させる。
【００３７】
通信回路１２４は、内部に動作モードを指定したり動作状態を表示したりするための複数のレジスタを有しており、バス１２０を経由してインタフェース回路１１０から読み出し要求を受け取ると、指定されたアドレスのレジスタの値を、バス１２０を経由してインタフェース回路１１０に出力する。
【００３８】
通信回路１２４はまた、バス１２０を経由してインタフェース回路１１０から書き込み要求を受け取ると、指定されたアドレスのレジスタに値を格納する。
【００３９】
通信回路１２４はまた、動作モードを示すレジスタが送信起動状態を示している時には、バス１２０を経由してＲＡＭ１１６から送信データを受け取り、通信路１２６に出力する。ＲＡＭ１１６に格納されている送信データは、予めＣＰＵ１０６から書き込まれたデータである。
【００４０】
通信回路１２４はまた、通信路１２６から受信データを受け取ると、バス１２０を経由してＲＡＭ１１６に受信データを書き込む。ＲＡＭ１１６に書き込まれたデータは、その後ＣＰＵ１０６に読み出される。
【００４１】
図２は、図１の制御システムのＲＯＭ１１８に格納する命令コードを生成する処理フローの第１の例である。
【００４２】
ソースコード２０２はＣＰＵ１０６で実行するプログラムの処理内容をＣ言語などのプログラミング言語で記述したものである。このままではＣＰＵ１０６で実行することはできず、ＣＰＵ１０６で実行するためには命令コードに変換する必要がある。
【００４３】
実行順序情報２０４は、ソースコード２０２に記述されたプログラムの実行順序に関する情報であり、関数の実行順序、変数のアクセス順序などの情報を含む。
【００４４】
プリフェッチ付加２０６は、ソースコード２０２と実行順序情報２０４を取り込み、ソースコード２０２にプリフェッチ命令を付加してプリフェッチ付ソースコード２０８を出力する。なお、実行順序情報２０４は原理的にはソースコード２０２を解析することによっても得ることができるため、実行順序情報２０４なしでソースコード２０２からプリフェッチ付ソースコード２０８を生成するというフローでも良い。実行順序情報２０４を入力するとプリフェッチ付加２０６の処理内容が簡略化されるため、実機での動作結果などから実行順序情報２０４を生成することが可能であれば、実行順序情報２０４を入力した方が好ましい。
【００４５】
コンパイル２１０は、プリフェッチ付ソースコード２０８を入力し、ＣＰＵ１０６が実行可能なプリフェッチ付命令コード２１２を生成する。プリフェッチ付命令コード２１２はＲＯＭ１１８に格納され、ＣＰＵ１０６で実行される。
【００４６】
図３は、図１の制御システムのＣＰＵ１０６の処理内容の一部を示すＣ言語などのプログラミング言語で記述されたソースコードＳＣ１の第１の例であり、図２のソースコード２０２の一部に相当する。ソースコードは、行番号に対比して記述されている。本発明の説明における他の部分で使用するソースコードと区別する意味で、図３のソースコードをＳＣ１と表記する。
【００４７】
ソースコードＳＣ１の行番号の先頭行である３０１行では、データｄを定義している。データｄ１、ｄ２、ｄ３、ｄ４は、それぞれ要素数３２の整数の配列である。１個の要素のサイズは４バイトであり、従ってデータｄ１、ｄ２、ｄ３、ｄ４は、それぞれ１２８バイトの領域を占める。
【００４８】
ソースコードＳＣ１の行番号の３０３行から３１１行では、上位の関数であるｆｕｎｃ０を定義している。上位の関数ｆｕｎｃ０は、関数ｆｕｎｃ１、ｆｕｎｃ２、ｆｕｎｃ３、ｆｕｎｃ４を順に呼び出す。関数ｆｕｎｃ１を呼び出す時にはデータｄ１を、関数ｆｕｎｃ２を呼び出す時にはデータｄ２を、関数ｆｕｎｃ３を呼び出す時にはデータｄ３を、関数ｆｕｎｃ４を呼び出す時にはデータｄ４を引数として渡す。
【００４９】
ソースコードＳＣ１の行番号の３１３行から３１９行では、上位の関数ｆｕｎｃ０から呼び出される関数ｆｕｎｃ１（下位関数）を定義している。同じく下位関数ｆｕｎｃ２、ｆｕｎｃ３、ｆｕｎｃ４の定義は図３に記載していないが、関数ｆｕｎｃ１と同様である。関数ｆｕｎｃ１は、処理１＿１、処理１＿２、処理１＿３、処理１＿４を実行する。処理１＿１はデータｄ［０〜７］、処理１＿２はデータｄ［８〜１５］、処理１＿３はデータｄ［１６〜２３］、処理１＿４はデータｄ［２４〜３１］に対して処理を行う。なお、データｄには呼び出し元からｄ１が渡されているため、データｄ［０〜３１］の実体はデータｄ１［０］〜ｄ１［３１］である。
【００５０】
図４は、図３のソースコードＳＣ１にプリフェッチ命令を付加せずに図１の制御システムで実行した場合の処理時間を示すタイミングチャートの例である。なお、処理時間は命令コードやデータがキャッシュメモリ１０８に格納されているかどうかによって異なるが、制御装置では最悪ケースの処理時間が重要である場合が多いため、ここでは最悪ケースの処理時間として、全ての命令コードとデータがキャッシュメモリ１０８に格納されていないケースの処理時間を示した。
【００５１】
図４の処理時間を示すタイミングチャートでは、左側にＣＰＵ１０６の処理時間、右側にＲＡＭ１１６、またはＲＯＭ１１８からキャッシュメモリ１０８に対する転送処理完了のタイミングを示しており、上から下に時間経過を表している。
【００５２】
図３のソースコードＳＣ１によれば、関数ｆｕｎｃ１（ｄ１）の処理を行った後、以下順次関数ｆｕｎｃ２（ｄ２）、ｆｕｎｃ３（ｄ３）、ｆｕｎｃ４（ｄ４）の処理を行う。図４には、一連の処理のうち、関数ｆｕｎｃ１（ｄ１）の処理を行った後、次の関数ｆｕｎｃ２（ｄ２）の処理を開始した部分までを拡大して示している。また関数ｆｕｎｃ１（ｄ１）の処理では、例えばＲＡＭ１１６、またはＲＯＭ１１８からキャッシュメモリ１０８にデータを読み出してくる処理を含む場合を例にとっている。
【００５３】
関数ｆｕｎｃ１（ｄ１）の処理では１２８バイトの領域のデータを取り扱うため、個別の分割処理である処理１＿１、処理１＿２、処理１＿３、処理１＿４の処理ではそれぞれ３２バイトの領域のデータを取り扱うことになる。
【００５４】
関数ｆｕｎｃ１（ｄ１）についての、最初の個別の分割処理である処理１＿１を実行するためには、処理１＿１の命令コードとデータｄ１［０〜７］のデータが必要であるが、これらはＲＡＭ１１６、またはＲＯＭ１１８からキャッシュメモリ１０８に転送する必要があるため、ＣＰＵ１０６に待ち時間ＴＬ１が発生する。処理１＿２、処理１＿３、処理１＿４、及びｆｕｎｃ２の処理２＿１、処理２＿２も同様であり、それぞれ待ち時間をＴＬ２、ＴＬ３、ＴＬ４として表記している。図４には示していないが、同様の動作がｆｕｎｃ４の処理４＿４まで繰り返される。
【００５５】
図４の場合、ソースコードＳＣ１にプリフェッチ命令を付加せずに図１の制御システムで実行している。つまり、キャッシュメモリ１０８が動作してＲＡＭ１１６、またはＲＯＭ１１８からデータを読み出してくると初めてＣＰＵ１０６の処理が可能になる。別の言い方をすると、ＣＰＵ１０６はキャッシュメモリ１０８の処理に関与せず、データを受けて受動的に処理を行っている。
【００５６】
図４によれば、ＣＰＵ１０６の処理の開始に先立つ待ち時間がその都度発生していることがわかる。結果として、ＣＰＵ１０６の処理時間の半分を待ち時間が占め、ピーク性能（待ち時間の無かった場合の性能）と比べると半分の性能しか得られない。
【００５７】
図４に示した処理（プリフェッチ命令を付加せず）時の待ち時間発生を軽減すべく、本発明においては図５のプリフェッチ命令対応処理を採用する。図５の場合には、ＣＰＵ１０６からのプリフェッチ命令を受けて、キャッシュメモリ１０８が動作してＲＡＭ１１６、またはＲＯＭ１１８からデータを読み出してくる。
【００５８】
図５は、図３のソースコードの上位関数ｆｕｎｃ０にプリフェッチ命令を付加した実施例１のソースコードを示ており、図２のプリフェッチ付ソースコード２０８の一部に相当する。以下、図３のソースコードＳＣ１からの変更点を主体に説明する。ソースコードは、行番号に対比して記述されている。本発明の説明における他の部分で使用するソースコードと区別する意味で、図５のソースコードをＳＣ２と表記する。
【００５９】
ソースコードＳＣ２の行番号のうち、先頭行である５０１行から５０４は、図３のソースコードＳＣ１と同じであるので、説明を省略する。
【００６０】
ソースコードＳＣ２の行番号のうち、５０６行から５１３行はプリフェッチを行うアドレスを定義したものであり、図２の実行順序情報２０４、または、図３のソースコードの解析に基づいて生成されたものである。
【００６１】
アドレス定義部分のうち、５０６行目のａｄｒ＿ｆ１は、処理１＿１、処理１＿２、処理１＿３、処理１＿４の命令コードの先頭アドレスを格納する。ここでは、各処理の先頭アドレスが３２バイト境界の先頭にあり、かつ、各処理の命令コードの合計サイズはそれぞれ３２バイトと仮定した。従って、例えば処理１＿１の先頭アドレスにプリフェッチ命令を実行すると、処理１＿１の命令コード全てがキャッシュメモリ１０８に転送されることになる。処理１＿２、処理１＿３、処理１＿４も同様である。
【００６２】
ソースコードＳＣ２の行番号のうち、５０７行のａｄｒ＿ｄ１は、データｄ１［０］、ｄ１［８］、ｄ１［１６］、ｄ１［２４］のアドレスを格納する。データｄ１の各要素は４バイトであり、ｄ１［０〜７］の８要素で３２バイトとなるため、データｄ１［０］のアドレスにプリフェッチ命令を実行すると、処理１＿１で使用するデータｄ１［０〜７］の３２バイト全てがキャッシュメモリ１０８に転送されることになる。データｄ１［８］、ｄ１［１６］、ｄ１［２４］に関しても同様である。
【００６３】
５０８行、５１０行、５１２行は５０６行と同様である。この部分によりほかの処理２、処理３、処理４についても、命令コードの先頭アドレスを格納する。５０９行、５１１行、５１３行は５０７行と同様である。この部分により他のデータｄ２、ｄ３、ｄ４についてもアドレスを格納する。
【００６４】
ソースコードＳＣ２の行番号のうち、５１５行から５１８行は関数ｆｕｎｃ１で使用する命令コード、及びデータをプリフェッチする処理である。ｉｐｒｅｆｅｔｃｈは命令コードをプリフェッチする命令を実行するための関数であり、ここではａｄｒ＿ｆ１に格納された処理１＿１、処理１＿２、処理１＿３、処理１＿４の命令コードの先頭アドレスに対する命令コードプリフェッチ命令を実行する。ｄｐｒｅｆｅｔｃｈはデータをプリフェッチする命令を実行するための関数であり、ここではａｄｒ＿ｄ１に格納されたデータｄ１［０］、ｄ１［８］、ｄ１［１６］、ｄ１［２４］のアドレスに対するデータプリフェッチ命令を実行する。
【００６５】
同様に、５１９行から５２２行は関数ｆｕｎｃ２で使用する命令コード、及びデータをプリフェッチする処理、５２４行から５２７行は関数ｆｕｎｃ３で使用する命令コード、及びデータをプリフェッチする処理、５２９行から５３２行は関数ｆｕｎｃ３で使用する命令コード、及びデータをプリフェッチする処理である。
【００６６】
図６は、図５のプリフェッチ付ソースコードＳＣ２を図１の制御システムで実行した場合の処理時間を示すタイミングチャートの第１の例である。図６の処理時間を示すタイミングチャートは、図４のタイミングチャートと同様に、左側にＣＰＵ１０６の処理時間、右側にＲＡＭ１１６、またはＲＯＭ１１８からキャッシュメモリ１０８に対する転送処理完了のタイミングを示しており、上から下に時間経過を表している。
【００６７】
なお図４のタイミングチャートでは、一連の処理のうち、関数ｆｕｎｃ１（ｄ１）の処理を行った後、次の関数ｆｕｎｃ２（ｄ２）の処理を開始した部分までを拡大して示しているが、図６では関数ｆｕｎｃ２（ｄ２）の処理を行った後、次の関数ｆｕｎｃ３（ｄ３）の処理を開始した部分までを拡大して示している。
【００６８】
図６の処理では、一連の処理開始前にプリフェッチ命令の開始を実行している。図６左側のＣＰＵ１０６の処理の先頭部分のプリフェッチ命令処理において、右斜線部分は命令コードプリフェッチ命令、左斜線部分はデータプリフェッチ命令を表しており、合計８組、１６個の命令コードとデータのプリフェッチ命令の開始を実行することを意味している。プリフェッチ命令の実行としては、最終的にデータ入手するまでをいうが、プリフェッチ命令の開始という時には、ＣＰＵ１０６における処理の開始時刻を意識している。
【００６９】
このようにＣＰＵ１０６はまず、図５の５１５行から５２２行に記載された１６個のプリフェッチ命令を実行する。ＣＰＵ１０６からのプリフェッチ命令を受けたキャッシュメモリ１０８によって、関数ｆｕｎｃ１、及び関数ｆｕｎｃ２で使用する命令コード、及びデータの、ＲＡＭ１１６、またはＲＯＭ１１８からキャッシュメモリ１０８への転送が起動される。
【００７０】
図６左右に示すＣＰＵ１０６の処理時間、並びに右側にＲＡＭ１１６、またはＲＯＭ１１８からキャッシュメモリ１０８に対する転送処理完了のタイミングの時刻を比較して明らかなように、ＣＰＵ１０６における図５の５１５行から５２２行に記載された１６個のプリフェッチ命令の実行には、Ｔ１時間を要する。これに対しキャッシュメモリ１０８への転送は、１処理当たり平均時間ｔ０で行われ、１６個のプリフェッチ命令に対するキャッシュメモリ１０８への転送完了は時刻Ｔ２である。このためプリフェッチ処理が完了した時刻（Ｔ１）では、３個の転送が完了し、関数ｆｕｎｃ１（ｄ１）の処理終了後の時刻では、１１個の転送が完了していることになる。
【００７１】
図６右側に図示したＲＡＭ１１６、またはＲＯＭ１１８からキャッシュメモリ１０８への転送の状況は、この先頭のプリフェッチ処理で行われた転送内容を具体的に示している。先頭のプリフェッチ処理では、処理１＿１、処理１＿２、処理１＿３、処理１＿４、処理２＿１、処理２＿２、処理２＿３、処理２＿４、ｄ１［０〜７］、ｄ１［８〜１５］、ｄ１［１６〜２３］、ｄ１［２４〜３１］、ｄ２［０〜７］、ｄ２［８〜１５］、ｄ２［１６〜２３］、ｄ２［２４〜３１］の転送が交互に行われる。
【００７２】
このようにしてＣＰＵ１０６が関数ｆｕｎｃ１（ｄ１）内の処理１＿１を開始する時点（Ｔ１）では、処理１＿１の命令コード、及び使用するデータ（ｄ１［０〜７］）のキャッシュメモリ１０８への転送が全て完了しているため、ＣＰＵ１０６はデータ転送の待ち時間なしに処理１＿１を実行することができる。同様に、処理１＿２の命令コード及び使用するデータ（ｄ１［８〜１５］）、処理１＿３の命令コード及び使用するデータ（ｄ１［１６〜２３］）、処理１＿４の命令コード及び使用するデータ（ｄ１［２４〜３１］）もデータ転送の待ち時間なしに実行することが可能である。
【００７３】
関数ｆｕｎｃ１の処理が終了すると、ＣＰＵ１０６は図５の５２４行から５２７行に記載された８個のプリフェッチ命令を実行する。これによって、関数ｆｕｎｃ３で使用する命令コード、及びデータのＲＡＭ１１６、またはＲＯＭ１１８からキャッシュメモリ１０８への転送が起動される。この時の事前転送内容が、処理３＿１、処理３＿２、処理３＿３、処理３＿４、データｄ３［０〜７］、ｄ３［８〜１５］、ｄ３［１６〜２３］、ｄ３［２４〜３１］である。
【００７４】
その後、ＣＰＵ１０６は関数ｆｕｎｃ２の処理を実行する。関数ｆｕｎｃ２の処理も関数ｆｕｎｃ１と同様にデータ転送の待ち時間なしに実行することが可能である。
【００７５】
関数ｆｕｎｃ２の処理が終了すると、ＣＰＵ１０６は図５の５２９行から５３２行に記載された８個のプリフェッチ命令を実行する。これによって、関数ｆｕｎｃ４で使用する命令コード、及びデータのＲＡＭ１１６、またはＲＯＭ１１８からキャッシュメモリ１０８への転送が起動される。図６には図示していないが、この時の事前転送内容が、処理４＿１、処理４＿２、処理４＿３、処理４＿４、データｄ４［０〜７］、ｄ４［８〜１５］、ｄ４［１６〜２３］、ｄ４［２４〜３１］である。
【００７６】
その後、図６では一部省略されているが、ＣＰＵ１０６は関数ｆｕｎｃ３、及び関数ｆｕｎｃ４の処理を実行する。関数ｆｕｎｃ３、ｆｕｎｃ４の処理も関数ｆｕｎｃ１、ｆｕｎｃ２と同様にデータ転送の待ち時間なしに実行することが可能である。
【００７７】
この様に、プリフェッチ命令を実行することにより、プリフェッチ命令を実行するための処理時間の増加はあるが、データ転送の待ち時間が発生しないため、図４に比べると処理時間が短縮され、実行性能が向上する。
【００７８】
図６のＣＰＵ側と転送側の時間関係をみると明らかなように、実施例１においては、要するに「ＣＰＵとメモリを有し、メモリに格納された命令コードをＣＰＵで実行しメモリに格納されたデータを処理する制御装置であって、ｎ番目に実行される関数の実行前にｎ＋１番目以降に実行される関数で使用する命令コード、または、データに対するプリフェッチ命令の開始を実行」したものということができる。
【００７９】
図６によれば、１番目に実行される関数ｆｕｎｃ１（ｄ１）の実行前に２番目以降に実行される関数ｆｕｎｃ２（ｄ２）で使用する命令コード（例えば処理２＿１、処理２＿２）、または、データ（例えばｄ２［０〜７］）に対するプリフェッチ命令（Ｔ１期間）の開始を実行している。
【実施例２】
【００８０】
次に実施例２について、説明する。ここでは図７により図６の場合の問題点を明確にし、図８、図９によりこの問題点を解決する実施例２の対応について説明する。
【００８１】
待ち時間が発生しない図６の処理は、キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が十分大きいことを想定している。ＣＰＵ１０６が最初の１６個のプリフェッチ命令を実行した段階（Ｔ１）では、最初の３個（処理１＿１、ｄ１［０〜７］、処理１＿２）の転送のみが終了しているため、キャッシュメモリ１０８は１３個のプリフェッチ命令を保持していることになる。キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が１２個以下の場合は、キャッシュメモリ１０８が保持できるプリフェッチ命令の最大数に到達後プリフェッチ命令の受け付けができなくなるため、ＣＰＵ１０６に待ち時間が発生することになる。この様な待ち時間が発生する具体例を、図７を用いて説明する。
【００８２】
図７は、図５のプリフェッチ付ソースコードを図１の制御システムで実行した場合の処理時間を示すタイミングチャートの第２の例であり、キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が４個であると仮定した場合のタイミングチャートである。
【００８３】
ＣＰＵ１０６が最初の４個のプリフェッチ命令を実行した段階（Ｔ１）で、キャッシュメモリ１０８が保持しているプリフェッチ命令の個数が最大の４個となり、キャッシュメモリ１０８は５個目のプリフェッチ命令を受け付けることができず、ＣＰＵ１０６に待ち時間（ＴＬ１）が発生する。１個目のプリフェッチ命令の転送（処理１＿１の命令コード）が終了して初めて、キャッシュメモリ１０８は５個目のプリフェッチ命令を受け付けることができるが、６個目のプリフェッチ命令は受け付けることができず、ＣＰＵ１０６に待ち時間（ＴＬ２）が発生する。以下同様に、７個目から１６個目のプリフェッチ命令に関しても、ＣＰＵ１０６に待ち時間ＴＬが発生する。
【００８４】
関数ｆｕｎｃ１実行後の８個のプリフェッチ命令に関しても同様であり、５個目から８個目のプリフェッチ命令でＣＰＵ１０６に待ち時間が発生する。
【００８５】
この様に、キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が少ない場合は、プリフェッチ命令を多数連続して実行するとＣＰＵ１０６に待ち時間が発生するため、プリフェッチ命令を一定の間隔をあけて実行するのが好ましい。実施例２では、キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が少ない場合における最適処理事例を説明する。最適処理事例では、待ち時間をさけられないとしても、待ち時間を極力短くする。
【００８６】
図８は、図３のソースコードの上位関数ｆｕｎｃ０にプリフェッチ命令を付加した実施例２のソースコードを示す図であり、キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が４個の場合に合わせて最適化されたソースコードＳＣ３である。
【００８７】
８０６行から８１５行はプリフェッチを行うアドレスの定義である。プリフェッチ対象は全体として見ると図５と同様であるが、分割の方法が異なっている。
【００８８】
８１７行から８２０行は関数ｆｕｎｃ１で使用する命令コード、及びデータの一部をプリフェッチする処理である。ｉｐｒｅｆｅｔｃｈはａｄｒ＿ｆ０に格納された処理１＿１、処理１＿２の命令コードの先頭アドレスに対する命令コードプリフェッチ命令を実行する。ｄｐｒｅｆｅｔｃｈはａｄｒ＿ｄ０に格納されたｄ１［０］、ｄ１［８］のアドレスに対するデータプリフェッチ命令を実行する。
【００８９】
８２１行はｆｕｎｃ１関数の呼び出しであるが、図３のソースコードに記載されている引数ｄ１以外に、プリフェッチ対象アドレスを格納したａｄｒ＿ｆ１、ａｄｒ＿ｄ１を渡す。
【００９０】
８２２行から８２４行も同様であり、関数ｆｕｎｃ２、ｆｕｎｃ３、ｆｕｎｃ４にプリフェッチ対象アドレスが渡される。
【００９１】
図９は、図３のソースコードの関数ｆｕｎｃ１にプリフェッチ命令を付加した実施例２のソースコードＳＣ４の例であり、図８の上位関数ｆｕｎｃ０のコード（図８の８０３行から８０５行）に対応したものである。
【００９２】
図９の９０４行、９０７行、９１０行、及び９１３行は引数ａｆに格納されたアドレスに対する命令コードプリフェッチ命令を実行する。９０５行、９０８行、９１１行、及び９１４行は引数ａｄに格納されたアドレスに対するデータプリフェッチ命令を実行する。
【００９３】
図９には記載していないが、関数ｆｕｎｃ２、ｆｕｎｃ３、ｆｕｎｃ４も同様である。但し、関数ｆｕｎｃ４に渡されるプリフェッチ対象アドレスは命令コード２個、データ２個であるため、図９の９１０行、９１１行、９１３行、９１４行のプリフェッチ命令は関数ｆｕｎｃ４では不要であり、削除する。
【００９４】
図１０は、図８、及び図９のプリフェッチ付ソースコード（ＳＣ３、ＳＣ４）を図１の制御システムで実行した場合の処理時間を示すタイミングチャートの例である。
【００９５】
ＣＰＵ１０６はまず、図８の８１７行から８２０行に対応する４個のプリフェッチ命令を実行する。キャッシュメモリ１０８が保持できるプリフェッチ命令の個数は４個であるため、これらのプリフェッチ命令ではＣＰＵ１０６に待ち時間は発生しない。
【００９６】
４個のプリフェッチ命令の実行が終了すると、ＣＰＵ１０６は関数ｆｕｎｃ１の実行を開始する。但し処理１＿１は、必要な命令コード（処理１＿１）とデータ（ｄ［０〜７］）の転送が終了するまで処理が開始できないため、ＣＰＵ１０６に待ち時間ＴＬが発生する。
【００９７】
処理１＿１が終了すると、ＣＰＵ１０６は図９の９０４行、９０５行に対応する５個目と６個目のプリフェッチ命令を実行する。この時点で過去に実行された４個のプリフェッチ命令の転送は全て終了しているため、ＣＰＵ１０６に待ち時間が発生することなく、５個目と６個目のプリフェッチ命令を実行することが可能である。
【００９８】
以下同様であり、図１０では一部省略されているが、処理１＿２から関数ｆｕｎｃ４の終了までＣＰＵ１０６に待ち時間が発生することなく処理を行うことができる。
【００９９】
この様に、下位の関数（ｆｕｎｃ１、ｆｕｎｃ２、ｆｕｎｃ３、ｆｕｎｃ４）の中で間隔をあけてプリフェッチ命令を実行することにより、キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が少ない場合でも、待ち時間を発生することなくプリフェッチ命令を実行することが可能である。また、関数ｆｕｎｃ１の中で、関数ｆｕｎｃ２で使用する命令コード、及びデータの一部に対するプリフェッチ命令を実行することにより、関数ｆｕｎｃ２は全く待ち時間無く実行することが可能である。関数ｆｕｎｃ３、ｆｕｎｃ４も同様に、全く待ち時間無く実行することが可能である。
【０１００】
図１０のＣＰＵ側と転送側の時間関係をみると明らかなように、実施例２においては、要するに「ＣＰＵとメモリを有し、メモリに格納された命令コードをＣＰＵで実行しメモリに格納されたデータを処理する制御装置であって、ｎ番目に実行される関数の実行中にｎ＋１番目以降に実行される関数で使用する命令コード、または、データに対するプリフェッチ命令の開始を実行」したものということができる。
【０１０１】
図６によれば、１番目に実行される関数ｆｕｎｃ１（ｄ１）の実行中に２番目以降に実行される関数ｆｕｎｃ２（ｄ２）で使用する命令コード（例えば処理２＿１）、または、データ（例えばｄ２［０〜７］）に対するプリフェッチ命令（処理１＿４に対応する期間）の開始を実行している。
【実施例３】
【０１０２】
実施例３でも、キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が十分大きくない場合の対応策を示している。この事例では、図２のソースコード２０２（ＳＣ１）は図１１のように構成され、プリフェッチ付ソースコードが図１２、図１３のように構成され、この結果としての処理タイミングを図１４に示して説明する。
【０１０３】
まず図１１は、図１の制御システムのＣＰＵ１０６の処理内容の一部を示すソースコードＳＣ１の第２の例（ソースコードＳＣ５）である。図３のソースコードＳＣ１と図１１のソースコード５の違いは、同一の関数（ｆｕｎｃ）を、引数を変えて４回呼び出している点（１１０７行から１１１０行）である。
【０１０４】
図１２は、図１１のソースコードＳＣ５の上位関数ｆｕｎｃ０にプリフェッチ命令を付加した実施例３のソースコードＳＣ６の例である。
【０１０５】
同一の関数（ｆｕｎｃ）を４回呼び出しているため、命令コードのプリフェッチは処理１、処理２、処理３、処理４の４回のみで良い。そこで、１２０６行のａｄｒ＿ｆ０と１２０８行のａｄｒ＿ｆ１にこれら４個のアドレスを格納している。１２１８行から１２２１行で４回ｆｕｎｃを呼び出しているが、命令コードプリフェッチのアドレスとしては、全てに対してａｄｒ＿ｆ１を渡している。処理３、処理４の命令コードの転送は１２１８行のｆｕｎｃ関数で実行されるため、１２１９行から１２２１行の関数ｆｕｎｃでは命令コードのプリフェッチは不要であるが、同一の関数を使用するため何らかのアドレスを渡す必要がある。ａｄｒ＿ｆ１を渡した場合、１２１９行から１２２１行の関数ｆｕｎｃでは対応する命令コードはキャッシュメモリ１０８に既に格納されているため、データの転送は行われず、不要なデータ転送が行われないという意味で好ましい。
【０１０６】
データのプリフェッチに関しては、１２１２行のａｄｒ＿ｄ４の前半２個（ｄ４［１６］、ｄ４［２４］）で全てのデータのプリフェッチが完了するが、関数ｆｕｎｃには４個のアドレスを渡す必要があるため、後半２個（ｄ４［０］、ｄ４［８］）は１２１１行のａｄｒ＿ｄ３の後半２個と同一のアドレスとしている。１２２０行の関数ｆｕｎｃの呼び出しでａｄｒ＿ｄ３のアドレスのプリフェッチが行われるため、１２２１行のｆｕｎｃの呼び出しでａｄｒ＿ｄ４のプリフェッチを行う際には後半２個はキャッシュメモリ１０８に既に格納されているため、データの転送は行われず、不要なデータ転送が行われないという意味で好ましい。
【０１０７】
図１３は、図１１のソースコードの関数ｆｕｎｃにプリフェッチ命令を付加した実施例３のソースコードＳＣ７の例である。
【０１０８】
引数ａｆで渡される命令コードプリフェッチのアドレスは２個であるため、１３０４行、及び１３０７行で対応するアドレスの命令コードプリフェッチ命令を実行する。
【０１０９】
引数ａｄで渡されるデータプリフェッチのアドレスは４個であるため、１３０５行、１３０８行、１３１０行、１３１２行で対応するアドレスのデータプリフェッチ命令を実行する。
【０１１０】
図１４は、図１２、及び図１３のプリフェッチ付ソースコード（ＳＣ６、ＳＣ７）を図１の制御システムで実行した場合の処理時間を示すタイミングチャートの例である。
【０１１１】
命令コードに関しては、上位関数と関数ｆｕｎｃ（ｄ１）の命令コードプリフェッチ命令で必要な全ての命令コードの転送が完了するため、関数ｆｕｎｃ（ｄ２）、及び関数ｆｕｎｃ（ｄ３）で実行される命令コードプリフェッチ命令では命令コードの転送は行われない。図１４では省略されているが、関数ｆｕｎｃ（ｄ４）で実行される命令コードプリフェッチ命令でも命令コードの転送は行われない。
【０１１２】
図１４では、最初の下位関数の実行（ｆｕｎｃ（ｄ１）の処理１）で待ち時間ＴＬが発生するのみで、それ以外には待ち時間が発生せず、プリフェッチ命令により実行性能が向上していることがわかる。この様に、下位の関数にプリフェッチ対象アドレスを引数として渡すことで、同一の関数を複数回実行する場合でも、適切なアドレスのプリフェッチ命令を実行することが可能となる。
【０１１３】
図１４のＣＰＵ側と転送側の時間関係をみると明らかなように、実施例３においては、要するに「ＣＰＵとメモリを有し、メモリに格納された命令コードをＣＰＵで実行しメモリに格納されたデータを処理する制御装置であって、ｎ番目に実行される関数の実行前にｎ＋１番目以降に実行される関数で使用する命令コード、または、データに対するプリフェッチ命令の開始を実行」したものということができる。
【０１１４】
図１４によれば、１番目に実行される関数ｆｕｎｃ１（ｄ１）の実行前に２番目以降に実行される関数ｆｕｎｃ２（ｄ２）で使用する命令コード（例えば処理１、処理２）に対するプリフェッチ命令の開始を実行している。
【０１１５】
また図１４のＣＰＵ側と転送側の時間関係をみると明らかなように、実施例３においては、要するに「ＣＰＵとメモリを有し、メモリに格納された命令コードをＣＰＵで実行しメモリに格納されたデータを処理する制御装置であって、ｎ番目に実行される関数の実行中にｎ＋１番目以降に実行される関数で使用する命令コード、または、データに対するプリフェッチ命令の開始を実行」したものということができる。
【０１１６】
図１４によれば、１番目に実行される関数ｆｕｎｃ１（ｄ１）の実行中に２番目以降に実行される関数ｆｕｎｃ２（ｄ２）で使用するデータ（例えばｄ２［０〜７］）に対するプリフェッチ命令の開始を実行している。
【実施例４】
【０１１７】
実施例４でも、キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が十分大きくない場合の対応策を示している。この事例では、図２のソースコード２０２（ＳＣ１）は図１５のように構成され、プリフェッチ付ソースコードが図１６、図１７のように構成され、この結果としての処理タイミングを図１８に示して説明する。
【０１１８】
図１５は、図１の制御システムのＣＰＵ１０６の処理内容の一部を示すソースコードＳＣ１の第３の例（ソースコードＳＣ８）を示す図である。関数ｆｕｎｃ２ａ、ｆｕｎｃ２ｂ、ｆｕｎｃ３、ｆｕｎｃ４の定義は図１５に記載していないが、関数ｆｕｎｃ１と同様である。図３のソースコードＳＣ１との違いは、１５０８行及び１５０９行に条件１による条件分岐があり、条件１が成立した場合は関数ｆｕｎｃ２ａを、成立しなかった場合は関数ｆｕｎｃ２ｂを実行する点である。
【０１１９】
図１６は、図１５のソースコードの上位関数ｆｕｎｃ０にプリフェッチ命令を付加した実施例４のソースコードＳＣ９の例であり、キャッシュメモリ１０８が保持できるプリフェッチ命令の個数が４個の場合に合わせて最適化されたソースコードである。
【０１２０】
１６０６行から１６１６行はプリフェッチを行うアドレスの定義である。
【０１２１】
１６１８行から１６２０行は関数ｆｕｎｃ１で使用する命令コード、及びデータの一部をプリフェッチする処理である。ｉｐｒｅｆｅｔｃｈはａｄｒ＿ｆ０に格納された処理１＿１、処理１＿２の命令コードの先頭アドレスに対する命令コードプリフェッチ命令を実行する。ｄｐｒｅｆｅｔｃｈはａｄｒ＿ｄ０に格納されたｄ１［０］のアドレスに対するデータプリフェッチ命令を実行する。
【０１２２】
１６２１行は関数ｆｕｎｃ１の呼び出しであるが、図１５のソースコードに記載されている引数ｄ１以外に、プリフェッチ対象アドレスを格納したａｄｒ＿ｆ１、ａｄｒ＿ｄ１を渡す。ここで、ａｄｒ＿ｆ１の後半２要素には関数ｆｕｎｃ２ａの最初の処理（処理２ａ＿１）、及び、関数ｆｕｎｃ２ｂの最初の処理（処理２ｂ＿１）のアドレスが格納されており、関数ｆｕｎｃ１の中でこれらに対する命令コードプリフェッチ命令が実行される。これによって、条件１が成立した場合もそうでない場合も関数ｆｕｎｃ１の次に実行する関数の先頭の処理の命令コードが予め転送されるため、待ち時間なしに処理を行うことが可能となる。
【０１２３】
１６２２行は条件１が成立した場合に関数ｆｕｎｃ２ａを呼び出す記述である。関数ｆｕｎｃ２ａに渡されるａｄｒ＿ｆ２ａには、関数ｆｕｎｃ２ａの２番目以降の処理のアドレスが格納されており、関数ｆｕｎｃ２ａの中でこれらの命令コードに対する命令コードプリフェッチ命令を実行することで、待ち時間なしに処理を行うことが可能となる。
【０１２４】
１６２３行は条件１が成立しなかった場合に関数ｆｕｎｃ２ｂを呼び出す記述である。１６２２行と同様に、ａｄｒ＿ｆ２ｂには関数ｆｕｎｃ２ｂの２番目以降の処理のアドレスが格納されており、関数ｆｕｎｃ２ｂの中でこれらの命令コードに対する命令コードプリフェッチ命令を実行することで、待ち時間なしに処理を行うことが可能となる。
【０１２５】
１６２４行から１６２５行も同様であり、関数ｆｕｎｃ３、ｆｕｎｃ４にプリフェッチ対象アドレスが渡される。
【０１２６】
図１７は、図１５のソースコードの関数ｆｕｎｃ１にプリフェッチ命令を付加した実施例４のソースコードＳＣ１０の例であり、図１６の上位関数ｆｕｎｃ０のコードに対応したものである。
【０１２７】
１７０３行、１７０６行、１７０９行、及び１７１２行は引数ａｄに格納されたアドレスに対するデータプリフェッチ命令を実行する。１７０４行、１７０７行、１７１０行、及び１７１３行は引数ａｆに格納されたアドレスに対する命令コードプリフェッチ命令を実行する。
【０１２８】
図１７には記載していないが、関数ｆｕｎｃ２ａ、ｆｕｎｃ２ｂ、ｆｕｎｃ３、ｆｕｎｃ４も同様である。但し、関数ｆｕｎｃ４に渡されるプリフェッチ対象アドレスは命令コード３個、データ３個であるため、図１７の、１７１２行、１７１３行のプリフェッチ命令は関数ｆｕｎｃ４では不要であり、削除する。
【０１２９】
図１８は、図１６、及び図１７のプリフェッチ付ソースコードを図１の制御システムで実行した場合の処理時間を示すタイミングチャートの例である。
【０１３０】
ＣＰＵ１０６はまず、図１６の１６１８行から１６２０行に対応する３個のプリフェッチ命令を実行する。キャッシュメモリ１０８が保持できるプリフェッチ命令の個数は４個であるため、これらのプリフェッチ命令ではＣＰＵ１０６に待ち時間は発生しない。
【０１３１】
３個のプリフェッチ命令の実行が終了すると、ＣＰＵ１０６は関数ｆｕｎｃ１の実行を開始する。ｄ１［８〜１５］のデータプリフェッチ命令は待ち時間無く実行することが可能である。
【０１３２】
ｄ１［８〜１５］のデータプリフェッチ命令を実行するとキャッシュメモリ１０８が４つのプリフェッチ命令を保持することとなるため、最初の命令コードプリフェッチ命令（処理１＿１）が終了するまで、処理１＿３の命令コードプリフェッチ命令は待たされる。
【０１３３】
処理１＿１は、必要な命令コード（処理１＿１）とデータ（ｄ［０］〜ｄ［７］）の転送が終了するまで処理が開始できないため、ＣＰＵ１０６に待ち時間ＴＬが発生する。
【０１３４】
処理１＿１開始以降は、ＣＰＵ１０６は待ち時間無く処理を継続することが可能である。図１８は条件１が成立せず関数ｆｕｎｃ２ｂを実行するケースを記載したが、条件１が成立してｆｕｎｃ２ａを実行する場合でも、関数ｆｕｎｃ１の中で処理２ａ＿１の命令コードプリフェッチ命令を実行しているため、待ち時間無く処理することが可能である。
【０１３５】
この様に、条件１が成立した場合としない場合の両方のケースの処理に対する命令コードプリフェッチ命令を実行することで、条件１が成立するかしないかによらず、待ち時間無く処理を行うことができる。
【０１３６】
図１６から図１８に示す実施例４では、処理するデータに関しては条件１が成立するかどうかによらず同一であるが、条件１が成立するかどうかによって処理するデータが異なる場合も考えられる。その場合は、両方のデータに対するデータプリフェッチ命令を実行することで、条件１が成立するかどうかによらず待ち時間無く処理を行うことができる。
【０１３７】
また、図１６から図１８に示す実施例４では、上位の関数で条件分岐が行われるケースを記載したが、下位の関数で条件分岐が行われるケースでも同様であり、条件が成立した場合と成立しなかった場合の両方の処理に対する命令コードプリフェッチ命令、データプリフェッチ命令を実行することで、条件が成立するかどうかによらず待ち時間無く処理を行うことができる。
【０１３８】
図１８のＣＰＵ側と転送側の時間関係をみると明らかなように、実施例４においては、要するに「ＣＰＵとメモリを有し、メモリに格納された命令コードをＣＰＵで実行しメモリに格納されたデータを処理する制御装置であって、ｎ番目に実行される関数の実行中にｎ＋１番目以降に実行される関数で使用する命令コード、または、データに対するプリフェッチ命令の開始を実行」したものということができる。
【０１３９】
図１４によれば、１番目に実行される関数ｆｕｎｃ１（ｄ１）の実行中に２番目以降に実行される関数ｆｕｎｃ２（ｄ２）で使用する命令コード（例えば処理２ａ＿１、処理２ｂ＿１）、またはデータ（例えばｄ２［０〜７］）に対するプリフェッチ命令の開始を実行している。
【実施例５】
【０１４０】
図１９は、図１の制御システムのＲＯＭ１１８に格納する命令コードを生成する処理フローの第２の例である。図２との違いは、プリフェッチ付加２０６とコンパイル２１０のステップを一体化し、プリフェッチ付加コンパイル１９０６とした点である。これによって、図２と比べて処理ステップ数が減少し、プリフェッチ付命令コードの生成が容易化されるというメリットがある。
【符号の説明】
【０１４１】
１０２：制御装置
１０６：ＣＰＵ
１０８：キャッシュメモリ
１１６：ＲＡＭ
１１８：ＲＯＭ
２０２：ソースコード
２０４：実行順序に関する情報
２０６：プリフェッチ命令を付加するステップ
２０８：プリフェッチ命令が付加されたソースコード
２１０：命令コードを生成するステップ
２１２：プリフェッチ命令が付加された命令コード
１９０６：プリフェッチ命令を付加し命令コードを生成するステップ
【図１】
2016115232.tif 000003
【図２】
2016115232.tif 000004
【図３】
2016115232.tif 000005
【図４】
2016115232.tif 000006
【図５】
2016115232.tif 000007
【図６】
2016115232.tif 000008
【図７】
2016115232.tif 000009
【図８】
2016115232.tif 000010
【図９】
2016115232.tif 000011
【図１０】
2016115232.tif 000012
【図１１】
2016115232.tif 000013
【図１２】
2016115232.tif 000014
【図１３】
2016115232.tif 000015
【図１４】
2016115232.tif 000016
【図１５】
2016115232.tif 000017
【図１６】
2016115232.tif 000018
【図１７】
2016115232.tif 000019
【図１８】
2016115232.tif 000020
【図１９】
2016115232.tif 000021