JP2005129001A - プログラム実行装置、マイクロプロセッサ及びプログラム実行方法 - Google Patents
プログラム実行装置、マイクロプロセッサ及びプログラム実行方法 Download PDFInfo
- Publication number
- JP2005129001A JP2005129001A JP2004159232A JP2004159232A JP2005129001A JP 2005129001 A JP2005129001 A JP 2005129001A JP 2004159232 A JP2004159232 A JP 2004159232A JP 2004159232 A JP2004159232 A JP 2004159232A JP 2005129001 A JP2005129001 A JP 2005129001A
- Authority
- JP
- Japan
- Prior art keywords
- register
- program
- execution
- file
- unit module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
- 238000000034 method Methods 0.000 title claims abstract description 259
- 230000008569 process Effects 0.000 claims description 62
- 230000006870 function Effects 0.000 claims description 21
- 239000012634 fragment Substances 0.000 description 21
- 238000010586 diagram Methods 0.000 description 13
- 230000007246 mechanism Effects 0.000 description 7
- 238000007726 management method Methods 0.000 description 6
- 238000005457 optimization Methods 0.000 description 5
- 230000008859 change Effects 0.000 description 4
- FFBHFFJDDLITSX-UHFFFAOYSA-N benzyl N-[2-hydroxy-4-(3-oxomorpholin-4-yl)phenyl]carbamate Chemical compound OC1=C(NC(=O)OCC2=CC=CC=C2)C=CC(=C1)N1CCOCC1=O FFBHFFJDDLITSX-UHFFFAOYSA-N 0.000 description 3
- 230000006872 improvement Effects 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 2
- 239000000470 constituent Substances 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000007704 transition Effects 0.000 description 2
- 230000004913 activation Effects 0.000 description 1
- 230000001771 impaired effect Effects 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000012384 transportation and delivery Methods 0.000 description 1
- 238000004148 unit process Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/30123—Organisation of register space, e.g. banked or distributed register file according to context, e.g. thread buffers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/441—Register allocation; Assignment of physical memory space to logical memory space
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3851—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
【課題】マルチスレッド方式などにおいて、汎用レジスタを有効に使用して、結果的にメモリアクセスのレイテンシを向上させて、プログラムの実行性能を向上させることにある。
【解決手段】多数の汎用レジスタからなるレジスタファイル130を有するマルチスレッド方式などのマイクロプロセッサ10において、プログラムの実行単位モジュールであるスレッド毎に使用するレジスタ数に応じて、汎用レジスタを割当てるための命令コードオフセットデータを作成する。
【選択図】 図1
【解決手段】多数の汎用レジスタからなるレジスタファイル130を有するマルチスレッド方式などのマイクロプロセッサ10において、プログラムの実行単位モジュールであるスレッド毎に使用するレジスタ数に応じて、汎用レジスタを割当てるための命令コードオフセットデータを作成する。
【選択図】 図1
Description
本発明は、一般的にはマイクロプロセッサのプログラム実行方式に関し、特に、スレッドなどの実行単位モジュールに対するレジスタ割当て機能を改善したプログラム実行技術に関する。
一般的に、マイクロプロセッサでは、クロック周波数が高くなるにしたがって、メモリアクセスのレイテンシ(latency)がプロセッサの性能、換言すればプログラムの実行性能のボトルネックになっている。
この問題を解決するために、キャッシュメモリの使用方法の改善や、マルチスレッド方式の改善などが推進されている。しかしながら、いずれの場合も、別の問題が発生し、必ずしも有効な解決方法はない。
一方、マイクロプロセッサの分野では、RISC(Reduced Instruction Set Computer)方式のプロセッサなどのように、多数の汎用レジスタを実装して、データ処理時の中間データを可能な限りレジスタに保持することで、メモリへのデータの出し入れの回数(アクセス回数)を減らして、プログラムを高速に実行することが実現されている。即ち、RISC方式は、メモリアクセスのレイテンシを向上させることが可能であるため、プログラムの実行性能を高める有効な方式である。
しかしながら、多数の汎用レジスタを使用するマイクロプロセッサでは、スレッド間のコンテキストスイッチのオーバーヘッドが大きくなるという問題が発生する。即ち、多くのレジスタを使って処理を遂行するために、スレッド切り替え時に、セーブ/リストアしなければならないレジスタの数が増大し、スレッド切り替えの応答速度が遅くなってしまうという問題がある。
このような問題を解決するために、スレッドなどの実行単位モジュールが使用する汎用レジスタを限定(固定)することで、特に、スレッド間のコンテキストスイッチのオーバーヘッド時間を短縮化できる方式が提案されている(例えば、特許文献1を参照)。
また、プログラムをモジュール化する場合、手続き呼び出し規約によって、レジスタの使用方法を規定することによって、手続き間での値の受け渡しや、手続きをまたがって値をレジスタに保持できるようにしているが、この制約によって、多くのレジスタを有効に利用することができないことがある。
この問題は、コンパイラの最適化処理において、インタープロシジャ・レジスタ割り当てを行う方式を採用することによって克服可能である(例えば、非特許文献1,2を参照)。しかしながら、このような方式では、すべての手続きを静的にリンクする必要があり、プログラム部品のモジュール性が損なわれてしまうという問題がある。
特開2000−242505号公報
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.
先行技術の方式は、汎用レジスタを有効に使用していないため、メモリアクセスのレイテンシを向上させることができす、プログラムの実行性能を高めるためには有効とはいえない。
そこで、本発明の目的は、特に多数のレジスタを有するプログラム実行装置において、レジスタの利用効率を向上させることにより、メモリアクセスのレイテンシを向上させて、プログラムの実行性能を高めることにある。
本発明の観点に従ったプログラム実行装置は、プログラムの実行単位モジュールを格納する記憶部と、前記実行単位モジュールに必要なレジスタ群から構成されるレジスタファイルと、前記実行単位モジュールが使用するレジスタ数に基づいてレジスタ番号の開始を示す開始情報を作成し、当該開始情報に従って前記レジスタファイルから前記実行単位モジュール毎にレジスタに割当てるレジスタ割当て手段とを備えたものである。
本発明のプログラム実行装置であれば、特に汎用レジスタ等の多数のレジスタを有し、マルチスレッド方式などのマイクロプロセッサに適用した場合に、レジスタを有効に使用してレジスタの利用効率を向上させることにより、結果的にメモリアクセスのレイテンシを向上させて、プログラムの実行性能の向上を図ることができる。
以下図面を参照して、本発明の実施形態を説明する。
(第1の実施形態)
図1は本実施形態に関するマイクロプロセッサ(MPU)を要部とするプログラム実行装置のシステム構成を示すブロック図である。
図1は本実施形態に関するマイクロプロセッサ(MPU)を要部とするプログラム実行装置のシステム構成を示すブロック図である。
MPU10は、例えばRISC方式のプロセッサであり、通常の演算ユニット(ALU)100と、高速にアクセス可能なローカルメモリ110と、DMA(direct memory access)コントローラ120と、多数の汎用レジスタからなるレジスタファイル130とを有する。
DMAコントローラ120は、メインメモリ20とローカルメモリ110間のデータ(プログラムを含む)の入出力を、ソフトウェアで制御可能なメモリアクセス機能を備えている。
プログラムファイル30は、ハードウェアとしては例えばディスクドライブであり、ディスク媒体上に、コンパイラ及びプログラムローダなどを含むオペレーティングシステム(OS)300や、各種のライブラリ310及びアプリケーション等のプログラムを格納している。MPU10は、これらのプログラム(OS、コンパイラ、プログラムローダを含む)を実行する。
(スレッドモデルでのプログラム実行方法)
本実施形態のプログラム実行方法は、通常のマルチスレッド方式に相当し、例えばライブラリ310のようなプログラム(サブルーチンも含む)を複数のスレッド(実行単位モジュール)に分割して実行する。本実施形態では、コンパイラが、プログラムをコンパイルするときに、各スレッドが使用するレジスタ数に応じて、レジスタファイル130に含まれる汎用レジスタ(例えばレジスタバンク)に割当てるレジスタ割当て機能を実現している。換言すれば、レジスタファイル130の多数の汎用レジスタを、複数のレジスタバンクに分割して管理し、各スレッドに割当てる処理を実行する。
本実施形態のプログラム実行方法は、通常のマルチスレッド方式に相当し、例えばライブラリ310のようなプログラム(サブルーチンも含む)を複数のスレッド(実行単位モジュール)に分割して実行する。本実施形態では、コンパイラが、プログラムをコンパイルするときに、各スレッドが使用するレジスタ数に応じて、レジスタファイル130に含まれる汎用レジスタ(例えばレジスタバンク)に割当てるレジスタ割当て機能を実現している。換言すれば、レジスタファイル130の多数の汎用レジスタを、複数のレジスタバンクに分割して管理し、各スレッドに割当てる処理を実行する。
以下、図2のフローチャート及び図3を参照して、スレッドモデルのレジスタ割当て処理を説明する。
ここでは、プログラムファイル30から、例えばライブラリ310のようなプログラムがメインメモリ20にロードされるプログラムロード時に、プログラムローダは、ライブラリ310の各スレッド毎に、スレッドが使用するレジスタ数に応じたレジスタバンク(複数の汎用レジスタ)の開始レジスタ番号を設定するためのオフセット(例えば図4に示す410)をプログラムファイル30から取得する(ステップS1)。次に、プログラムローダは、取得したオフセットを設定した命令コードオフセットデータを作成し、メインメモリ20に保存する(ステップS2)。
命令コードオフセットデータ200は、図3(B)に示すように、命令フォーマットのタイプ(ここではタイプ1〜5)毎に、レジスタ番号フィールドに対応するオフセット(N)を設定したテーブル情報(即ち、レジスタ番号変換テーブル情報)である。命令フォーマットは、図3(A)に示すように、命令コードとオペランド(OP1〜OP3)とから構成される。図3(A)において、斜線のオペランドがレジスタ番号フィールドを意味する。なお、最初のデータ200では、図3(B)に示すように、命令コードとしては、全て“0”が設定されている。
さらに、プログラムローダは、ロードするプログラム(ここではライブラリ310)の全ての命令コードに対して、命令コードオフセットデータ200を付与する(ステップS3,S4)。このとき、データ200の命令コードのフィールドには、当該命令コードが設定される。
以上のように本実施形態によれば、プログラムローダは、プログラムロード時に、各スレッド毎に、レジスタファイル130の汎用レジスタを割当てるための命令コードオフセットデータ200を作成する。そして、全ての命令コードに対して、当該命令コードオフセットデータ200を使用して、プログラムコードに変換する。これにより、MPU10では、メインメモリ20からローカルメモリ110に転送されたプログラム(ここではライブラリ310)の各スレッド毎に、当該命令コードオフセットデータ200に従って、自動的に、通常では複数の汎用レジスタ(レジスタバンク)が割当てられる。
ここで、本実施形態に関係するスレッド毎のレジスタ数は、図7に示すように、マルチスレッド方式のプログラム開発時に設定される。プログラム開発時の手順としては、プログラムを複数のスレッドに分割する(ステップS10)。各スレッド毎に、必要なレジスタ数を求める(ステップS11)。さらに、レジスタファイル130の汎用レジスタをレジスタバンクに分割し、各スレッドを割当てる(ステップS12)。
次に、図6及び図8を参照して、マルチスレッド方式のプログラム実行手順を説明する。
図6は、スレッドの状態遷移を示す図である。即ち、スレッドの実行中の状態600、DMA完了待ち状態610、及び実行可能状態620を示す。
MPU10では、プログラムディスパッチャは、スレッドが使用するパラメータをレジスタに設定した後、最初に実行するスレッドの先頭アドレスへ分岐する(ステップS20)。実行中のスレッドがDMAコマンドを実行するとき、DMAライブラリの中でDMAコマンドを実行する(ステップS21)。スレッドは自身のプログラムカウンタをセーブして、ウェイトキューに自身を挿入する(ステップS22)。
さらに、スレッドは、レジスタバンク毎のスケジューリングキューの中から、DMAコマンドが完了して実行可能状態のスレッドを取り出す(ステップS23)。そして、そのスレッドのプログラムカウンタへジャンプする(ステップS24)。
なお、本実施形態では、多数の汎用レジスタを分割して割当てる方法において、割り当てる対象は、スレッドの場合を想定したが、コルーチン(又は関数)の場合にも適用できる。スレッドとコルーチンとの相違では、スレッドが割り込みなどのイベントによって非同期に処理が切り替わるのに対して、コルーチンは自身で処理を中断する機能を有する。
以上要するに、本実施形態によれば、手続き単位(スレッドまたはコルーチンの処理単位)で汎用レジスタを割り当てれば、手続きの入り口と出口で必要なレジスタのセーブ/リストア処理を行うことなく、手続き処理を実行することができる。また、スレッドあるいはコルーチン単位でレジスタを割り当てれば、高速なスレッドあるいはコルーチン切り替えが可能になるため、より細かい単位でスレッドあるいはコルーチンプログラムをスイッチすることが可能となる。
(手続き呼出し方法)
本実施形態に関するレジスタ割当て機能を、通常の手続き呼出し方法に適用した場合の具体例を説明する。ここで、手続きとは、関数呼出し単位を意味する場合がある。
本実施形態に関するレジスタ割当て機能を、通常の手続き呼出し方法に適用した場合の具体例を説明する。ここで、手続きとは、関数呼出し単位を意味する場合がある。
まず、一般的に、マイクロプロセッサの汎用レジスタは、手続き呼出し規約(calling convention)またはリンケージ規約(Linkage convention)によって、callee-saved(non volatile)とcaller-saved(volatile)の2つに分類されている。汎用レジスタの中で、手続き呼出し時に使用される引数を受け渡すための汎用レジスタも、当該規約の中で定義されている。これにより、異なるプログラミング言語で開発したソフトウェアモジュール(関数やライブラリ)であっても、当該規約に従って相互のモジュールを呼出すことが可能となる。
callee-saved汎用レジスタは、呼出された手続きで書き壊す可能性がある場合、呼出された手続きの先頭で値をセーブし、リターンする前にセーブした値をリストアするという規則になっている。
caller-saved汎用レジスタは、呼出された手続きで書き壊してもよい汎用レジスタでありる。当該汎用レジスタは、手続きを呼び出す側で、呼出し前後のレジスタの値を同じにしたい場合は手続きを呼出す前に値をセーブし、手続きから返ってきたところでセーブした値をリストアする必要がある。
手続き処理が小さな単位に分割されている場合は、前記のcallee-saved汎用レジスタを手続きの入り口でセーブし、出口でリストアするという処理のオーバーヘッドが相対的に大きくなる。このオーバヘッドを削減する方法として、周知のように、レジスタウィンドウという仕組みがある。レジスタウィンドウは、手続きを呼出すたびに、ハードウェアで汎用レジスタを切り替えるため、汎用レジスタのセーブ/リストア処理を必要としない。
ところで、手続き(具体的には、関数、メソッドなど)呼出し方法において、呼出された処理が必要とするデータや、オブジェクトが保持する変数は、そのデータや変数を使用するときにレジスタにロードされて、演算が実行される。このとき、手続き(関数やメソッド)からリターンする前に、演算結果をメモリへ書き戻さなければならない。
また、同じ手続き(関数やメソッド)を再度呼出す場合には、書き戻した結果を再びレジスタにロードしてから演算する必要があった。これは、レジスタウィンドウ方式においても同様である。
そこで、本実施形態のレジスタ割当て方法を適用することにより、手続き呼出し規約をフレキシブルに定義可能とする仕組みを提供し、手続きに割り当てられた汎用レジスタが複数回の手続き呼出しにまたがって、その値を保障できる。これにより、手続呼び出しの度に必要なcallee-savedレジスタのセーブ/リストア処理を不要にするのみでなく、呼出された手続きでのメモリアクセス回数の削減を実現する。
まず、手続き呼出し規約で、callee-savedの汎用レジスタを固定のレジスタにするのではなく、例えば以下のように設定する。なお、ここでは、関数も含め、共有ライブラリをロードするときに、物理レジスタであるレジスタファイル130からレジスタを割当てる仕組みを提供する。
図4に示すように、例えば共有ライブラリが使用するレジスタ400を、レジスタファイル130から割当てる場合に、手続きの引数を受け取る領域のレジスタ番号(レジスタ0〜レジスタL−1)を設定する。レジスタ番号Lは、受け取り用引数の開始410を示すオフセット値である。
また、手続きローカルで使用する領域のレジスタ番号(レジスタL〜レジスタM−1)を設定する。レジスタ番号Mは、呼出し用パラメータの開始420を示すオフセット値である。さらに、手続き呼出しで引数を渡す領域のレジスタ番号(レジスタM〜レジスタN−1)を設定する。レジスタ番号Nは、手続きが使用するレジスタの開始430を示すオフセット値である。
ここで、L,M,Nは、レジスタファイル130に含まれる汎用レジスタ数を超えない自然数で、「L<M<N」の関係がある。このL,M,Nは、固定の値ではなく、ソフトウェアモジュールあるいは手続き毎に異なってもよい。
本実施形態のコンパイラは、手続きで使用するレジスタの数を、出来るだけ少なくて済むように最適化し、その手続き(あるいは実行単位モジュール)が呼出す手続き(ライブラリ)の引数レジスタの開始番号の情報(前記Mに相当する)を付加する。このとき、被コンパイル対象のプログラムの実行性能を犠牲にしないように注意する。手続き毎のレジスタ使用に関する情報の付与は、例えばMIPSアーキテクチャのELFファイルでのreginfoセクションのようなフォーマットによって実現することが可能である。
図5は、例えば共有ライブラリが呼出す手続きが使用するレジスタ500の割当ての仕組みを示す図である。この場合も、レジスタ番号Lは、受け取り用引数の開始510を示すレジスタ番号である。また、レジスタ番号Mは、呼出し用パラメータの開始520を示すレジスタ番号である。さらに、レジスタ番号Nは、手続きが使用するレジスタの開始530を示すレジスタ番号である。
プログラム実行時に、呼出す手続きをロードする場合に、当該レジスタ番号Mの情報を使用して、ロードされる手続きの命令をスキャンし、レジスタフィールドの値にMを加える。なお、スタックを使用する場合はスタックポインタを除外し、また、プログラムカウンタが汎用レジスタにある場合は、これも除外する。
以上のような本実施形態のレジスタ割当て処理の仕組みによって、手続き呼出し方法において、呼出された手続きの入り口と出口とでの汎用レジスタのセーブ/リストア処理を不要にすることができる。
次に、複数回の手続き呼出し方法において、変数のレジスタ割当てについて、オブジェクト指向プログラムでのオブジェクト変数のレジスタ割当て処理の具体例を、図9から図14を参照して説明する。
オブジェクト指向のプログラムでは、オブジェクトが保持する変数へのアクセスは、そのオブジェクトが定義するメソッドを呼出すことによって行うことが多い。このような場合、同じメソッドを繰り返し呼出すと、オブジェクト変数のレジスタへのロード、リストア処理が、煩雑に行われることになり、処理の効率低下につながる。この問題を解決するために、プログラムコンパイル時に、呼出されるメソッドをインラインに展開することが行われる。
このようにすることで、手続き呼出しの方法を使わずに、処理全体を手続きを呼出す側で最適化することが可能になり、オブジェクト変数への繰り返しのアクセスは、最初の1回目にメモリからレジスタに読み込めば、それ以降はレジスタへのアクセスにすることができるので、効率のよい実行モジュールとすることができる。
一方、インライン展開を多用すると、オブジェクトコードのサイズが増大するので、メモリサイズの制約の厳しい組み込みシステムでは、限定的に使うことしかできなかったり、キャッシュミスが煩雑に起きるようになって、返って実行性能が低下することもあり得る。また、ダイナミックに結合するライブラリや、オブジェクトメソッドでは、インライン展開の手法を使用できない。
そこで、本実施形態により実現されるフレキシブルな手続き呼出し規約によって、柔軟に対応可能であることを以下に示す。以下の記述で、外部手続きとは、コンパイル済みのソフトウェアモジュールにおいて、そのモジュール内に定義されていない手続きのことを意味する。この外部手続きは、ソフトウェアモジュールをリンクするときに、モジュール全体に取り込まれることもあり得るし、あるいは、実行時に、必要になった時点で、ファイルからメモリへロードされるような実行形態をとる。
まず、コンパイラは、前述のように、手続き呼出しの引数渡し用のレジスタの開始番号の情報を、モジュール単位あるいは手続き単位で付与する。この情報の付与方法は、例えば以下のような手順からなる。
第1段階で、モジュール全体でデフォルトの外部手続き呼び出しの引数渡し用のレジスタの開始番号を設定する。この開始番号は、例えば、モジュール全体で使用するレジスタの最大値にする。
第2段階として、呼出す外部手続き間で、使用するレジスタが重ならないようにするべき外部手続きをピックアップする。これらの呼出しの引数渡し用のレジスタ開始番号を、他の外部手続きと重ならない程度に大きい方へずらす。
第3段階で、デフォルトの開始番号の情報と共に、第2段階でピックアップした外部手続きの引数渡し用のレジスタ開始番号の情報を、モジュールに付与する。付与する場所は、外部手続き呼出しのためのシンボル情報と一緒に、オブジェクトファイルに保管する。
第4段階として、プログラム実行時に外部手続き呼出しを行うために、その外部手続きを含むモジュールをロードする場合、前記引数渡し用のレジスタ開始番号と、現在実行中のモジュールがロードされたときにレジスタ番号フィールドに、足し算されたオフセット値とを加えた値を、ロードする外部手続きのレジスタ番号フィールドに加える。
ここで、コンパイラは、図9に示すメソッド900(method Aとする)のコンパイルにおいて、オブジェクト変数がすでにレジスタにロードされた状態で実行されるメソッドコード920と、当該メソッドコード920の先頭にオブジェクト変数をレジスタにロードする処理を付与したメソッドコード910と、当該メソッドコード920の最後にオブジェクト変数をメモリへストアする処理を付与したメソッドコード930とを生成する。
これらの処理を、図10に示すような手順での処理にすれば、従来の手続き呼出し規約による手続き実行コード(920)のコードサイズの大きさと同等にすることが可能である。図10において、E1〜E5は各処理のエントリを示す。
即ち、メソッドコード910を生成する処理(ステップS30)の後に、メソッドコード930の生成のエントリE2として、プロローグ処理に相当するリターン変更処理を付与する(ステップS31)。リターン変更処理とは、オブジェクト変数をロードしてリターンアドレスをスタックへセーブし、さらにリターンアドレスをアドレス2に変更する。このアドレス2は、オブジェクト変数をメモリへストアするときに設定するアドレスである。
メソッド900のエントリE3として、レジスタへロードし、リターン変更処理を実行する(ステップS32)。さらに、メソッドコード920のエントリE4として、手続き処理本体を設定する(ステップS33)。そして、リターン変更処理のエントリE5として、適当な場所にオブジェクト変数をメモリへストアし、リターン2の処理を実行する(ステップS34)。リターン2の処理は、スタックからリターンアドレスをロードし、ロードしたアドレスへリターン(ジャンプ)するエピローグ処理である。
図11及び図12は、メソッドの呼出し処理のシーケンスを示す概念図である。
通常では、図11に示すように、各呼出し処理(S40)毎に、オブジェクト変数をレジスタにロードする処理、オブジェクト変数をメモリへストアする処理を実行する。
これに対して、図12に示すように、最初の呼出し処理(S50)で、オブジェクト変数をレジスタにロードする処理を実行することにより、後続のメソッドの呼出し処理(S51〜S53)では、オブジェクト変数をメモリからロードする必要はない。そして、最後のメソッドの呼出し処理(S54)で、オブジェクト変数をメモリへストアする処理を実行する。
さらに、図13及び図14は、メソッド(method A)の呼出し処理の途中で、別のメソッド(method B)を呼出す必要がある場合のシーケンスを示す。なお、図13及び図14レジスタファイル130の左から右に向かって使用するレジスタ番号が大きくなる。
通常では、図13に示すように、メソッド(method A)の呼出し処理は、メソッドコードの先頭にオブジェクト変数をレジスタにロードする処理(S60,S63)、及びメソッドコードの最後にオブジェクト変数をメモリへストアする処理(S61,S64)を順次実行する。この途中で、別のメソッド(method B)を呼出す処理(S62)を実行する場合に、当該メソッド(method B)に割当てるレジスタ133は、メソッド(method A)に割当てるレジスタ131,132,134,135と同一レジスタ番号である。
これに対して、図14に示すように、本実施形態では、メソッド(method A)の呼出し処理において、最初の呼出し処理(S70)でオブジェクト変数をレジスタにロードする処理を実行し、最後の呼出し処理(S74)で、オブジェクト変数をメモリへストアする処理を実行する。
そして、この途中で、別のメソッド(method B)を呼出す処理(S72)を実行する場合に、当該メソッド(method B)に割当てるレジスタ142を、メソッド(method A)に割当てるレジスタ140,141,145,146よりも大きいレジスタ番号にずらす。
なお、図14において、143は引数を渡すためのレジスタであり、144は返り値を受け取るためのレジスタである。従って、メソッド(method A)を実行するオブジェクトに割り当てたレジスタの値を、メソッド(method B)に跨って有効にしておくことが可能である。
以上のように、多数の汎用レジスタがあるマイクロプロセッサにおいては、レジスタの利用方法を手続き呼出し規約によって固定的に決めてしまうのではなく、手続き呼出しのためのレジスタの開始オフセット番号などの情報によって、レジスタファイルのどの部分に割り当てられても、手続き呼出しが矛盾なく行えるように手続きをロードすることで、多数あるレジスタを有効に使い分けることが可能となる。
また、上記のような実行時の各手続きへのレジスタ割り当ての管理手法を、スレッドやコルーチンに応用すれば、スレッドやコルーチンの切り替えを高速に行うことが可能であり、メモリアクセスのレイテンシの間に、別のコルーチンの処理を実行するというような微粒度の実行切り替えを実現することが可能となる。
(第2の実施形態)
図15から図18は、第2の実施形態に関する図である。
図15から図18は、第2の実施形態に関する図である。
本実施形態は、前述のマルチスレッドのモデルとは異なり、プログラム作成時に、DMA処理によって処理を完結するようなモデルに従って、プログラムを作成する方法に関する。
このようなモデルにより作成した処理単位を、便宜的にコードフラグメントと呼ぶことにする。
コードフラグメントは、エントリポイントから実行が開始され、最後にDMAコマンドの実行によって、その実行単位を終了する。コードフラグメントは、最後に実行したDMAコマンドが完了した後に、次に実行すべきコードフラグメントを指定する。このようなコードフラグメントの集合によって作成したプログラムを、コンパイルしてスレッドモデルの場合と同様に、レジスタファイル130に含まれるレジスタバンクに割り当てる。
これらのコードフラグメントの集合は、図18に示すように、次に実行すべきコードフラグメント170の依存関係を表したタスクグラフによって管理される。ここで、コードフラグメント170は、図17に示すように、スレッドなどの実行処理部171と、DMAコマンドの発行処理部172とを含む。
コードフラグメント170の実行環境としては、図17に示すように、コードフラグメント170をメモリへロードし、レジスタファイル130の各レジスタバンク180〜182毎にスケジューリングキューをタスクグラフの情報に従って生成する。
コードフラグメントスケジューラは、タスクグラフの情報を参照しながら、図15に示すように、コードフラグメントの実行をスケジュールする。即ち、プログラム開発時の手順としては、DMAで完結するコードフラグメントの集まりとしてプログラムを記述する(ステップS80)。次に、データ(オブジェクト)の受け渡しをタスクフラグで表現する(ステップS81)。さらに、タスクグラフの依存関係と必要レジスタ数により、レジスタファイル130のレジスタバンクに割当てる(ステップS82)。そして、データ依存関係に従ったDAG構造のスケジューリングキューを生成する(ステップS83)。
図16は、コードフラグメントモデルでのプログラム実行手順を説明する。
プログラムディスパッチャは、ディスパッチされたコードフラグメントの処理及びDMAコマンドを実行する(ステップS90,S91)。自身の後ろにつながったコードフラグメントを実行したDMAの完了待ちの印をつけて、レジスタバンク毎のスケジューリングキューの最後尾に挿入する(ステップS92)。
さらに、スケジューリングキューの先頭にあるコードフラグメントの中で、DMA完了待ちが解けたものを選んでキューから取り出し、その先頭へジャンプする(ステップS93)。
このコードフラグメントは、オブジェクト指向のメソッドとして実装される構成でもよい。また、コードフラグメントの命令コードは、データと共にダイナミックにDMAによってロードされてもよい。
さらに、C言語のようなスタックを前提としたプログラムモデルではなく、多数の汎用レジスタを使い分けることによって、プログラムの状態を保持するモデルを考えることも可能である。この場合、並列処理を自然に記述可能なデータフローモデルや、オブジェクトが自立的にプログラムを実行するアクタモデルのような並列プログラムも、本実施形態のスレッドまたはコルーチンの方法を使うことで、効率のよいプログラムにすることが可能である。
以上要するに第2の実施形態によれば、コードフラグメントモデルによるプログラム実行においては、各処理をレジスタバンクに割り当てる必要性がないので、プログラムを適切に分割することにより、高いスループットを得ることが可能である。
また、さまざまな処理の形態に応じて、プログラミングの形態を選択可能であり、ハイブリッドな処理スケジュールによって、メモリアクセスの遅延サイクルの増減に、柔軟に対応することが可能となる。スタックを使わないので、余分なメモリ管理をする必要がなくなるし、変数のスタックへの出し入れも必要ない。
(第3の実施形態)
図19から図24は、第3の実施形態に関する図である。
図19から図24は、第3の実施形態に関する図である。
図19は、本実施形態に関するプログラム実行装置の要部を示すブロック図である。なお、要部以外の構成は、前述の第1の実施形態での図1と同様であるため、説明を省略する。
本実施形態のソフトウェア構成とは、ソースプログラム301と、コンパイラ302と、プログラムローダ303と、スレッドライブラリ313とを有する。
コンパイラ302は、ソースプログラム301をコンパイルしてオブジェクトモジュール(オブジェクトコード)を生成する。コンパイラ302は、当該コンパイル時にコンテキスト用に使用されるレジスタ情報をオブジェクトモジュール(オブジェクトファイル)に付与する処理を実行する(図20を参照)。オブジェクトモジュールは、ライブラリオブジェクト311及びスレッドオブジェクト312を含む。
プログラムローダ303は、コンパイラ302により生成されたオブジェクトモジュールをメインメモリ20にロードする。プログラムローダ303は、ロード時にレジスタ番号を書き換えるルーチン303Aを含む。
スレッドライブラリ313は、プログラムローダ303によりロードされたスレッドオブジェクト312を起動する。スレッドライブラリ313は、起動時にレジスタ番号を書き換えるルーチン313Aを含む。
(コンパイラの処理手順)
図20は、コンパイラ302の処理手順を示すフローチャートである。
図20は、コンパイラ302の処理手順を示すフローチャートである。
本実施形態のコンパイラ302は、図20に示すように、ソースプログラム301に含まれるソースコードを入力して、オブジェクトコードを生成して出力する通常のコンパイル処理を実行するフェーズ(ステップS100〜S109)と共に、レジスタ割り当て処理を実行するフェーズ(ステップS106)を含む。
通常のコンパイル処理を実行するフェーズは、入力したソースコードの字句解析処理(S101)、構文解析処理(S102)、中間表現生成処理(S103)、最適化処理(S104)、命令選択処理(S105)、コード生成処理(S107)、アセンブラ処理(マシンコードへの変換処理、S108)、及びオブジェクトコードの出力処理(S109)からなる。
次に、レジスタ割り当て処理を実行するフェーズ(ステップS106)は、ステップS110からS113の各処理を含む。
ここで、ソースプログラム301は、コンテキスト切り替えポイントを明示的に指定するための処理ステップを含む。例えば、「yeield();」というライブラリ呼び出しステップによって、コンテキストを切り替える。
コンパイラ302は、レジスタ割り当てフェーズでは、ソースコードをスレッド単位に設定し、以下の処理を実行する(ステップS110)。即ち、通常のレジスタ割り当て処理を実行した後に、全てのコンテキスト切り替えポイントを調べて、当該コンテキスト切り替えポイントで有効なデータを保持しているレジスタの和集合を求める(ステップS112)。
さらに、コンパイラ302は、求めたレジスタの和集合(レジスタ情報)をスレッドのコンテキスト用に使用される情報として生成する(ステップS113)。コンパイラ302は、当該レジスタ情報をオブジェクトファイルに付与する。ここで、当該レジスタ情報は、図21に示すような構造を有し、スレッド又はライブラリのエントリポイント(コンテキスト切り替えポイント)を示す情報220、コンテキスト用レジスタ番号の最小値を示す情報221、及びコンテキスト用レジスタ番号の最大値を示す情報222を有する。
ここで、図20において、スレッド単位でのレジスタ情報の生成処理を、スレッド単位ではなく手続き単位とし、コンテキスト切り替えポイントを手続き呼び出しに置き換えると、各手続き単位でのレジスタ情報を得ることができる。
また、図20において、コード生成フェーズ(S107)においては、通常は、手続きの入口または出口や、スレッドの切り替え時にレジスタのセーブ/リストアを行う処理を生成する。この場合、本実施形態の方式によって、レジスタをスレッドや手続き単位で割り当てて使うことができるので、セーブ/リストアの処理のためのコード生成を省略することができる。
(レジスタ番号の書き換え処理の手順)
以上のようにして、コンパイラ302により生成されたオブジェクトコードからなるオブジェクトファイルを、プログラムローダ303は、プログラム実行時にメインメモリ20へロードする。プログラムローダ303は、当該ロード時に、図22のフローチャートに示すような手順により、レジスタ番号の書き換え処理を実行する(ルーチン303Aの実行)。
以上のようにして、コンパイラ302により生成されたオブジェクトコードからなるオブジェクトファイルを、プログラムローダ303は、プログラム実行時にメインメモリ20へロードする。プログラムローダ303は、当該ロード時に、図22のフローチャートに示すような手順により、レジスタ番号の書き換え処理を実行する(ルーチン303Aの実行)。
ここでは、プログラムローダ303は、ダイナミックにロードする関数ライブラリをロードするときに、以下のような手順でレジスタ番号の書き換え処理を実行する。
まず、プログラムローダ303は、当該関数のエントリポイントに相当するレジスタの利用領域をオブジェクトファイルに付与されたレジスタ情報から取得する(ステップS201)。即ち、プログラムローダ303は、当該エントリポイントに対応付けられたコンテキスト用レジスタ番号の最小値と最大値を取得する(図21を参照)。
次に、プログラムローダ303は、予め用意されているレジスタ利用状況管理表210から、それらのレジスタを割り当てるためのメモリの空き領域(空きレジスタ)を求める(ステップS202)。即ち、レジスタ利用状況管理表210より、「最大値−最小値+1」の範囲のレジスタ番号に対応するレジスタの空き領域を見つける。
レジスタ利用状況管理表210は、例えば図23に示すような構造である。即ち、レジスタ利用状況管理表210は、レジスタ番号Nに対応するコンテキストを識別するID情報、及び当該コンテキスト用レジスタ領域のサイズを示す情報を有する。
プログラムローダ303は、割り当てるための十分な空き領域(空きレジスタ)を確保できない場合には、所定のエラー処理を実行する(ステップS203のNO)。この場合、プログラムローダ303は、エラー処理ではなく、従来の手続きと同様にコンパイルしたモジュールを用意しておき、通常のプログラムロード処理を続行してもよい。
一方、プログラムローダ303は、レジスタとして割り当てるための十分な空き領域を見つけると、メモリへロード(または起動)する全ての命令コードのレジスタフィールドを順次探索する(ステップS203のYES,S204)。次に、プログラムローダ303は、各レジスタフィールドについてレジスタ番号の書き換え処理を実行する(ステップS205)。
即ち、プログラムローダ303は、レジスタフィールドのレジスタ番号を取得する(ステップS206)。プログラムローダ303は、当該レジスタ番号が、前述のコンテキスト用レジスタ番号の最小値と最大値の範囲に含まれるか否かを判定する(ステップS207)。この判定により、当該レジスタ番号が、コンテキスト用レジスタ番号として割り当てられたレジスタであれば、プログラムローダ303は、命令コードの該当レジスタフィールドの当該レジスタ番号を書き換える(ステップS208)。ここで、手続きのコンテキスト用として割り当てられたレジスタは、手続き呼び出しをまたがって有効なレジスタの和集合として割り当てられたレジスタを意味する。
以上のようにしてプログラムローダ303は、命令コードの各レジスタフィールドの全て、及び全ての命令コードについてのレジスタ番号の書き換え処理を実行する(ステップS209,S210)。これにより、オブジェクトファイルでのコンテキスト用レジスタとして記録されたレジスタ番号と、その他のオブジェクトファイルで使用されるレジスタ番号とが重複されないように調整される。
このようにしてロードされた関数ライブラリは、入口と出口でのレジスタのセーブ/リストアを行うことなく、ライブラリ処理を実行することが可能となる。
なお、プログラムローダ303は、関数ライブラリをロードする場合以外に、スレッドオブジェクトの場合にも、前述と同様の手順で書き換え処理を実行する。但し、スレッドオブジェクトの場合には、プログラムロード時にレジスタ番号を書き換える方法と、スレッド起動時にレジスタ番号を書き換える方法の2通りの方法がある。
ロード時にレジスタ番号を書き換える方法は、スレッド起動時に書き換える方法と比較して、ロードしたコードを実行するスレッドが、同時に複数生成されることがない場合に有効である。一方、1つのコードから複数のスレッドを起動する場合には、スレッド起動時にレジスタ番号の書き換えを行う必要があるため、スレッド起動時に書き換える方法が有効となる。
(プログラム実行状況)
図24は、本実施形態に関するプログラム実行時のレジスタ使用状況の概念を示す図である。
図24は、本実施形態に関するプログラム実行時のレジスタ使用状況の概念を示す図である。
図24(B)は、レジスタファイル130の構成を示す図である。本実施形態では、プログラム実行として、便宜的にスレッド単位でのスレッドAとスレッドBが起動する場合を想定する。コンパイラ302は、レジスタファイル130において、スレッドAとスレッドBが共通に使用するワーキングレジスタ240と、各スレッドA,Bに、スレッドコンテキストとして割り当てられたレジスタ241,242とに区別して、オブジェクトファイルに記録する。ワーキングレジスタ240は、スレッドが使用するレジスタの中で、コンテキスト切り替えポイントで有効な値を保持しないレジスタである。
プログラムローダ303は、それぞれのスレッドA,Bをメモリ20にロードする際、レジスタファイル130の一部を、それぞれのスレッドコンテキスト用レジスタ241,242として割り当て、残りをワーキングレジスタ240として使用する。
図24(A)は、スレッドA,Bがそれぞれ処理1〜3を実行するときに、共通に使用可能なワーキングレジスタ240と、それぞれに割り当てられたレジスタ241,242の使用状況を示す。符号「P」は、コンテキスト切り替えポイントを示す。
図24(C)は、スレッドA,Bが時分割で実行する状況を示す。
即ち、スレッドAが起動して処理1を終了し、例えば「yeield();」というライブラリ呼び出しステップによって、コンテキストが切り替わると(ポイントP)、スレッドBの処理1に切り替わる。
スレッドBは、スレッドAに割り当てられたレジスタ241とは別の領域のレジスタ242を使用して、処理1を実行する。このため、スレッドAからスレッドBへ切り替わるときに、レジスタのセーブ/リストアを行う必要がない。以下、同様にして、コンテキスト切り替えポイントに応じて、スレッドA,Bの切り替えを行いながら、それぞれの処理1〜3が続行される。
このような高速のスレッド切り替えの効果は、例えば、スレッドAがスレッドBに切り替わる直前で、アクセスレイテンシの大きいメモリへアクセスし、スレッドBが動いている間にデータがCPUコアの近くまで転送されていると、レイテンシの間に別の処理を行うことができ、CPUのスループット向上につながる。
なお、本実施形態では、ライブラリやスレッドという単位でレジスタをダイナミックに割り当てる方法について説明したが、オブジェクト指向プログラムにおけるオブジェクトインスタンスを単位としてダイナミックにレジスタを割り当てることも可能である。また、オブジェクトへの付加情報を最小値と最大値のみでなく、具体的に必要なすべてのレジスタ番号としてもよい。実際上では、コンパイラによって、これらのレジスタを1つの領域にまとめることが可能であるため、最小値と最大値のみの情報で十分である。
また、手続き呼び出しのネスト関係や、スレッドの同時実行の制約などがあれば、同時に存在し得ない手続き同士や、スレッド同士は、同じ領域のレジスタを割り当てることが可能である。
以上要するに本実施形態の特徴は、ダイナミックに結合されるライブラリや、スレッドのコンテキスト部分のレジスタ番号を、プログラムロード時およびスレッド起動時に、書き換えることにある。これにより、レジスタの衝突を避け、手続き呼び出し時とスレッドコンテキスト切り替え時に必要であったレジスタの退避、復元処理を行うことなしに、プログラムによる処理を切り替えることができる。この場合に、レジスタの利用方法を規定することによって、レジスタの利用効率を向上させることができる。
また、プログラムによる処理の切り替えコストを抑えることが可能であるので、プログラム部品のモジュール性を維持したまま、高性能なプログラムを実現することが可能である。また、レジスタの利用効率の向上により、単位処理あたりで使えるレジスタの数が増大し、より効率のよいコードを生成することが可能となる。
さらに、高速な処理のスケジューリング機能と一緒に使えば、非常に細かい単位で処理を切り替えても性能に影響を与えることはないので、メモリアクセスのレイテンシの間に、別の処理をスケジュールして実行すれば、プロセッサのスループットがメモリアクセスのレイテンシに縛られることがなくなる。
本実施形態の効果を要約すると、以下のとおりである。
(1)レジスタセーブ/リストアをしない高速なスレッドコンテキスト切り替えを実現することができる。
(2)ダイナミックに呼び出されるプログラムモジュール間でのレジスタ割り当ての最適化を実現することができる。
(3)スレッドコンテキストやダイナミックライブラリ毎に、必要なレジスタを割り当てることができる。
(4)スレッドに割り当てるレジスタは、コンテキストスイッチ時に値を保持しているレジスタだけで、それ以外のレジスタは、ワーキングレジスタとしてスレッド間で共用することができる。
(5)コンテキストは、プログラマが明示的に切り替えることができる。
(6)コンパイル時に、コンテキスト切り替えポイントでの生存レジスタ数が少なくなるよう最適化することができる。
(7)スレッド起動時あるいはロード時に、まだ使われていないレジスタエリアを見つけて、スレッドコンテキストに割り当てられたレジスタ番号を書き換えることで、スレッド間でのレジスタ割り当ての最適化を実現することができる。
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
10…マイクロプロセッサ(MPU)、20…メインメモリ、30…プログラムファイル、
100…演算ユニット(ALU)110…ローカルメモリ、
120…DMAコントローラ、130…レジスタファイル。
100…演算ユニット(ALU)110…ローカルメモリ、
120…DMAコントローラ、130…レジスタファイル。
Claims (21)
- プログラムの実行単位モジュールを格納する記憶部と、
前記実行単位モジュールに必要なレジスタ群から構成されるレジスタファイルと、
前記実行単位モジュールが使用するレジスタ数に基づいて前記レジスタファイルのレジスタ番号の開始を示す開始情報を作成し、当該開始情報に従って前記レジスタファイルから前記実行単位モジュール毎にレジスタを割当てるレジスタ割当て手段と
を具備したことを特徴とするプログラム実行装置。 - 前記実行単位モジュールは、スレッド単位またはコルーチン単位のプログラム単位モジュールであることを特徴とする請求項1に記載のプログラム実行装置。
- 前記レジスタ割当て手段は、前記記憶部に転送される前記実行単位モジュールがプログラムファイルからメインメモリにロードされるプログラムロード時に、前記実行単位モジュールに対して前記開始情報を使ってプログラムコードに変換することを特徴とする請求項1に記載のプログラム実行装置。
- 前記レジスタ割当て手段は、前記レジスタ番号の開始情報を使って、命令フォーマットのタイプ毎に前記開始情報を指定するためのオフセット値をセットした命令コードオフセットデータを作成し、
前記実行単位モジュールに含まれる全ての命令コードに対して当該命令コードオフセットデータを加算する処理を実行することを特徴とする請求項1に記載のプログラム実行装置。 - 前記開始情報は、手続き呼出し用のレジスタの開始オフセット番号であることを特徴とする請求項1に記載のプログラム実行装置。
- メインメモリにロードされたプログラムの実行単位モジュールのうち、当該メインメモリから転送される前記実行単位モジュールを格納するローカルメモリと、
前記メインメモリから前記ローカルメモリへのデータ転送を実行するDMAコントローラと、
前記実行単位モジュールの実行時に必要な汎用レジスタ群から構成されるレジスタファイルと、
プログラムファイルから前記メインメモリへのプログラムロード時に、前記実行単位モジュールが使用するレジスタ数及び手続き呼出し用のレジスタ番号の開始を示す開始情報に従って、前記レジスタファイルに含まれるレジスタを前記実行単位モジュール毎に割当てるレジスタ割当て手段と
を具備したことを特徴とするマイクロプロセッサ。 - 前記レジスタ割当て手段は、前記プログラムロード時に、前記レジスタ番号の開始情報を使って、命令フォーマットのタイプ毎に前記開始情報を指定するためのオフセット値をセットした命令コードオフセットデータを作成し、
前記実行単位モジュールに含まれる全ての命令コードに対して当該命令コードオフセットデータを加算する処理を実行することを特徴とする請求項6に記載のマイクロプロセッサ。 - 前記実行単位モジュールは、プログラムを分割した実行処理単位プログラムであり、前記メインメモリから前記ローカルメモリへのDMA転送を実行するためのDMAコマンドを発行する機能を実行し、当該DMAコマンドの実行完了前に分割された実行処理を終了するように構成されていることを特徴とする請求項1に記載のプログラム実行装置または請求項6に記載のマイクロプロセッサ。
- プログラムの実行単位モジュールを格納するローカルメモリと、前記実行単位モジュールに必要なレジスタ群から構成されるレジスタファイルとを有するプロセッサに適用するプログラム実行方法であって、
前記実行単位モジュールが使用するレジスタ数に基づいて、前記レジスタファイルからレジスタ番号の開始を示す開始情報を取得する手順と、
前記開始情報に従って、前記レジスタファイルに含まれるレジスタを前記実行単位モジュール毎に割当てる手順と
を有するプログラム実行方法。 - 前記割当て手順は、前記ローカルメモリに転送される前記実行単位モジュールがプログラムファイルからメインメモリにロードされるプログラムロード時に、前記実行単位モジュールに対して前記開始情報を付与することを特徴とする請求項9に記載のプログラム実行方法。
- 前記割当て手順は、
前記開始情報を指定するためのオフセット値を取得する手順と、
前記レジスタ番号の開始情報を使って、命令フォーマットのタイプ毎に前記オフセット値を当該レジスタ番号フィールドにセットした命令コードオフセットデータを作成する手順と、
前記実行単位モジュールに含まれる全ての命令コードに対して当該命令コードオフセットデータを加算する処理を実行する手順と
を含むことを特徴とする請求項9に記載のプログラム実行方法。 - マルチスレッド方式のマイクロプロセッサに適用するプログラム実行方法であって、
プログラムロード時に、レジスタファイルに含まれるレジスタバンクの中で、スレッド単位モジュールが使用するレジスタ番号の開始を設定するためのオフセット値を取得する手順と、
命令フォーマットのタイプ毎に前記オフセット値をセットした命令コードオフセットデータを作成する手順と、
前記スレッド単位モジュールに含まれる全ての命令コードに対して当該命令コードオフセットデータを使ってプログラムコードに変換する処理を実行する手順と
を有することを特徴とするプログラム実行方法。 - プログラムを格納するメモリ手段と、
コンテキスト切り替えポイントが含まれるソースプログラムからオブジェクトコードからなるオブジェクトファイルを生成するときに、当該コンテキスト切り替えポイントに基づいてコンテキスト用レジスタを割り当てるためのレジスタ情報を前記オブジェクトファイルに付与するコンパイラ手段と、
前記コンパイラ手段により生成された前記オブジェクトファイルから前記レジスタ情報を取得して、当該レジスタ情報に基づいて前記コンテキスト用レジスタとして使用するレジスタ領域を前記メモリ手段の空き領域に割り当てるレジスタ割り当て処理手段と
を具備したことを特徴とするプログラム実行装置。 - 前記コンパイラ手段は、通常コンパイル処理を実行するフェーズとレジスタ割り当て処理を実行するフェーズとを含み、
当該レジスタ割り当て処理を実行するフェーズにおいて、前記コンテキスト切り替えポイントで有効なデータを保持しているレジスタの和集合を前記レジスタ情報として生成することを特徴とする請求項13に記載のプログラム実行装置。 - 前記レジスタ割り当て処理手段は、前記コンパイラ手段により生成された前記オブジェクトファイルを前記メモリ手段にロードするプログラムローダに含まれることを特徴とする請求項13又は請求項14のいずれか1項に記載のプログラム実行装置。
- 前記レジスタ情報は、前記コンテキスト切り替えポイントを示す情報、前記コンテキスト用レジスタとして使用するレジスタ領域の範囲を示すレジスタ番号の最大値、及び当該レジスタ番号の最小値を含むことを特徴とする請求項13又は請求項14のいずれか1項に記載のプログラム実行装置。
- 前記コンパイラ手段は、前記ソースプログラムからスレッド単位のスレッドオブジェクトをコンパイル処理し、
前記レジスタ割り当て処理手段は、前記コンパイラ手段により生成された前記スレッドオブジェクトを実行するスレッドライブラリに含まれることを特徴とする請求項13又は請求項14のいずれか1項に記載のプログラム実行装置。 - 前記レジスタ割り当て処理手段は、前記メモリ手段に用意されているレジスタ利用状況を管理するテーブル情報を使用して、前記コンテキスト用レジスタとして使用するレジスタ領域の範囲に相当するメモリ空き領域を前記メモリ手段で確保することを特徴とする請求項13から請求項17のいずれか1項に記載のプログラム実行装置。
- 前記コンパイラ手段は、前記コンテキスト用レジスタとして使用するレジスタと、それ以外で使用するレジスタとを区別して前記オブジェクトファイルに記録することを特徴とする請求項13から請求項18のいずれか1項に記載のプログラム実行装置。
- 前記請求項13から請求項19のいずれか1項に記載のプログラム実行装置を含むことを特徴とするマイクロプロセッサ。
- ソースプログラムをコンパイルしたオブジェクトファイルを格納するメモリ手段と、前記オブジェクトファイルの実行単位モジュールに必要なレジスタ群を確保するためのレジスタファイルとを有するプロセッサに適用するプログラム実行方法であって、
コンテキスト切り替えポイントが含まれるソースプログラムを、オブジェクトコードからなるオブジェクトファイルを生成するときに、当該コンテキスト切り替えポイントに基づいてコンテキスト用レジスタとして使用するレジスタを割り当てるためのレジスタ情報を前記オブジェクトファイルに付与するコンパイラ機能と、
前記オブジェクトファイルを前記メモリ手段にロードする機能と、
前記メモリ手段にロードされた前記オブジェクトファイルから前記レジスタ情報を取得して、当該レジスタ情報に基づいて前記コンテキスト用レジスタとして使用するレジスタ領域を前記レジスタファイルに割り当てるレジスタ割り当て処理機能と
を具備したことを特徴とするプログラム実行方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2004159232A JP2005129001A (ja) | 2003-09-30 | 2004-05-28 | プログラム実行装置、マイクロプロセッサ及びプログラム実行方法 |
US10/948,525 US20050081016A1 (en) | 2003-09-30 | 2004-09-24 | Method and apparatus for program execution in a microprocessor |
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003339978 | 2003-09-30 | ||
JP2004159232A JP2005129001A (ja) | 2003-09-30 | 2004-05-28 | プログラム実行装置、マイクロプロセッサ及びプログラム実行方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2005129001A true JP2005129001A (ja) | 2005-05-19 |
Family
ID=34425318
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2004159232A Withdrawn JP2005129001A (ja) | 2003-09-30 | 2004-05-28 | プログラム実行装置、マイクロプロセッサ及びプログラム実行方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US20050081016A1 (ja) |
JP (1) | JP2005129001A (ja) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8019705B2 (en) * | 2003-03-24 | 2011-09-13 | Fiske Software, LLC. | Register and active element machines: commands, programs, simulators and translators |
US8010467B2 (en) * | 2003-03-24 | 2011-08-30 | Fiske Software Llc | Active element machine computation |
US7506325B2 (en) * | 2004-10-07 | 2009-03-17 | International Business Machines Corporation | Partitioning processor resources based on memory usage |
JP2006268753A (ja) * | 2005-03-25 | 2006-10-05 | Fujitsu Ltd | Dma回路及びコンピュータシステム |
US7784051B2 (en) * | 2005-11-18 | 2010-08-24 | Sap Ag | Cooperative scheduling using coroutines and threads |
US8051426B2 (en) * | 2007-01-04 | 2011-11-01 | Microsoft Corporation | Co-routines native to a virtual execution environment |
US9003377B2 (en) | 2010-01-07 | 2015-04-07 | Microsoft Technology Licensing, Llc | Efficient resumption of co-routines on a linear stack |
US10268843B2 (en) | 2011-12-06 | 2019-04-23 | AEMEA Inc. | Non-deterministic secure active element machine |
EP3502975A1 (en) * | 2017-12-20 | 2019-06-26 | Fujitsu Limited | Methods and apparatus for model parallelism in artificial neural networks |
CN109002322B (zh) * | 2018-06-26 | 2021-07-23 | 飞腾技术(长沙)有限公司 | 用于执行部件模块级验证的寄存器分配与释放方法及部件 |
CN112925632B (zh) * | 2021-05-08 | 2022-02-25 | 支付宝(杭州)信息技术有限公司 | 处理方法及装置、处理器、电子设备及存储介质 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0676691A3 (en) * | 1994-04-06 | 1996-12-11 | Hewlett Packard Co | Device for saving and restoring registers in a digital computer. |
US6826749B2 (en) * | 1998-12-08 | 2004-11-30 | Nazomi Communications, Inc. | Java hardware accelerator using thread manager |
US6668372B1 (en) * | 1999-10-13 | 2003-12-23 | Intel Corporation | Software profiling method and apparatus |
GB0002848D0 (en) * | 2000-02-08 | 2000-03-29 | Siroyan Limited | Communicating instruction results in processors and compiling methods for processors |
JP3641997B2 (ja) * | 2000-03-30 | 2005-04-27 | 日本電気株式会社 | プログラム変換装置及び方法並びに記録媒体 |
-
2004
- 2004-05-28 JP JP2004159232A patent/JP2005129001A/ja not_active Withdrawn
- 2004-09-24 US US10/948,525 patent/US20050081016A1/en not_active Abandoned
Also Published As
Publication number | Publication date |
---|---|
US20050081016A1 (en) | 2005-04-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6718541B2 (en) | Register economy heuristic for a cycle driven multiple issue instruction scheduler | |
US6059840A (en) | Automatic scheduling of instructions to reduce code size | |
KR100722710B1 (ko) | 폐영역 회수를 스케줄하는 방법 | |
US7725696B1 (en) | Method and apparatus for modulo scheduled loop execution in a processor architecture | |
JP4957729B2 (ja) | プログラム並列化方法、プログラム並列化装置及びプログラム | |
JP3311462B2 (ja) | コンパイル処理装置 | |
US7181730B2 (en) | Methods and apparatus for indirect VLIW memory allocation | |
WO2015057819A1 (en) | Computer processor with deferred operations | |
WO2003102758A1 (en) | Method and apparatus for real-time multithreading | |
US7089557B2 (en) | Data processing system and method for high-efficiency multitasking | |
US8359588B2 (en) | Reducing inter-task latency in a multiprocessor system | |
JP2005129001A (ja) | プログラム実行装置、マイクロプロセッサ及びプログラム実行方法 | |
US8510529B2 (en) | Method for generating program and method for operating system | |
Wolf et al. | Amidar project: lessons learned in 15 years of researching adaptive processors | |
US8612958B2 (en) | Program converting apparatus and program conversion method | |
JP2002366366A (ja) | コンパイル方法、コード生成方法、スタックレジスタ使用方法、コンパイラ、これらを実現するプログラム及び記憶媒体 | |
Matheou et al. | FREDDO: an efficient framework for runtime execution of data-driven objects | |
US20150089149A1 (en) | Arithmetic processing device and control method for arithmetic processing device | |
US6134708A (en) | Program compilation execution system | |
JP3311381B2 (ja) | コンパイラにおける命令スケジューリング処理方法 | |
JP3871312B2 (ja) | プログラム変換方法、これを用いたデータ処理装置及びプログラム | |
JP5360506B2 (ja) | マルチコアにおけるプログラミングシステム、その方法及びそのプログラム | |
Bernard et al. | On the compilation of a language for general concurrent target architectures | |
JP4755371B2 (ja) | 計算機システム | |
US20200409746A1 (en) | Information processing apparatus and recording medium |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20070518 |
|
A761 | Written withdrawal of application |
Free format text: JAPANESE INTERMEDIATE CODE: A761 Effective date: 20080214 |