(57)【要約】【課題】マルチスレッド方式などにおいて、汎用レジスタを有効に使用して、結果的にメモリアクセスのレイテンシを向上させて、プログラムの実行性能を向上させることにある。【解決手段】多数の汎用レジスタからなるレジスタファイル１３０を有するマルチスレッド方式などのマイクロプロセッサ１０において、プログラムの実行単位モジュールであるスレッド毎に使用するレジスタ数に応じて、汎用レジスタを割当てるための命令コードオフセットデータを作成する。【選択図】      図１
2005129001.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの実行単位モジュールを格納する記憶部と、
前記実行単位モジュールに必要なレジスタ群から構成されるレジスタファイルと、
前記実行単位モジュールが使用するレジスタ数に基づいて前記レジスタファイルのレジスタ番号の開始を示す開始情報を作成し、当該開始情報に従って前記レジスタファイルから前記実行単位モジュール毎にレジスタを割当てるレジスタ割当て手段と
を具備したことを特徴とするプログラム実行装置。
【請求項２】
前記実行単位モジュールは、スレッド単位またはコルーチン単位のプログラム単位モジュールであることを特徴とする請求項１に記載のプログラム実行装置。
【請求項３】
前記レジスタ割当て手段は、前記記憶部に転送される前記実行単位モジュールがプログラムファイルからメインメモリにロードされるプログラムロード時に、前記実行単位モジュールに対して前記開始情報を使ってプログラムコードに変換することを特徴とする請求項１に記載のプログラム実行装置。
【請求項４】
前記レジスタ割当て手段は、前記レジスタ番号の開始情報を使って、命令フォーマットのタイプ毎に前記開始情報を指定するためのオフセット値をセットした命令コードオフセットデータを作成し、
前記実行単位モジュールに含まれる全ての命令コードに対して当該命令コードオフセットデータを加算する処理を実行することを特徴とする請求項１に記載のプログラム実行装置。
【請求項５】
前記開始情報は、手続き呼出し用のレジスタの開始オフセット番号であることを特徴とする請求項１に記載のプログラム実行装置。
【請求項６】
メインメモリにロードされたプログラムの実行単位モジュールのうち、当該メインメモリから転送される前記実行単位モジュールを格納するローカルメモリと、
前記メインメモリから前記ローカルメモリへのデータ転送を実行するＤＭＡコントローラと、
前記実行単位モジュールの実行時に必要な汎用レジスタ群から構成されるレジスタファイルと、
プログラムファイルから前記メインメモリへのプログラムロード時に、前記実行単位モジュールが使用するレジスタ数及び手続き呼出し用のレジスタ番号の開始を示す開始情報に従って、前記レジスタファイルに含まれるレジスタを前記実行単位モジュール毎に割当てるレジスタ割当て手段と
を具備したことを特徴とするマイクロプロセッサ。
【請求項７】
前記レジスタ割当て手段は、前記プログラムロード時に、前記レジスタ番号の開始情報を使って、命令フォーマットのタイプ毎に前記開始情報を指定するためのオフセット値をセットした命令コードオフセットデータを作成し、
前記実行単位モジュールに含まれる全ての命令コードに対して当該命令コードオフセットデータを加算する処理を実行することを特徴とする請求項６に記載のマイクロプロセッサ。
【請求項８】
前記実行単位モジュールは、プログラムを分割した実行処理単位プログラムであり、前記メインメモリから前記ローカルメモリへのＤＭＡ転送を実行するためのＤＭＡコマンドを発行する機能を実行し、当該ＤＭＡコマンドの実行完了前に分割された実行処理を終了するように構成されていることを特徴とする請求項１に記載のプログラム実行装置または請求項６に記載のマイクロプロセッサ。
【請求項９】
プログラムの実行単位モジュールを格納するローカルメモリと、前記実行単位モジュールに必要なレジスタ群から構成されるレジスタファイルとを有するプロセッサに適用するプログラム実行方法であって、
前記実行単位モジュールが使用するレジスタ数に基づいて、前記レジスタファイルからレジスタ番号の開始を示す開始情報を取得する手順と、
前記開始情報に従って、前記レジスタファイルに含まれるレジスタを前記実行単位モジュール毎に割当てる手順と
を有するプログラム実行方法。
【請求項１０】
前記割当て手順は、前記ローカルメモリに転送される前記実行単位モジュールがプログラムファイルからメインメモリにロードされるプログラムロード時に、前記実行単位モジュールに対して前記開始情報を付与することを特徴とする請求項９に記載のプログラム実行方法。
【請求項１１】
前記割当て手順は、
前記開始情報を指定するためのオフセット値を取得する手順と、
前記レジスタ番号の開始情報を使って、命令フォーマットのタイプ毎に前記オフセット値を当該レジスタ番号フィールドにセットした命令コードオフセットデータを作成する手順と、
前記実行単位モジュールに含まれる全ての命令コードに対して当該命令コードオフセットデータを加算する処理を実行する手順と
を含むことを特徴とする請求項９に記載のプログラム実行方法。
【請求項１２】
マルチスレッド方式のマイクロプロセッサに適用するプログラム実行方法であって、
プログラムロード時に、レジスタファイルに含まれるレジスタバンクの中で、スレッド単位モジュールが使用するレジスタ番号の開始を設定するためのオフセット値を取得する手順と、
命令フォーマットのタイプ毎に前記オフセット値をセットした命令コードオフセットデータを作成する手順と、
前記スレッド単位モジュールに含まれる全ての命令コードに対して当該命令コードオフセットデータを使ってプログラムコードに変換する処理を実行する手順と
を有することを特徴とするプログラム実行方法。
【請求項１３】
プログラムを格納するメモリ手段と、
コンテキスト切り替えポイントが含まれるソースプログラムからオブジェクトコードからなるオブジェクトファイルを生成するときに、当該コンテキスト切り替えポイントに基づいてコンテキスト用レジスタを割り当てるためのレジスタ情報を前記オブジェクトファイルに付与するコンパイラ手段と、
前記コンパイラ手段により生成された前記オブジェクトファイルから前記レジスタ情報を取得して、当該レジスタ情報に基づいて前記コンテキスト用レジスタとして使用するレジスタ領域を前記メモリ手段の空き領域に割り当てるレジスタ割り当て処理手段と
を具備したことを特徴とするプログラム実行装置。
【請求項１４】
前記コンパイラ手段は、通常コンパイル処理を実行するフェーズとレジスタ割り当て処理を実行するフェーズとを含み、
当該レジスタ割り当て処理を実行するフェーズにおいて、前記コンテキスト切り替えポイントで有効なデータを保持しているレジスタの和集合を前記レジスタ情報として生成することを特徴とする請求項１３に記載のプログラム実行装置。
【請求項１５】
前記レジスタ割り当て処理手段は、前記コンパイラ手段により生成された前記オブジェクトファイルを前記メモリ手段にロードするプログラムローダに含まれることを特徴とする請求項１３又は請求項１４のいずれか１項に記載のプログラム実行装置。
【請求項１６】
前記レジスタ情報は、前記コンテキスト切り替えポイントを示す情報、前記コンテキスト用レジスタとして使用するレジスタ領域の範囲を示すレジスタ番号の最大値、及び当該レジスタ番号の最小値を含むことを特徴とする請求項１３又は請求項１４のいずれか１項に記載のプログラム実行装置。
【請求項１７】
前記コンパイラ手段は、前記ソースプログラムからスレッド単位のスレッドオブジェクトをコンパイル処理し、
前記レジスタ割り当て処理手段は、前記コンパイラ手段により生成された前記スレッドオブジェクトを実行するスレッドライブラリに含まれることを特徴とする請求項１３又は請求項１４のいずれか１項に記載のプログラム実行装置。
【請求項１８】
前記レジスタ割り当て処理手段は、前記メモリ手段に用意されているレジスタ利用状況を管理するテーブル情報を使用して、前記コンテキスト用レジスタとして使用するレジスタ領域の範囲に相当するメモリ空き領域を前記メモリ手段で確保することを特徴とする請求項１３から請求項１７のいずれか１項に記載のプログラム実行装置。
【請求項１９】
前記コンパイラ手段は、前記コンテキスト用レジスタとして使用するレジスタと、それ以外で使用するレジスタとを区別して前記オブジェクトファイルに記録することを特徴とする請求項１３から請求項１８のいずれか１項に記載のプログラム実行装置。
【請求項２０】
前記請求項１３から請求項１９のいずれか１項に記載のプログラム実行装置を含むことを特徴とするマイクロプロセッサ。
【請求項２１】
ソースプログラムをコンパイルしたオブジェクトファイルを格納するメモリ手段と、前記オブジェクトファイルの実行単位モジュールに必要なレジスタ群を確保するためのレジスタファイルとを有するプロセッサに適用するプログラム実行方法であって、
コンテキスト切り替えポイントが含まれるソースプログラムを、オブジェクトコードからなるオブジェクトファイルを生成するときに、当該コンテキスト切り替えポイントに基づいてコンテキスト用レジスタとして使用するレジスタを割り当てるためのレジスタ情報を前記オブジェクトファイルに付与するコンパイラ機能と、
前記オブジェクトファイルを前記メモリ手段にロードする機能と、
前記メモリ手段にロードされた前記オブジェクトファイルから前記レジスタ情報を取得して、当該レジスタ情報に基づいて前記コンテキスト用レジスタとして使用するレジスタ領域を前記レジスタファイルに割り当てるレジスタ割り当て処理機能と
を具備したことを特徴とするプログラム実行方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般的にはマイクロプロセッサのプログラム実行方式に関し、特に、スレッドなどの実行単位モジュールに対するレジスタ割当て機能を改善したプログラム実行技術に関する。
【背景技術】
【０００２】
一般的に、マイクロプロセッサでは、クロック周波数が高くなるにしたがって、メモリアクセスのレイテンシ（latency）がプロセッサの性能、換言すればプログラムの実行性能のボトルネックになっている。
【０００３】
この問題を解決するために、キャッシュメモリの使用方法の改善や、マルチスレッド方式の改善などが推進されている。しかしながら、いずれの場合も、別の問題が発生し、必ずしも有効な解決方法はない。
【０００４】
一方、マイクロプロセッサの分野では、ＲＩＳＣ（Reduced Instruction Set Computer）方式のプロセッサなどのように、多数の汎用レジスタを実装して、データ処理時の中間データを可能な限りレジスタに保持することで、メモリへのデータの出し入れの回数（アクセス回数）を減らして、プログラムを高速に実行することが実現されている。即ち、ＲＩＳＣ方式は、メモリアクセスのレイテンシを向上させることが可能であるため、プログラムの実行性能を高める有効な方式である。
【０００５】
しかしながら、多数の汎用レジスタを使用するマイクロプロセッサでは、スレッド間のコンテキストスイッチのオーバーヘッドが大きくなるという問題が発生する。即ち、多くのレジスタを使って処理を遂行するために、スレッド切り替え時に、セーブ／リストアしなければならないレジスタの数が増大し、スレッド切り替えの応答速度が遅くなってしまうという問題がある。
【０００６】
このような問題を解決するために、スレッドなどの実行単位モジュールが使用する汎用レジスタを限定（固定）することで、特に、スレッド間のコンテキストスイッチのオーバーヘッド時間を短縮化できる方式が提案されている（例えば、特許文献１を参照）。
【０００７】
また、プログラムをモジュール化する場合、手続き呼び出し規約によって、レジスタの使用方法を規定することによって、手続き間での値の受け渡しや、手続きをまたがって値をレジスタに保持できるようにしているが、この制約によって、多くのレジスタを有効に利用することができないことがある。
【０００８】
この問題は、コンパイラの最適化処理において、インタープロシジャ・レジスタ割り当てを行う方式を採用することによって克服可能である（例えば、非特許文献１，２を参照）。しかしながら、このような方式では、すべての手続きを静的にリンクする必要があり、プログラム部品のモジュール性が損なわれてしまうという問題がある。
【特許文献１】特開２０００−２４２５０５号公報
【非特許文献１】Carl A. Waldspurger and William E. Weihl. Register Relocation: Flexible Contexts for Multithreading. In Proceedings of the 20th International symposium  on Computer Architecture (ISCA), pages 120~130, June 1993.
【非特許文献２】Gravinghoff. On the Realization of Fine-Grained Multithreading in Software. PhD Thesis,FB Informatik, FernUniversitat Hagen, defended Jan 2002.
【発明の開示】
【発明が解決しようとする課題】
【０００９】
先行技術の方式は、汎用レジスタを有効に使用していないため、メモリアクセスのレイテンシを向上させることができす、プログラムの実行性能を高めるためには有効とはいえない。
【００１０】
そこで、本発明の目的は、特に多数のレジスタを有するプログラム実行装置において、レジスタの利用効率を向上させることにより、メモリアクセスのレイテンシを向上させて、プログラムの実行性能を高めることにある。
【課題を解決するための手段】
【００１１】
本発明の観点に従ったプログラム実行装置は、プログラムの実行単位モジュールを格納する記憶部と、前記実行単位モジュールに必要なレジスタ群から構成されるレジスタファイルと、前記実行単位モジュールが使用するレジスタ数に基づいてレジスタ番号の開始を示す開始情報を作成し、当該開始情報に従って前記レジスタファイルから前記実行単位モジュール毎にレジスタに割当てるレジスタ割当て手段とを備えたものである。
【発明の効果】
【００１２】
本発明のプログラム実行装置であれば、特に汎用レジスタ等の多数のレジスタを有し、マルチスレッド方式などのマイクロプロセッサに適用した場合に、レジスタを有効に使用してレジスタの利用効率を向上させることにより、結果的にメモリアクセスのレイテンシを向上させて、プログラムの実行性能の向上を図ることができる。
【発明を実施するための最良の形態】
【００１３】
以下図面を参照して、本発明の実施形態を説明する。
【００１４】
（第１の実施形態）
図１は本実施形態に関するマイクロプロセッサ（ＭＰＵ）を要部とするプログラム実行装置のシステム構成を示すブロック図である。
【００１５】
ＭＰＵ１０は、例えばＲＩＳＣ方式のプロセッサであり、通常の演算ユニット（ＡＬＵ）１００と、高速にアクセス可能なローカルメモリ１１０と、ＤＭＡ（direct memory access）コントローラ１２０と、多数の汎用レジスタからなるレジスタファイル１３０とを有する。
【００１６】
ＤＭＡコントローラ１２０は、メインメモリ２０とローカルメモリ１１０間のデータ（プログラムを含む）の入出力を、ソフトウェアで制御可能なメモリアクセス機能を備えている。
【００１７】
プログラムファイル３０は、ハードウェアとしては例えばディスクドライブであり、ディスク媒体上に、コンパイラ及びプログラムローダなどを含むオペレーティングシステム（ＯＳ）３００や、各種のライブラリ３１０及びアプリケーション等のプログラムを格納している。ＭＰＵ１０は、これらのプログラム（ＯＳ、コンパイラ、プログラムローダを含む）を実行する。
【００１８】
（スレッドモデルでのプログラム実行方法）
本実施形態のプログラム実行方法は、通常のマルチスレッド方式に相当し、例えばライブラリ３１０のようなプログラム（サブルーチンも含む）を複数のスレッド（実行単位モジュール）に分割して実行する。本実施形態では、コンパイラが、プログラムをコンパイルするときに、各スレッドが使用するレジスタ数に応じて、レジスタファイル１３０に含まれる汎用レジスタ（例えばレジスタバンク）に割当てるレジスタ割当て機能を実現している。換言すれば、レジスタファイル１３０の多数の汎用レジスタを、複数のレジスタバンクに分割して管理し、各スレッドに割当てる処理を実行する。
【００１９】
以下、図２のフローチャート及び図３を参照して、スレッドモデルのレジスタ割当て処理を説明する。
【００２０】
ここでは、プログラムファイル３０から、例えばライブラリ３１０のようなプログラムがメインメモリ２０にロードされるプログラムロード時に、プログラムローダは、ライブラリ３１０の各スレッド毎に、スレッドが使用するレジスタ数に応じたレジスタバンク（複数の汎用レジスタ）の開始レジスタ番号を設定するためのオフセット（例えば図４に示す４１０）をプログラムファイル３０から取得する（ステップＳ１）。次に、プログラムローダは、取得したオフセットを設定した命令コードオフセットデータを作成し、メインメモリ２０に保存する（ステップＳ２）。
【００２１】
命令コードオフセットデータ２００は、図３（Ｂ）に示すように、命令フォーマットのタイプ（ここではタイプ１〜５）毎に、レジスタ番号フィールドに対応するオフセット（Ｎ）を設定したテーブル情報（即ち、レジスタ番号変換テーブル情報）である。命令フォーマットは、図３（Ａ）に示すように、命令コードとオペランド（ＯＰ１〜ＯＰ３）とから構成される。図３（Ａ）において、斜線のオペランドがレジスタ番号フィールドを意味する。なお、最初のデータ２００では、図３（Ｂ）に示すように、命令コードとしては、全て“０”が設定されている。
【００２２】
さらに、プログラムローダは、ロードするプログラム（ここではライブラリ３１０）の全ての命令コードに対して、命令コードオフセットデータ２００を付与する（ステップＳ３，Ｓ４）。このとき、データ２００の命令コードのフィールドには、当該命令コードが設定される。
【００２３】
以上のように本実施形態によれば、プログラムローダは、プログラムロード時に、各スレッド毎に、レジスタファイル１３０の汎用レジスタを割当てるための命令コードオフセットデータ２００を作成する。そして、全ての命令コードに対して、当該命令コードオフセットデータ２００を使用して、プログラムコードに変換する。これにより、ＭＰＵ１０では、メインメモリ２０からローカルメモリ１１０に転送されたプログラム（ここではライブラリ３１０）の各スレッド毎に、当該命令コードオフセットデータ２００に従って、自動的に、通常では複数の汎用レジスタ（レジスタバンク）が割当てられる。
【００２４】
ここで、本実施形態に関係するスレッド毎のレジスタ数は、図７に示すように、マルチスレッド方式のプログラム開発時に設定される。プログラム開発時の手順としては、プログラムを複数のスレッドに分割する（ステップＳ１０）。各スレッド毎に、必要なレジスタ数を求める（ステップＳ１１）。さらに、レジスタファイル１３０の汎用レジスタをレジスタバンクに分割し、各スレッドを割当てる（ステップＳ１２）。
【００２５】
次に、図６及び図８を参照して、マルチスレッド方式のプログラム実行手順を説明する。
【００２６】
図６は、スレッドの状態遷移を示す図である。即ち、スレッドの実行中の状態６００、ＤＭＡ完了待ち状態６１０、及び実行可能状態６２０を示す。
【００２７】
ＭＰＵ１０では、プログラムディスパッチャは、スレッドが使用するパラメータをレジスタに設定した後、最初に実行するスレッドの先頭アドレスへ分岐する（ステップＳ２０）。実行中のスレッドがＤＭＡコマンドを実行するとき、ＤＭＡライブラリの中でＤＭＡコマンドを実行する（ステップＳ２１）。スレッドは自身のプログラムカウンタをセーブして、ウェイトキューに自身を挿入する（ステップＳ２２）。
【００２８】
さらに、スレッドは、レジスタバンク毎のスケジューリングキューの中から、ＤＭＡコマンドが完了して実行可能状態のスレッドを取り出す（ステップＳ２３）。そして、そのスレッドのプログラムカウンタへジャンプする（ステップＳ２４）。
【００２９】
なお、本実施形態では、多数の汎用レジスタを分割して割当てる方法において、割り当てる対象は、スレッドの場合を想定したが、コルーチン（又は関数）の場合にも適用できる。スレッドとコルーチンとの相違では、スレッドが割り込みなどのイベントによって非同期に処理が切り替わるのに対して、コルーチンは自身で処理を中断する機能を有する。
【００３０】
以上要するに、本実施形態によれば、手続き単位（スレッドまたはコルーチンの処理単位）で汎用レジスタを割り当てれば、手続きの入り口と出口で必要なレジスタのセーブ／リストア処理を行うことなく、手続き処理を実行することができる。また、スレッドあるいはコルーチン単位でレジスタを割り当てれば、高速なスレッドあるいはコルーチン切り替えが可能になるため、より細かい単位でスレッドあるいはコルーチンプログラムをスイッチすることが可能となる。
【００３１】
（手続き呼出し方法）
本実施形態に関するレジスタ割当て機能を、通常の手続き呼出し方法に適用した場合の具体例を説明する。ここで、手続きとは、関数呼出し単位を意味する場合がある。
【００３２】
まず、一般的に、マイクロプロセッサの汎用レジスタは、手続き呼出し規約（calling convention）またはリンケージ規約（Linkage convention）によって、callee-saved(non volatile)とcaller-saved(volatile)の２つに分類されている。汎用レジスタの中で、手続き呼出し時に使用される引数を受け渡すための汎用レジスタも、当該規約の中で定義されている。これにより、異なるプログラミング言語で開発したソフトウェアモジュール（関数やライブラリ）であっても、当該規約に従って相互のモジュールを呼出すことが可能となる。
【００３３】
callee-saved汎用レジスタは、呼出された手続きで書き壊す可能性がある場合、呼出された手続きの先頭で値をセーブし、リターンする前にセーブした値をリストアするという規則になっている。
【００３４】
caller-saved汎用レジスタは、呼出された手続きで書き壊してもよい汎用レジスタでありる。当該汎用レジスタは、手続きを呼び出す側で、呼出し前後のレジスタの値を同じにしたい場合は手続きを呼出す前に値をセーブし、手続きから返ってきたところでセーブした値をリストアする必要がある。
【００３５】
手続き処理が小さな単位に分割されている場合は、前記のcallee-saved汎用レジスタを手続きの入り口でセーブし、出口でリストアするという処理のオーバーヘッドが相対的に大きくなる。このオーバヘッドを削減する方法として、周知のように、レジスタウィンドウという仕組みがある。レジスタウィンドウは、手続きを呼出すたびに、ハードウェアで汎用レジスタを切り替えるため、汎用レジスタのセーブ／リストア処理を必要としない。
【００３６】
ところで、手続き（具体的には、関数、メソッドなど）呼出し方法において、呼出された処理が必要とするデータや、オブジェクトが保持する変数は、そのデータや変数を使用するときにレジスタにロードされて、演算が実行される。このとき、手続き（関数やメソッド）からリターンする前に、演算結果をメモリへ書き戻さなければならない。
【００３７】
また、同じ手続き（関数やメソッド）を再度呼出す場合には、書き戻した結果を再びレジスタにロードしてから演算する必要があった。これは、レジスタウィンドウ方式においても同様である。
【００３８】
そこで、本実施形態のレジスタ割当て方法を適用することにより、手続き呼出し規約をフレキシブルに定義可能とする仕組みを提供し、手続きに割り当てられた汎用レジスタが複数回の手続き呼出しにまたがって、その値を保障できる。これにより、手続呼び出しの度に必要なcallee-savedレジスタのセーブ／リストア処理を不要にするのみでなく、呼出された手続きでのメモリアクセス回数の削減を実現する。
【００３９】
まず、手続き呼出し規約で、callee-savedの汎用レジスタを固定のレジスタにするのではなく、例えば以下のように設定する。なお、ここでは、関数も含め、共有ライブラリをロードするときに、物理レジスタであるレジスタファイル１３０からレジスタを割当てる仕組みを提供する。
【００４０】
図４に示すように、例えば共有ライブラリが使用するレジスタ４００を、レジスタファイル１３０から割当てる場合に、手続きの引数を受け取る領域のレジスタ番号(レジスタ０〜レジスタＬ−１)を設定する。レジスタ番号Ｌは、受け取り用引数の開始４１０を示すオフセット値である。
【００４１】
また、手続きローカルで使用する領域のレジスタ番号（レジスタＬ〜レジスタＭ−１）を設定する。レジスタ番号Ｍは、呼出し用パラメータの開始４２０を示すオフセット値である。さらに、手続き呼出しで引数を渡す領域のレジスタ番号(レジスタＭ〜レジスタＮ−１)を設定する。レジスタ番号Ｎは、手続きが使用するレジスタの開始４３０を示すオフセット値である。
【００４２】
ここで、Ｌ，Ｍ，Ｎは、レジスタファイル１３０に含まれる汎用レジスタ数を超えない自然数で、「Ｌ＜Ｍ＜Ｎ」の関係がある。このＬ，Ｍ，Ｎは、固定の値ではなく、ソフトウェアモジュールあるいは手続き毎に異なってもよい。
【００４３】
本実施形態のコンパイラは、手続きで使用するレジスタの数を、出来るだけ少なくて済むように最適化し、その手続き（あるいは実行単位モジュール）が呼出す手続き（ライブラリ）の引数レジスタの開始番号の情報（前記Ｍに相当する）を付加する。このとき、被コンパイル対象のプログラムの実行性能を犠牲にしないように注意する。手続き毎のレジスタ使用に関する情報の付与は、例えばＭＩＰＳアーキテクチャのＥＬＦファイルでのreginfoセクションのようなフォーマットによって実現することが可能である。
【００４４】
図５は、例えば共有ライブラリが呼出す手続きが使用するレジスタ５００の割当ての仕組みを示す図である。この場合も、レジスタ番号Ｌは、受け取り用引数の開始５１０を示すレジスタ番号である。また、レジスタ番号Ｍは、呼出し用パラメータの開始５２０を示すレジスタ番号である。さらに、レジスタ番号Ｎは、手続きが使用するレジスタの開始５３０を示すレジスタ番号である。
【００４５】
プログラム実行時に、呼出す手続きをロードする場合に、当該レジスタ番号Ｍの情報を使用して、ロードされる手続きの命令をスキャンし、レジスタフィールドの値にＭを加える。なお、スタックを使用する場合はスタックポインタを除外し、また、プログラムカウンタが汎用レジスタにある場合は、これも除外する。
【００４６】
以上のような本実施形態のレジスタ割当て処理の仕組みによって、手続き呼出し方法において、呼出された手続きの入り口と出口とでの汎用レジスタのセーブ／リストア処理を不要にすることができる。
【００４７】
次に、複数回の手続き呼出し方法において、変数のレジスタ割当てについて、オブジェクト指向プログラムでのオブジェクト変数のレジスタ割当て処理の具体例を、図９から図１４を参照して説明する。
【００４８】
オブジェクト指向のプログラムでは、オブジェクトが保持する変数へのアクセスは、そのオブジェクトが定義するメソッドを呼出すことによって行うことが多い。このような場合、同じメソッドを繰り返し呼出すと、オブジェクト変数のレジスタへのロード、リストア処理が、煩雑に行われることになり、処理の効率低下につながる。この問題を解決するために、プログラムコンパイル時に、呼出されるメソッドをインラインに展開することが行われる。
【００４９】
このようにすることで、手続き呼出しの方法を使わずに、処理全体を手続きを呼出す側で最適化することが可能になり、オブジェクト変数への繰り返しのアクセスは、最初の１回目にメモリからレジスタに読み込めば、それ以降はレジスタへのアクセスにすることができるので、効率のよい実行モジュールとすることができる。
【００５０】
一方、インライン展開を多用すると、オブジェクトコードのサイズが増大するので、メモリサイズの制約の厳しい組み込みシステムでは、限定的に使うことしかできなかったり、キャッシュミスが煩雑に起きるようになって、返って実行性能が低下することもあり得る。また、ダイナミックに結合するライブラリや、オブジェクトメソッドでは、インライン展開の手法を使用できない。
【００５１】
そこで、本実施形態により実現されるフレキシブルな手続き呼出し規約によって、柔軟に対応可能であることを以下に示す。以下の記述で、外部手続きとは、コンパイル済みのソフトウェアモジュールにおいて、そのモジュール内に定義されていない手続きのことを意味する。この外部手続きは、ソフトウェアモジュールをリンクするときに、モジュール全体に取り込まれることもあり得るし、あるいは、実行時に、必要になった時点で、ファイルからメモリへロードされるような実行形態をとる。
【００５２】
まず、コンパイラは、前述のように、手続き呼出しの引数渡し用のレジスタの開始番号の情報を、モジュール単位あるいは手続き単位で付与する。この情報の付与方法は、例えば以下のような手順からなる。
【００５３】
第１段階で、モジュール全体でデフォルトの外部手続き呼び出しの引数渡し用のレジスタの開始番号を設定する。この開始番号は、例えば、モジュール全体で使用するレジスタの最大値にする。
【００５４】
第２段階として、呼出す外部手続き間で、使用するレジスタが重ならないようにするべき外部手続きをピックアップする。これらの呼出しの引数渡し用のレジスタ開始番号を、他の外部手続きと重ならない程度に大きい方へずらす。
【００５５】
第３段階で、デフォルトの開始番号の情報と共に、第２段階でピックアップした外部手続きの引数渡し用のレジスタ開始番号の情報を、モジュールに付与する。付与する場所は、外部手続き呼出しのためのシンボル情報と一緒に、オブジェクトファイルに保管する。
【００５６】
第４段階として、プログラム実行時に外部手続き呼出しを行うために、その外部手続きを含むモジュールをロードする場合、前記引数渡し用のレジスタ開始番号と、現在実行中のモジュールがロードされたときにレジスタ番号フィールドに、足し算されたオフセット値とを加えた値を、ロードする外部手続きのレジスタ番号フィールドに加える。
【００５７】
ここで、コンパイラは、図９に示すメソッド９００（method Ａとする）のコンパイルにおいて、オブジェクト変数がすでにレジスタにロードされた状態で実行されるメソッドコード９２０と、当該メソッドコード９２０の先頭にオブジェクト変数をレジスタにロードする処理を付与したメソッドコード９１０と、当該メソッドコード９２０の最後にオブジェクト変数をメモリへストアする処理を付与したメソッドコード９３０とを生成する。
【００５８】
これらの処理を、図１０に示すような手順での処理にすれば、従来の手続き呼出し規約による手続き実行コード（９２０）のコードサイズの大きさと同等にすることが可能である。図１０において、Ｅ１〜Ｅ５は各処理のエントリを示す。
【００５９】
即ち、メソッドコード９１０を生成する処理（ステップＳ３０）の後に、メソッドコード９３０の生成のエントリＥ２として、プロローグ処理に相当するリターン変更処理を付与する（ステップＳ３１）。リターン変更処理とは、オブジェクト変数をロードしてリターンアドレスをスタックへセーブし、さらにリターンアドレスをアドレス２に変更する。このアドレス２は、オブジェクト変数をメモリへストアするときに設定するアドレスである。
【００６０】
メソッド９００のエントリＥ３として、レジスタへロードし、リターン変更処理を実行する（ステップＳ３２）。さらに、メソッドコード９２０のエントリＥ４として、手続き処理本体を設定する（ステップＳ３３）。そして、リターン変更処理のエントリＥ５として、適当な場所にオブジェクト変数をメモリへストアし、リターン２の処理を実行する（ステップＳ３４）。リターン２の処理は、スタックからリターンアドレスをロードし、ロードしたアドレスへリターン（ジャンプ）するエピローグ処理である。
【００６１】
図１１及び図１２は、メソッドの呼出し処理のシーケンスを示す概念図である。
【００６２】
通常では、図１１に示すように、各呼出し処理（Ｓ４０）毎に、オブジェクト変数をレジスタにロードする処理、オブジェクト変数をメモリへストアする処理を実行する。
【００６３】
これに対して、図１２に示すように、最初の呼出し処理（Ｓ５０）で、オブジェクト変数をレジスタにロードする処理を実行することにより、後続のメソッドの呼出し処理（Ｓ５１〜Ｓ５３）では、オブジェクト変数をメモリからロードする必要はない。そして、最後のメソッドの呼出し処理（Ｓ５４）で、オブジェクト変数をメモリへストアする処理を実行する。
【００６４】
さらに、図１３及び図１４は、メソッド（method Ａ）の呼出し処理の途中で、別のメソッド（method Ｂ）を呼出す必要がある場合のシーケンスを示す。なお、図１３及び図１４レジスタファイル１３０の左から右に向かって使用するレジスタ番号が大きくなる。
【００６５】
通常では、図１３に示すように、メソッド（method Ａ）の呼出し処理は、メソッドコードの先頭にオブジェクト変数をレジスタにロードする処理（Ｓ６０，Ｓ６３）、及びメソッドコードの最後にオブジェクト変数をメモリへストアする処理（Ｓ６１，Ｓ６４）を順次実行する。この途中で、別のメソッド（method Ｂ）を呼出す処理（Ｓ６２）を実行する場合に、当該メソッド（method Ｂ）に割当てるレジスタ１３３は、メソッド（method Ａ）に割当てるレジスタ１３１，１３２，１３４，１３５と同一レジスタ番号である。
【００６６】
これに対して、図１４に示すように、本実施形態では、メソッド（method Ａ）の呼出し処理において、最初の呼出し処理（Ｓ７０）でオブジェクト変数をレジスタにロードする処理を実行し、最後の呼出し処理（Ｓ７４）で、オブジェクト変数をメモリへストアする処理を実行する。
【００６７】
そして、この途中で、別のメソッド（method Ｂ）を呼出す処理（Ｓ７２）を実行する場合に、当該メソッド（method Ｂ）に割当てるレジスタ１４２を、メソッド（method Ａ）に割当てるレジスタ１４０，１４１，１４５，１４６よりも大きいレジスタ番号にずらす。
【００６８】
なお、図１４において、１４３は引数を渡すためのレジスタであり、１４４は返り値を受け取るためのレジスタである。従って、メソッド（method Ａ）を実行するオブジェクトに割り当てたレジスタの値を、メソッド（method Ｂ）に跨って有効にしておくことが可能である。
【００６９】
以上のように、多数の汎用レジスタがあるマイクロプロセッサにおいては、レジスタの利用方法を手続き呼出し規約によって固定的に決めてしまうのではなく、手続き呼出しのためのレジスタの開始オフセット番号などの情報によって、レジスタファイルのどの部分に割り当てられても、手続き呼出しが矛盾なく行えるように手続きをロードすることで、多数あるレジスタを有効に使い分けることが可能となる。
【００７０】
また、上記のような実行時の各手続きへのレジスタ割り当ての管理手法を、スレッドやコルーチンに応用すれば、スレッドやコルーチンの切り替えを高速に行うことが可能であり、メモリアクセスのレイテンシの間に、別のコルーチンの処理を実行するというような微粒度の実行切り替えを実現することが可能となる。
【００７１】
（第２の実施形態）
図１５から図１８は、第２の実施形態に関する図である。
【００７２】
本実施形態は、前述のマルチスレッドのモデルとは異なり、プログラム作成時に、ＤＭＡ処理によって処理を完結するようなモデルに従って、プログラムを作成する方法に関する。
【００７３】
このようなモデルにより作成した処理単位を、便宜的にコードフラグメントと呼ぶことにする。
【００７４】
コードフラグメントは、エントリポイントから実行が開始され、最後にＤＭＡコマンドの実行によって、その実行単位を終了する。コードフラグメントは、最後に実行したＤＭＡコマンドが完了した後に、次に実行すべきコードフラグメントを指定する。このようなコードフラグメントの集合によって作成したプログラムを、コンパイルしてスレッドモデルの場合と同様に、レジスタファイル１３０に含まれるレジスタバンクに割り当てる。
【００７５】
これらのコードフラグメントの集合は、図１８に示すように、次に実行すべきコードフラグメント１７０の依存関係を表したタスクグラフによって管理される。ここで、コードフラグメント１７０は、図１７に示すように、スレッドなどの実行処理部１７１と、ＤＭＡコマンドの発行処理部１７２とを含む。
【００７６】
コードフラグメント１７０の実行環境としては、図１７に示すように、コードフラグメント１７０をメモリへロードし、レジスタファイル１３０の各レジスタバンク１８０〜１８２毎にスケジューリングキューをタスクグラフの情報に従って生成する。
【００７７】
コードフラグメントスケジューラは、タスクグラフの情報を参照しながら、図１５に示すように、コードフラグメントの実行をスケジュールする。即ち、プログラム開発時の手順としては、ＤＭＡで完結するコードフラグメントの集まりとしてプログラムを記述する（ステップＳ８０）。次に、データ（オブジェクト）の受け渡しをタスクフラグで表現する（ステップＳ８１）。さらに、タスクグラフの依存関係と必要レジスタ数により、レジスタファイル１３０のレジスタバンクに割当てる（ステップＳ８２）。そして、データ依存関係に従ったＤＡＧ構造のスケジューリングキューを生成する（ステップＳ８３）。
【００７８】
図１６は、コードフラグメントモデルでのプログラム実行手順を説明する。
【００７９】
プログラムディスパッチャは、ディスパッチされたコードフラグメントの処理及びＤＭＡコマンドを実行する（ステップＳ９０，Ｓ９１）。自身の後ろにつながったコードフラグメントを実行したＤＭＡの完了待ちの印をつけて、レジスタバンク毎のスケジューリングキューの最後尾に挿入する（ステップＳ９２）。
【００８０】
さらに、スケジューリングキューの先頭にあるコードフラグメントの中で、ＤＭＡ完了待ちが解けたものを選んでキューから取り出し、その先頭へジャンプする（ステップＳ９３）。
【００８１】
このコードフラグメントは、オブジェクト指向のメソッドとして実装される構成でもよい。また、コードフラグメントの命令コードは、データと共にダイナミックにＤＭＡによってロードされてもよい。
【００８２】
さらに、Ｃ言語のようなスタックを前提としたプログラムモデルではなく、多数の汎用レジスタを使い分けることによって、プログラムの状態を保持するモデルを考えることも可能である。この場合、並列処理を自然に記述可能なデータフローモデルや、オブジェクトが自立的にプログラムを実行するアクタモデルのような並列プログラムも、本実施形態のスレッドまたはコルーチンの方法を使うことで、効率のよいプログラムにすることが可能である。
【００８３】
以上要するに第２の実施形態によれば、コードフラグメントモデルによるプログラム実行においては、各処理をレジスタバンクに割り当てる必要性がないので、プログラムを適切に分割することにより、高いスループットを得ることが可能である。
【００８４】
また、さまざまな処理の形態に応じて、プログラミングの形態を選択可能であり、ハイブリッドな処理スケジュールによって、メモリアクセスの遅延サイクルの増減に、柔軟に対応することが可能となる。スタックを使わないので、余分なメモリ管理をする必要がなくなるし、変数のスタックへの出し入れも必要ない。
【００８５】
（第３の実施形態）
図１９から図２４は、第３の実施形態に関する図である。
【００８６】
図１９は、本実施形態に関するプログラム実行装置の要部を示すブロック図である。なお、要部以外の構成は、前述の第１の実施形態での図１と同様であるため、説明を省略する。
【００８７】
本実施形態のソフトウェア構成とは、ソースプログラム３０１と、コンパイラ３０２と、プログラムローダ３０３と、スレッドライブラリ３１３とを有する。
【００８８】
コンパイラ３０２は、ソースプログラム３０１をコンパイルしてオブジェクトモジュール（オブジェクトコード）を生成する。コンパイラ３０２は、当該コンパイル時にコンテキスト用に使用されるレジスタ情報をオブジェクトモジュール（オブジェクトファイル）に付与する処理を実行する（図２０を参照）。オブジェクトモジュールは、ライブラリオブジェクト３１１及びスレッドオブジェクト３１２を含む。
【００８９】
プログラムローダ３０３は、コンパイラ３０２により生成されたオブジェクトモジュールをメインメモリ２０にロードする。プログラムローダ３０３は、ロード時にレジスタ番号を書き換えるルーチン３０３Ａを含む。
【００９０】
スレッドライブラリ３１３は、プログラムローダ３０３によりロードされたスレッドオブジェクト３１２を起動する。スレッドライブラリ３１３は、起動時にレジスタ番号を書き換えるルーチン３１３Ａを含む。
【００９１】
（コンパイラの処理手順）
図２０は、コンパイラ３０２の処理手順を示すフローチャートである。
【００９２】
本実施形態のコンパイラ３０２は、図２０に示すように、ソースプログラム３０１に含まれるソースコードを入力して、オブジェクトコードを生成して出力する通常のコンパイル処理を実行するフェーズ（ステップＳ１００〜Ｓ１０９）と共に、レジスタ割り当て処理を実行するフェーズ（ステップＳ１０６）を含む。
【００９３】
通常のコンパイル処理を実行するフェーズは、入力したソースコードの字句解析処理（Ｓ１０１）、構文解析処理（Ｓ１０２）、中間表現生成処理（Ｓ１０３）、最適化処理（Ｓ１０４）、命令選択処理（Ｓ１０５）、コード生成処理（Ｓ１０７）、アセンブラ処理（マシンコードへの変換処理、Ｓ１０８）、及びオブジェクトコードの出力処理（Ｓ１０９）からなる。
【００９４】
次に、レジスタ割り当て処理を実行するフェーズ（ステップＳ１０６）は、ステップＳ１１０からＳ１１３の各処理を含む。
【００９５】
ここで、ソースプログラム３０１は、コンテキスト切り替えポイントを明示的に指定するための処理ステップを含む。例えば、「yeield();」というライブラリ呼び出しステップによって、コンテキストを切り替える。
【００９６】
コンパイラ３０２は、レジスタ割り当てフェーズでは、ソースコードをスレッド単位に設定し、以下の処理を実行する（ステップＳ１１０）。即ち、通常のレジスタ割り当て処理を実行した後に、全てのコンテキスト切り替えポイントを調べて、当該コンテキスト切り替えポイントで有効なデータを保持しているレジスタの和集合を求める（ステップＳ１１２）。
【００９７】
さらに、コンパイラ３０２は、求めたレジスタの和集合（レジスタ情報）をスレッドのコンテキスト用に使用される情報として生成する（ステップＳ１１３）。コンパイラ３０２は、当該レジスタ情報をオブジェクトファイルに付与する。ここで、当該レジスタ情報は、図２１に示すような構造を有し、スレッド又はライブラリのエントリポイント（コンテキスト切り替えポイント）を示す情報２２０、コンテキスト用レジスタ番号の最小値を示す情報２２１、及びコンテキスト用レジスタ番号の最大値を示す情報２２２を有する。
【００９８】
ここで、図２０において、スレッド単位でのレジスタ情報の生成処理を、スレッド単位ではなく手続き単位とし、コンテキスト切り替えポイントを手続き呼び出しに置き換えると、各手続き単位でのレジスタ情報を得ることができる。
【００９９】
また、図２０において、コード生成フェーズ（Ｓ１０７）においては、通常は、手続きの入口または出口や、スレッドの切り替え時にレジスタのセーブ／リストアを行う処理を生成する。この場合、本実施形態の方式によって、レジスタをスレッドや手続き単位で割り当てて使うことができるので、セーブ／リストアの処理のためのコード生成を省略することができる。
【０１００】
（レジスタ番号の書き換え処理の手順）
以上のようにして、コンパイラ３０２により生成されたオブジェクトコードからなるオブジェクトファイルを、プログラムローダ３０３は、プログラム実行時にメインメモリ２０へロードする。プログラムローダ３０３は、当該ロード時に、図２２のフローチャートに示すような手順により、レジスタ番号の書き換え処理を実行する（ルーチン３０３Ａの実行）。
【０１０１】
ここでは、プログラムローダ３０３は、ダイナミックにロードする関数ライブラリをロードするときに、以下のような手順でレジスタ番号の書き換え処理を実行する。
【０１０２】
まず、プログラムローダ３０３は、当該関数のエントリポイントに相当するレジスタの利用領域をオブジェクトファイルに付与されたレジスタ情報から取得する（ステップＳ２０１）。即ち、プログラムローダ３０３は、当該エントリポイントに対応付けられたコンテキスト用レジスタ番号の最小値と最大値を取得する（図２１を参照）。
【０１０３】
次に、プログラムローダ３０３は、予め用意されているレジスタ利用状況管理表２１０から、それらのレジスタを割り当てるためのメモリの空き領域（空きレジスタ）を求める（ステップＳ２０２）。即ち、レジスタ利用状況管理表２１０より、「最大値−最小値＋１」の範囲のレジスタ番号に対応するレジスタの空き領域を見つける。
【０１０４】
レジスタ利用状況管理表２１０は、例えば図２３に示すような構造である。即ち、レジスタ利用状況管理表２１０は、レジスタ番号Ｎに対応するコンテキストを識別するＩＤ情報、及び当該コンテキスト用レジスタ領域のサイズを示す情報を有する。
【０１０５】
プログラムローダ３０３は、割り当てるための十分な空き領域（空きレジスタ）を確保できない場合には、所定のエラー処理を実行する（ステップＳ２０３のＮＯ）。この場合、プログラムローダ３０３は、エラー処理ではなく、従来の手続きと同様にコンパイルしたモジュールを用意しておき、通常のプログラムロード処理を続行してもよい。
【０１０６】
一方、プログラムローダ３０３は、レジスタとして割り当てるための十分な空き領域を見つけると、メモリへロード（または起動）する全ての命令コードのレジスタフィールドを順次探索する（ステップＳ２０３のＹＥＳ，Ｓ２０４）。次に、プログラムローダ３０３は、各レジスタフィールドについてレジスタ番号の書き換え処理を実行する（ステップＳ２０５）。
【０１０７】
即ち、プログラムローダ３０３は、レジスタフィールドのレジスタ番号を取得する（ステップＳ２０６）。プログラムローダ３０３は、当該レジスタ番号が、前述のコンテキスト用レジスタ番号の最小値と最大値の範囲に含まれるか否かを判定する（ステップＳ２０７）。この判定により、当該レジスタ番号が、コンテキスト用レジスタ番号として割り当てられたレジスタであれば、プログラムローダ３０３は、命令コードの該当レジスタフィールドの当該レジスタ番号を書き換える（ステップＳ２０８）。ここで、手続きのコンテキスト用として割り当てられたレジスタは、手続き呼び出しをまたがって有効なレジスタの和集合として割り当てられたレジスタを意味する。
【０１０８】
以上のようにしてプログラムローダ３０３は、命令コードの各レジスタフィールドの全て、及び全ての命令コードについてのレジスタ番号の書き換え処理を実行する（ステップＳ２０９，Ｓ２１０）。これにより、オブジェクトファイルでのコンテキスト用レジスタとして記録されたレジスタ番号と、その他のオブジェクトファイルで使用されるレジスタ番号とが重複されないように調整される。
【０１０９】
このようにしてロードされた関数ライブラリは、入口と出口でのレジスタのセーブ／リストアを行うことなく、ライブラリ処理を実行することが可能となる。
【０１１０】
なお、プログラムローダ３０３は、関数ライブラリをロードする場合以外に、スレッドオブジェクトの場合にも、前述と同様の手順で書き換え処理を実行する。但し、スレッドオブジェクトの場合には、プログラムロード時にレジスタ番号を書き換える方法と、スレッド起動時にレジスタ番号を書き換える方法の２通りの方法がある。
【０１１１】
ロード時にレジスタ番号を書き換える方法は、スレッド起動時に書き換える方法と比較して、ロードしたコードを実行するスレッドが、同時に複数生成されることがない場合に有効である。一方、１つのコードから複数のスレッドを起動する場合には、スレッド起動時にレジスタ番号の書き換えを行う必要があるため、スレッド起動時に書き換える方法が有効となる。
【０１１２】
（プログラム実行状況）
図２４は、本実施形態に関するプログラム実行時のレジスタ使用状況の概念を示す図である。
【０１１３】
図２４（Ｂ）は、レジスタファイル１３０の構成を示す図である。本実施形態では、プログラム実行として、便宜的にスレッド単位でのスレッドＡとスレッドＢが起動する場合を想定する。コンパイラ３０２は、レジスタファイル１３０において、スレッドＡとスレッドＢが共通に使用するワーキングレジスタ２４０と、各スレッドＡ，Ｂに、スレッドコンテキストとして割り当てられたレジスタ２４１，２４２とに区別して、オブジェクトファイルに記録する。ワーキングレジスタ２４０は、スレッドが使用するレジスタの中で、コンテキスト切り替えポイントで有効な値を保持しないレジスタである。
【０１１４】
プログラムローダ３０３は、それぞれのスレッドＡ，Ｂをメモリ２０にロードする際、レジスタファイル１３０の一部を、それぞれのスレッドコンテキスト用レジスタ２４１，２４２として割り当て、残りをワーキングレジスタ２４０として使用する。
【０１１５】
図２４（Ａ）は、スレッドＡ，Ｂがそれぞれ処理１〜３を実行するときに、共通に使用可能なワーキングレジスタ２４０と、それぞれに割り当てられたレジスタ２４１，２４２の使用状況を示す。符号「Ｐ」は、コンテキスト切り替えポイントを示す。
【０１１６】
図２４（Ｃ）は、スレッドＡ，Ｂが時分割で実行する状況を示す。
【０１１７】
即ち、スレッドＡが起動して処理１を終了し、例えば「yeield();」というライブラリ呼び出しステップによって、コンテキストが切り替わると（ポイントＰ）、スレッドＢの処理１に切り替わる。
【０１１８】
スレッドＢは、スレッドＡに割り当てられたレジスタ２４１とは別の領域のレジスタ２４２を使用して、処理１を実行する。このため、スレッドＡからスレッドＢへ切り替わるときに、レジスタのセーブ／リストアを行う必要がない。以下、同様にして、コンテキスト切り替えポイントに応じて、スレッドＡ，Ｂの切り替えを行いながら、それぞれの処理１〜３が続行される。
【０１１９】
このような高速のスレッド切り替えの効果は、例えば、スレッドＡがスレッドＢに切り替わる直前で、アクセスレイテンシの大きいメモリへアクセスし、スレッドＢが動いている間にデータがＣＰＵコアの近くまで転送されていると、レイテンシの間に別の処理を行うことができ、ＣＰＵのスループット向上につながる。
【０１２０】
なお、本実施形態では、ライブラリやスレッドという単位でレジスタをダイナミックに割り当てる方法について説明したが、オブジェクト指向プログラムにおけるオブジェクトインスタンスを単位としてダイナミックにレジスタを割り当てることも可能である。また、オブジェクトへの付加情報を最小値と最大値のみでなく、具体的に必要なすべてのレジスタ番号としてもよい。実際上では、コンパイラによって、これらのレジスタを１つの領域にまとめることが可能であるため、最小値と最大値のみの情報で十分である。
【０１２１】
また、手続き呼び出しのネスト関係や、スレッドの同時実行の制約などがあれば、同時に存在し得ない手続き同士や、スレッド同士は、同じ領域のレジスタを割り当てることが可能である。
【０１２２】
以上要するに本実施形態の特徴は、ダイナミックに結合されるライブラリや、スレッドのコンテキスト部分のレジスタ番号を、プログラムロード時およびスレッド起動時に、書き換えることにある。これにより、レジスタの衝突を避け、手続き呼び出し時とスレッドコンテキスト切り替え時に必要であったレジスタの退避、復元処理を行うことなしに、プログラムによる処理を切り替えることができる。この場合に、レジスタの利用方法を規定することによって、レジスタの利用効率を向上させることができる。
【０１２３】
また、プログラムによる処理の切り替えコストを抑えることが可能であるので、プログラム部品のモジュール性を維持したまま、高性能なプログラムを実現することが可能である。また、レジスタの利用効率の向上により、単位処理あたりで使えるレジスタの数が増大し、より効率のよいコードを生成することが可能となる。
【０１２４】
さらに、高速な処理のスケジューリング機能と一緒に使えば、非常に細かい単位で処理を切り替えても性能に影響を与えることはないので、メモリアクセスのレイテンシの間に、別の処理をスケジュールして実行すれば、プロセッサのスループットがメモリアクセスのレイテンシに縛られることがなくなる。
【０１２５】
本実施形態の効果を要約すると、以下のとおりである。
【０１２６】
（１）レジスタセーブ／リストアをしない高速なスレッドコンテキスト切り替えを実現することができる。
【０１２７】
（２）ダイナミックに呼び出されるプログラムモジュール間でのレジスタ割り当ての最適化を実現することができる。
【０１２８】
（３）スレッドコンテキストやダイナミックライブラリ毎に、必要なレジスタを割り当てることができる。
【０１２９】
（４）スレッドに割り当てるレジスタは、コンテキストスイッチ時に値を保持しているレジスタだけで、それ以外のレジスタは、ワーキングレジスタとしてスレッド間で共用することができる。
【０１３０】
（５）コンテキストは、プログラマが明示的に切り替えることができる。
【０１３１】
（６）コンパイル時に、コンテキスト切り替えポイントでの生存レジスタ数が少なくなるよう最適化することができる。
【０１３２】
（７）スレッド起動時あるいはロード時に、まだ使われていないレジスタエリアを見つけて、スレッドコンテキストに割り当てられたレジスタ番号を書き換えることで、スレッド間でのレジスタ割り当ての最適化を実現することができる。
【０１３３】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【図面の簡単な説明】
【０１３４】
【図１】本発明の第１の実施形態に関するプログラム実行装置のシステム構成を示すブロック図。
【図２】本実施形態に関するレジスタ割当て処理の手順を説明するためのフローチャート。
【図３】本実施形態に関する命令コードオフセットデータの一例を示す図。
【図４】本実施形態に関するレジスタ割当て処理の仕組みを説明するための図。
【図５】本実施形態に関するレジスタ割当て処理の仕組みを説明するための図。
【図６】本実施形態に関するスレッドモデルでの状態遷移を示す図。
【図７】本実施形態に関するマルチスレッド方式のプログラム開発の手順を説明するためのフローチャート。
【図８】本実施形態に関するマルチスレッド方式のプログラムの実行手順を示すフローチャート。
【図９】本実施形態に関するオブジェクト変数のレジスタ割当て処理の具体例を説明するための図。
【図１０】本実施形態に関するオブジェクト変数のレジスタ割当て処理の具体例を説明するための図。
【図１１】本実施形態に関するオブジェクト変数のレジスタ割当て処理の具体例を説明するための図。
【図１２】本実施形態に関するオブジェクト変数のレジスタ割当て処理の具体例を説明するための図。
【図１３】本実施形態に関するオブジェクト変数のレジスタ割当て処理の具体例を説明するための図。
【図１４】本実施形態に関するオブジェクト変数のレジスタ割当て処理の具体例を説明するための図。
【図１５】第２の実施形態に関するプログラム開発の手順を説明するためのフローチャート。
【図１６】第２の実施形態に関するプログラムの実行手順を示すフローチャート。
【図１７】第２の実施形態に関する実行環境を示す概念図。
【図１８】第２の実施形態に関する実行順序の依存関係を示す概念図。
【図１９】第３の実施形態に関するプログラム実行装置の要部を示すブロック図。
【図２０】第３の実施形態に関するコンパイラの処理手順を示すフローチャート。
【図２１】第３の実施形態に関するコンパイラにより生成されたレジスタ情報の構造を示す図。
【図２２】第３の実施形態に関するレジスタ番号の書き換え処理の手順を説明するためのフローチャート。
【図２３】第３の実施形態に関するレジスタ利用状況表の構造を示す図。
【図２４】第３の実施形態に関するプログラム実行状況の概念を示す図。
【符号の説明】
【０１３５】
１０…マイクロプロセッサ（ＭＰＵ）、２０…メインメモリ、３０…プログラムファイル、
１００…演算ユニット（ＡＬＵ）１１０…ローカルメモリ、
１２０…ＤＭＡコントローラ、１３０…レジスタファイル。
【図１】
2005129001.tif 000003
【図２】
2005129001.tif 000004
【図３】
2005129001.tif 000005
【図４】
2005129001.tif 000006
【図５】
2005129001.tif 000007
【図６】
2005129001.tif 000008
【図７】
2005129001.tif 000009
【図８】
2005129001.tif 000010
【図９】
2005129001.tif 000011
【図１０】
2005129001.tif 000012
【図１１】
2005129001.tif 000013
【図１２】
2005129001.tif 000014
【図１３】
2005129001.tif 000015
【図１４】
2005129001.tif 000016
【図１５】
2005129001.tif 000017
【図１６】
2005129001.tif 000018
【図１７】
2005129001.tif 000019
【図１８】
2005129001.tif 000020
【図１９】
2005129001.tif 000021
【図２０】
2005129001.tif 000022
【図２１】
2005129001.tif 000023
【図２２】
2005129001.tif 000024
【図２３】
2005129001.tif 000025
【図２４】
2005129001.tif 000026