JP5278336B2 - プログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラム - Google Patents

プログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラム Download PDF

Info

Publication number
JP5278336B2
JP5278336B2 JP2009553440A JP2009553440A JP5278336B2 JP 5278336 B2 JP5278336 B2 JP 5278336B2 JP 2009553440 A JP2009553440 A JP 2009553440A JP 2009553440 A JP2009553440 A JP 2009553440A JP 5278336 B2 JP5278336 B2 JP 5278336B2
Authority
JP
Japan
Prior art keywords
instruction
time
thread
schedule
program
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.)
Active
Application number
JP2009553440A
Other languages
English (en)
Other versions
JPWO2009101976A1 (ja
Inventor
将通 高木
淳嗣 酒井
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NEC Corp
Original Assignee
NEC Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by NEC Corp filed Critical NEC Corp
Priority to JP2009553440A priority Critical patent/JP5278336B2/ja
Publication of JPWO2009101976A1 publication Critical patent/JPWO2009101976A1/ja
Application granted granted Critical
Publication of JP5278336B2 publication Critical patent/JP5278336B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/456Parallelism detection

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は、逐次処理プログラムからマルチスレッド型並列プロセッサ向けの並列化プログラムを生成するプログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラムに関する。
単一の逐次処理プログラムを並列プロセッサシステムで並列に処理する手法として、プログラムをスレッドと呼ぶ命令流に分割して複数のプロセッサで並列に実行するマルチスレッド実行方法がある(例えば、特許文献1〜5、非特許文献1〜2参照)。マルチスレッド実行を行う並列プロセッサを、「マルチスレッド型並列プロセッサ」と呼ぶ。以下、これらの関連技術のマルチスレッド実行方法及びマルチスレッド型並列プロセッサについて説明する。
一般にマルチスレッド実行方法及びマルチスレッド型並列プロセッサにおいて、他のプロセッサ上に新たなスレッドを生成することを、「スレッドをフォーク(fork)する」と言う。この場合、フォーク動作を行った側のスレッドを「親スレッド」、生成された新しいスレッドを「子スレッド」と呼ぶ。そして、スレッドをフォークするプログラム位置を「フォーク元アドレス」または「フォーク元ポイント」、子スレッドの先頭のプログラム位置を「フォーク先アドレス」または「フォーク先ポイント」または「子スレッドの開始点」と呼ぶ。
特許文献1〜4および非特許文献1〜2では、スレッドのフォークを指示するためにフォーク元ポイントにフォーク命令が挿入される。フォーク命令にはフォーク先アドレスが指定され、フォーク命令の実行によりそのフォーク先アドレスから始まる子スレッドが他プロセッサ上に生成され、子スレッドの実行が開始される。また、スレッドの処理を終了させるプログラム位置を「ターム(term)点」と呼び、各プロセッサはそのターム点でスレッドの処理を終了する。
図30に、マルチスレッド型並列プロセッサにおけるマルチスレッド実行方法の処理の概要を示す。
図30(a)は、3つのスレッドA、B、Cに分割された単一の逐次処理プログラムを示す。このプログラムを単一のプロセッサで処理する場合、図30(b)に示すように1つのプロセッサPEがスレッドA、B、Cを順番に処理していく。
これに対して、特許文献1〜4および非特許文献1〜2のマルチスレッド型並列プロセッサにおけるマルチスレッド実行方法では、図30(c)に示すように、1つのプロセッサPE1にスレッドAを実行させ、プロセッサPE1でスレッドAを実行している最中に、スレッドAに埋め込まれたフォーク命令によってスレッドBを他のプロセッサPE2に生成し、プロセッサPE2においてスレッドBを実行させる。次に、プロセッサPE2は、スレッドBに埋め込まれたフォーク命令によってスレッドCをさらに他のプロセッサPE3に生成する。次に、プロセッサPE1、PE2は、それぞれスレッドB、Cの開始点の直前のターム点においてスレッドの処理を終了する。その後、プロセッサPE3は、スレッドCの最後の命令を実行すると、その次の命令(一般にはシステムコール命令)を実行する。このように、複数のプロセッサでスレッドを同時に並行して実行することにより、逐次処理に比べて性能の向上が図られる。
例えば、プロセッサを3つ備える場合、プロセッサ1でスレッド1を実行し、プロセッサ2でスレッド2を実行し、プロセッサ3でスレッド3を実行し、プロセッサ1でスレッド4を実行し、プロセッサ2でスレッド5を実行し、プロセッサ3でスレッド6を実行する。このようにして、プロセッサは繰り返し利用される。
この例を図31に示す。図31において、丸印は命令を表す。F1〜F5はフォーク命令である。プロセッサは3個備えるとする。1番目のスレッドである命令F1、I1〜I3はプロセッサ1で実行される。フォーク命令F1の指示を受けて、2番目のスレッドである命令F2、I4〜I6はプロセッサ2で実行される。フォーク命令F2の指示を受けて、3番目のスレッドである命令F3、I7〜I9はプロセッサ3で実行される。ここで、フォーク命令F3の指示を受けて、4番目のスレッドである命令F4、I10〜I12はプロセッサ1で実行される。さらに、フォーク命令F4の指示を受けて、5番目のスレッドである命令F5、I13〜I15はプロセッサ2で実行される。このため、プログラムから見ると、プロセッサは無限個あるように見える。また、この無限個あるように見えるプロセッサのN番目のものは、N番目のスレッドにより利用される。このため、以降の説明では、この無限個あるように見えるプロセッサの番号を表現する際に、スレッド番号を代わりに用いる。
他のマルチスレッド実行方法として、図30(d)に示すように、スレッドAを実行しているプロセッサPE1からフォークを複数回行うことにより、プロセッサPE2にスレッドBを、またプロセッサPE3にスレッドCをそれぞれ生成するマルチスレッド実行方法も存在する。この図30(d)のモデルに対して、図30(c)に示したように、スレッドはその生存中に高々1回に限って有効な子スレッドを生成することができるという制約を課したマルチスレッド実行方法を「フォーク1回モデル」と呼ぶ。フォーク1回モデルでは、スレッド管理の大幅な簡略化が可能となり、現実的なハードウェア規模でスレッド管理部のハードウェア化が実現できる。また、個々のプロセッサは子スレッドを生成する他プロセッサが1プロセッサに限定されるため、隣接するプロセッサを単方向にリング状に接続した並列プロセッサシステムでマルチスレッド実行が可能となる。
ここで、フォーク命令時、子スレッドを生成できる空きのプロセッサが存在しない場合の対処方法としては、親スレッドを実行しているプロセッサにおいて、子スレッドを生成できる空きのプロセッサが生じるまで、フォーク命令の実行をウエイトする典型的な方法がある。これ以外には、特許文献4に示されるように、フォーク命令を無効化してフォーク命令以降の後続命令を引き続き実行した後、子スレッドの命令群を自ら実行する方法がある。
親スレッドが子スレッドを生成し、子スレッドに所定の処理を行わせるには、親スレッドのフォーク点におけるレジスタファイル中のレジスタのうち少なくとも子スレッドで必要なレジスタの値を親スレッドから子スレッドに引き渡す必要がある。
このスレッド間のデータ引き渡しコストを削減するために、特許文献2及び非特許文献1では、スレッド生成時のレジスタ値継承機構をハードウェア的に備えている。これは、スレッド生成時に親スレッドのレジスタファイルの内容を子スレッドに全てコピーするものである。子スレッド生成後は、親スレッドと子スレッドのレジスタ値の変更は独立となり、レジスタを用いたスレッド間のデータの引き渡しは行われない。
非特許文献2では、スレッド生成時のレジスタ値継承機構をハードウェア的に備えている。これは、子スレッド生成時と子スレッド生成後に、必要なレジスタ値をスレッド間で転送する。見方を変えると、この方法では、ある命令から別の命令へレジスタ値を転送することができるが、その転送は、スレッド番号が変化しないか、増加する方向にのみ行われる。
スレッド間のデータ引き渡しに関する他の関連技術としては、レジスタの値を命令によりレジスタ単位で個別に転送する機構を備えた並列プロセッサシステムも提案されている。
マルチスレッド実行方法では、実行の確定した先行スレッドを並列に実行することを基本とするが、実際のプログラムでは実行の確定するスレッドが充分に得られない場合も多い。また、動的に決定される依存やコンパイラ解析能力の限界等により並列化率が低く抑えられ、所望の性能が得られない可能性が生じる。
このため、特許文献1では、制御投機を導入し、ハードウェア的にスレッドの投機実行をサポートしている。制御投機では、実行する可能性の高いスレッドを実行確定前に投機的に実行する。投機状態のスレッドは、実行の取り消しがハードウェア上可能である範囲内で仮実行を行う。子スレッドが仮実行を行っている状態を「仮実行状態」と言い、子スレッドが仮実行状態にあるとき、親スレッドは「スレッド仮生成状態」にあると言う。仮実行状態の子スレッドでは共有メモリ及びキャッシュメモリへの書き込みは抑制され、別途設けた仮実行用バッファ(temporary buffer)に対して書き込みが行われる。
投機が正しいことが確定すると、親スレッドから子スレッドに対して投機成功通知が出され、子スレッドは仮実行用バッファの内容を共有メモリ及びキャッシュメモリに反映し、仮実行用バッファを用いない通常の状態となる。また、親スレッドは、スレッド仮生成状態からスレッド生成状態となる。他方、投機が失敗したことが確定すると、親スレッドでスレッド破棄命令(abort)が実行され、子スレッド以下の実行がキャンセルされる。また、親スレッドは、スレッド仮生成状態からスレッド未生成状態となり、再び子スレッドの生成が可能になる。つまり、フォーク1回モデルでは、スレッド生成は高々1回に限定されるが、投機的にフォークを行い、投機が失敗した場合には再びフォークが可能となる。この場合においても、有効な子スレッドは高々1つである。
スレッドは、その生存中に高々1回に限って有効な子スレッドを生成するというフォーク1回モデルのマルチスレッド実行を実現する。このために、例えば非特許文献1等では、逐次処理プログラムから並列化プログラムを生成するコンパイルの段階で、全てのスレッドが有効なフォークを1回しか実行しない命令コードになるように制限している。即ち、フォーク1回制限を並列化プログラム上において静的に保証している。一方、特許文献3では、親スレッド中に存在する複数のフォーク命令のうちから有効な子スレッドを生成する1つのフォーク命令を親スレッドの実行中に選択する。こうすることにより、フォーク1回制限をプログラム実行時に保証している。
次に、マルチスレッド実行を行う並列プロセッサ向けの並列プログラムを生成する関連技術について説明する。
図32を参照すると、関連技術のプログラム並列化装置(例えば、特許文献6)は、ソースファイル501を入力し、構文解析部500でソースファイル501の構造を解析する。そして、この装置は、実行時間取得関数挿入部504で、ループのイタレーションの実行時間を計測する関数を挿入する。また、この装置は、並列化部506でループのイタレーションの並列化を行う。さらに、この装置は、コード生成部507でループのイタレーションの実行時間を計測する関数を挿入された実行時間取得用オブジェクトコード510を出力する。そして、このオブジェクトコード509が実行されることにより、実行時間情報ファイル508が生成される。この装置では、再び構文解析部500による解析を経た後、実行時間入力部505でループのイタレーションの実行時間を入力し、コード生成部507で並列実行を行うオブジェクトコード509を生成し出力する。こうすることによって、この装置によれば、ループの各イタレーションの実行時間を計測しておき、ループのイタレーションを複数のプロセッサに分配して並列化する際に、各プロセッサの負荷を均等になるようにイタレーションを割り当てる。こうすることで、この装置では、並列実行時間を短くすることができる。
また、図33を参照すると、他の関連技術のプログラム並列化装置(例えば、特許文献7)はソースプログラム602を入力し、プログラムの並列処理単位であるセクションをセクション整列手段631で実行時間の長い順に並べ替えを行う。この装置は、並べ替えを行った順番を優先順として、セクションをスレッドで実行する処理を行うオブジェクトコードを、スレッド対応付手段641で生成する。そして、この装置は、スレッドがひとつのセクションの実行を開始したら、そのセクションが実行を開始している旨の表示処理を行うオブジェクトコードを、割当済表示手段642で生成する。さらに、この装置は、スレッドがあるセクションの実行を完了したら、まだ実行が開始されていないセクションを実行させる処理を行うオブジェクトコードを、次セクション実行手段643で生成する。このようにして、この装置によれば、並列実行可能な処理をプールしておき、プロセッサが順次それを取り出して処理することにより、各プロセッサの負荷を均等にする。こうすることで、この装置でも、並列実行時間を短くすることができる。
特開平10−27108号公報 特開平10−78880号公報 特開2003−029985号公報 特開2003−029984号公報 特開2001−282549号公報 特開2004−152204号公報 特開2004−094581号公報 鳥居淳、外5名、「On Chip Multiprocessor指向 制御並列アーキテクチャMUSCATの提案」、並列処理シンポジュウムJSPP97論文集、情報処理学会、pp.229−236、May 1997 Taku Ohsawa, Masamichi Takagi, ShojiKawahara, Satoshi Matsushita: Pinot: Speculative Multi-threading Processor ArchitectureExploiting Parallelism Over a Wide Range of Granularities. In Proceedings of 38thMICRO, pages 81―92, 2005. Thomas L. Adam, K. M. Chandy, J. R. Dickson, "A comparison of list schedules for parallel processing systems", Communications of the ACM, Volume 17, Issue 12, pp.685-690, December 1974. H. Kasahara, S. Narita, "Practical Multiprocessor Scheduling Algorithms for Efficient Parallel Processing", IEEE Trans. on Computers, Vol. C-33, No. 11, pp.1023-1029, Nov. 1984. Yu-Kwong Kwok and Ishfaq Ahmad, "Static Scheduling Algorithms for Allocating Directed Task Graphs to Multiprocessors", ACM Computing Surveys, Vol. 31, No. 4, December 1999.
しかし、前述した関連技術では、並列実行時間のより短い並列化プログラムを得られない場合があるといった問題点があった。この問題点を以下に説明する。
前述した関連技術のプログラム並列化装置(例えば、非特許文献3〜5)は、データ依存とコントロール依存と命令順序の依存を示したグラフに基づいて、命令を、〈スレッド番号、サイクル番号〉で示される2次元空間のスロットに割り当てていく。このとき、各命令に優先度を付与し、優先度の高い順に、実行時刻の最も若く、空いている〈スレッド番号,実行時刻〉のスロットに命令を割り当てる、ということを各命令について繰り返す。この際、あるスレッドが担当する命令数に偏りができ、プロセッサにおいて命令を実行しないサイクルが生じ、並列実行時間が長くなってしまうことがあった。その一例を図6に示す。
この例では、図6(a)に示すように、スレッド1に多くの命令を割り当てたため、プロセッサ2において命令が実行されないサイクルが生じる。これにより、図6(b)に示すように、命令数を均等にして割り当てた場合に比べて並列実行時間が長くなってしまっている。
また、前述した他の関連技術のプログラム並列化装置(例えば、特許文献6〜7)では、スレッドが担当する命令数に偏りがなくても、実行開始時刻の間隔が整っていないため、プロセッサで命令が実行されないサイクルが生じる。このために、実行時間が長くなることがあった。その一例を図7に示す。
この例では、図7(a)に示すように、プロセッサ2に割り当てられた命令列の開始時刻が遅れているため、プロセッサ1において命令が実行されないサイクルが生じる。これにより、図7(b)に示すように、命令の実行開始時刻の間隔を整えて割り当てた場合に比べて、並列実行時間が長くなってしまっている。
以上のように、関連技術のプログラム並列化装置は、あるプロセッサが担当する命令数に偏りができる、あるいは、命令の実行開始時刻の間隔が整っていないため、並列実行時間が長くなってしまうことがあった。
本発明は、このような事情に鑑みて提案されたものであり、その目的は、スレッドごとの命令数が偏らないように、かつ、スレッドごとの命令の実行開始時刻の間隔が整うように命令をスケジュールすることによって、並列実行時間のより短い並列化プログラムを生成することのできるプログラム並列化装置及びその方法を提供することにある。
上記目的を達成するため、本発明に係るプログラム並列化装置は、逐次処理中間プログラムを入力し、並列化中間プログラムを出力するプログラム並列化装置において、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析部と、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド終了時刻制限解析部と、すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析部と、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部と、次にスケジュールする命令を選択するスケジュール候補命令選択部と、命令に対し実行するプロセッサと時刻を割り当てる命令配置部と、を有することを特徴とする。
本発明に係るプログラム並列化方法は、逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化方法において、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶステップと、ある命令について、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、ある命令について、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析するステップと、命令間の依存による遅延を解析するステップと、次にスケジュールする命令を選択するステップと、命令に対し実行するプロセッサと時刻を割り当てるステップと、を含むことを特徴とする。
本発明に係るプログラム並列化プログラムは、逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化装置を構成するコンピュータを、各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択手段と、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析手段と、各スレッドの実行命令数の制限に基づいて、ある命令について、その命令が属する依存命令列のうち最も遅い時刻に実行される命令と、その命令の実行時刻を推定するスレッド終了時刻制限解析手段と、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析手段と、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析手段と、次にスケジュールする命令を選択するスケジュール候補命令選択手段と、命令に対し実行するプロセッサと時刻を割り当てる命令配置手段と、として機能させることを特徴とする。
本発明によれば、各スレッドにおける命令を実行しない空き時間が減るように、かつ、スレッドごとの命令数が偏らないように、かつ、スレッドごとの命令の実行開始時刻の間隔が整うように命令をスケジュールすることによって、並列実行時間のより短い並列化プログラムを生成することができる。
本発明の第1の実施例に係るプログラム並列化装置のブロック図である。 第1の実施例に係るプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理例を示すフローチャートである。 図2に続き、第1の実施例に係るプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理例を示すフローチャートである。 第1の実施例に係るプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理例を示すフローチャートである。 図4に続き、第1の実施例に係るプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理例を示すフローチャートである。 (a)及び(b)は、関連技術の課題を示した図である。 (a)及び(b)は、他の関連技術の課題を示した図である。 (a)及び(b)は、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるようなスレッドの命令の実行開始・終了時刻の制限の例を示す図である。 (a)及び(b)は、最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測する様子を示した図である。 ある命令を先頭とする最長依存命令列について説明するための、命令の依存グラフの例を示す図である。 すべてのスレッドで開始時刻がスレッド番号とともに一定の増分3で増えるような命令実行開始時刻の制限の例を示す図である。 (a)及び(b)は、各スレッドの命令の開始・終了時刻の制限を考慮して、命令を配置できるスレッド番号と時刻を選択する様子を示す図である。 (a)及び(b)は、各スレッドの命令の開始・終了時刻の制限を考慮して、命令列の実行時間を予測する様子を示す図である。 (a)及び(b)は、第1の実施例に係るプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理の具体例を説明する際に用いるプログラムの、依存グラフを示す図である。 第1の実施例において、各スレッドの命令の実行開始・終了時間の制限と、フォーク命令の具体例を示す図である。 第1の実施例において、命令列の仮の割当ての具体例を示す図である。 第1の実施例において、命令列の仮の割当ての具体例を示す図である。 第1の実施例において、命令列の仮の割当ての具体例を示す図である。 第1の実施例において、命令スケジュールの途中結果の具体例を示す図である。 第1の実施例において、命令スケジュールの途中状態の具体例を示す図である。 第1の実施例において、命令列の仮の割当ての具体例を示す図である。 第1の実施例において、命令列の仮の割当ての具体例を示す図である。 第1の実施例において、命令スケジュールの結果の具体例を示す図である。 第1の実施例において、命令列の仮の割当ての具体例を示す図である。 第1の実施例において、命令列の仮の割当ての具体例を示す図である。 第1の実施例において、命令列の仮の割当ての具体例を示す図である。 本発明の第2の実施例に係るのプログラム並列化装置のブロック図である。 第2の実施例に係るのプログラム並列化装置におけるスレッド開始・終了時刻制限スケジュール部の処理例を示すフローチャートである。 本発明の第3の実施例に係るプログラム並列化装置のブロック図である。 (a)〜(d)は、マルチスレッド実行方法の概要を説明する図である。 マルチスレッド実行方法において、スレッドによるプロセッサの使用の順番を説明する図である。 関連技術のプログラム並列化装置の構成例を示すブロック図である。 他の関連技術のプログラム並列化装置の構成例を示すブロック図である。
符号の説明
100、100A、100B プログラム並列化装置
101 逐次処理プログラム
101M 記憶部
102 記憶装置
103 並列化プログラム
103M 記憶部
104 記憶装置
107、107A、107B 処理装置
108、108A スレッド開始・終了時刻制限スケジュール部
110 制御フロー解析部
140 スケジュール領域形成部
150 レジスタデータフロー解析部
170 命令間メモリデータフロー解析部
180 命令の実行開始・終了時刻制限選択部
190 スケジュール候補命令選択部
200 命令配置部
210 フォーク命令挿入部
220 スレッド開始時刻制限解析部
230 スレッド終了時刻制限解析部
240 占有状況解析部
250 依存遅延解析部
260 最良スケジュール決定部
270 並列実行時間測定部
280 レジスタ割り当て部
290 プログラム出力部
301 記憶装置
302 記憶装置
303 記憶装置
304 記憶装置
305 記憶装置
306 記憶装置
310 プロファイルデータ
310M 記憶部
320 逐次処理中間プログラム
320M 記憶部
330 命令間の依存情報
330M 記憶部
340 命令の実行開始・終了時刻の制限
340M 記憶部
350 並列化中間プログラム
350M 記憶部
360 命令の実行開始・終了時刻の制限集合
360M 記憶部
次に、本発明に係るプログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラムの実施の形態について、図面を参照して詳細に説明する。
本発明の実施の形態では、各スレッドについて、命令実行開始・終了時刻に制限を加えた上で、「スケジュール」を行う。「スケジュール(命令スケジュール)」とは、各命令の実行スレッド番号と実行時刻とを決定することである。さらに、並列実行時間を短くできるスケジュールを行う。さらに、スレッドごとの命令の実行開始・終了時刻の制限を満たすような、プロセッサを割当て可能なスレッド番号と時刻を解析する。さらに、「最長依存命令列」に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測する。「最長依存命令列」とは、命令の依存グラフ(後述参照)上での依存に沿った命令列のうち、その実行終了時刻が最も遅い命令列である。さらに、スレッドごとの命令の実行開始・終了時刻の制限を考慮した上で、最長依存命令列の実行時刻を予測する。
以下、本発明の各実施の形態について説明する。
[第1の実施の形態]
第1の実施の形態に係るプログラム並列化装置は、逐次処理中間プログラムを入力し、並列化中間プログラムを出力する。このプログラム並列化装置は、命令実行開始・終了時刻制限選択部、スレッド開始時刻制限解析部、スレッド終了時刻制限解析部、占有状況解析部、依存遅延解析部、スケジュール候補命令選択部、及び命令配置部を有する。
命令実行開始・終了時刻制限選択部は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。
スレッド開始時刻制限解析部は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
スレッド終了時刻制限解析部は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
占有状況解析部は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。
依存遅延解析部は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。
スケジュール候補命令選択部は、次にスケジュールする命令を選択する。
命令配置部は、命令に対し実行するプロセッサと時刻を割り当てる。
[第2の実施の形態]
第2の実施の形態に係るプログラム並列化装置は、逐次処理中間プログラムを入力し、並列化中間プログラムを出力する。このプログラム並列化装置は、命令実行開始・終了時刻制限選択部、スレッド開始時刻制限解析部、スレッド終了時刻制限解析部、占有状況解析部、依存遅延解析部、スケジュール候補命令選択部、並列実行時間測定部、及び最良スケジュール決定部を有する。
命令実行開始・終了時刻制限選択部は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。
スレッド開始時刻制限解析部は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
スレッド終了時刻制限解析部は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
占有状況解析部は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。
依存遅延解析部は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。
スケジュール候補命令選択部は、次にスケジュールする命令を選択する。命令配置部は、命令に対し実行するプロセッサと時刻を割り当てる。
並列実行時間測定部は、スケジュール結果に対し、並列実行時間を測定あるいは推定する。
最良スケジュール決定部は、制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。
[第3の実施の形態]
第3の実施の形態に係るプログラム並列化装置は、逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力する。このプログラム並列化装置は、制御フロー解析部、スケジュール領域形成部、レジスタデータフロー解析部、命令間メモリデータフロー解析部、命令実行開始・終了時刻制限選択部、スレッド開始時刻制限解析部、スレッド終了時刻制限解析部、占有状況解析部、依存遅延解析部、命令配置部、並列実行時間測定部、最良スケジュール決定部、レジスタ割り当て部、及びプログラム出力部を有する。
制御フロー解析部は、入力した逐次処理プログラムの制御フローを解析する。
スケジュール領域形成部は、制御フロー解析部による制御フローの解析結果を参照して、スケジュール対象となる領域を決定する。
レジスタデータフロー解析部は、スケジュール領域形成部によるスケジュール領域の決定を参照して、レジスタのデータフローを解析する。
命令間メモリデータフロー解析部は、あるアドレスに読み書きを行う命令と、アドレスから読み書きを行う命令の間の依存を解析する。
命令実行開始・終了時刻制限選択部は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。
スレッド開始時刻制限解析部は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
スレッド終了時刻制限解析部は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
占有状況解析部は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。
依存遅延解析部は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。
命令配置部は、次にスケジュールする命令を選択するスケジュール候補命令選択部と、命令に対し実行するプロセッサと時刻とを割り当てる。
並列実行時間測定部は、スケジュール結果に対し、並列実行時間を測定あるいは推定する。
最良スケジュール決定部は、制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。
レジスタ割り当て部は、最良のスケジュール決定結果を参照して、レジスタ割り当てを行う。
プログラム出力部は、レジスタ割り当て結果を参照して、並列化プログラムを生成し出力する。
[第4の実施の形態]
第4の実施の形態は、スケジュール候補命令選択部が、スケジュール候補の命令を先頭とする依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析する。
[第5の実施の形態]
第5の実施の形態は、命令実行開始・終了時刻制限選択部が、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とする。
[第6の実施の形態]
第6の実施の形態は、逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力する。このプログラム並列化方法は、次の各ステップを有する。
A1)各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。
A2)ある命令について、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
A3)ある命令について、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
A4)プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。
A5)次にスケジュールする命令を選択するステップと、命令に対し実行するプロセッサと時刻を割り当てる。
[第7の実施の形態]
第7の実施の形態に係るプログラム並列化方法は、逐次処理中間プログラムを入力し、並列化中間プログラムを出力する。このプログラム並列化方法は、次の各ステップを有する。
B1)各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。
B2)各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
B3)各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
B4)プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。
B5)次にスケジュールする命令を選択するステップと、命令に対し実行するプロセッサと時刻を割り当てる。
B6)スケジュール結果に対し、並列実行時間を測定あるいは推定するステップと、制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。
[第8の実施の形態]
第8の実施の形態に係るプログラム並列化方法は、逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力する。このプログラム並列化方法は、次の各ステップを有する。
C1)入力した逐次処理プログラムの制御フローを解析する。
C2)制御フローの解析結果を参照して、スケジュール対象となる領域を決定する。
C3)スケジュール領域の決定を参照して、レジスタのデータフローを解析する。
C4)あるアドレスに読み書きを行う命令と、アドレスから読み書きを行う命令の間の依存を解析する。
C5)各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。
C6)各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
C7)各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
C8)プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。
C9)次にスケジュールする命令を選択するステップと、命令に対し実行するプロセッサと時刻を割り当てる。
C10)スケジュール結果に対し、並列実行時間を測定あるいは推定する。
C11)制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。
C12)最良のスケジュール決定結果を参照して、レジスタ割り当てを行う。
C13)レジスタ割り当て結果を参照して、並列化プログラムを生成し出力する。
[第9の実施の形態]
第9の実施の形態に係るプログラム並列化方法は、次の各ステップを含む。
a)命令実行開始・終了時刻制限選択部が、各スレッドの命令の実行開始・終了時刻の制限の集合から、未選択のものを選び、SHとする。
b)スレッド開始時刻制限解析部と占有状況解析部とスレッド終了時刻制限解析部とスケジュール候補命令選択部と命令配置部が制限SHに従って命令スケジュールを行い、スケジュール結果をSCとする。
c)並列実行時間測定部が、スケジュール結果SCの並列実行時間を計測あるいは推定する。
d)最良スケジュール決定部が、記憶していた最短並列実行時間より短ければスケジュール結果SCを最短スケジュールとして記憶する。
e)最良スケジュール決定部が、全ての制限を選択したか判定する。
f)最良スケジュール決定部が、最短スケジュールを最終的なスケジュールとして出力する。
[第10の実施の形態]
第10の実施の形態では、ステップb)は、次の各ステップを含む。
b−1)命令配置部が、各命令IについてのHT(I)を計算し、また、その値を与える命令を記憶する。
b−2)命令配置部が、依存している命令がない命令を集合RSに登録する。
b−3)命令配置部が、集合RSの全命令を未選択とする。
b−4)スケジュール候補命令選択部が、集合RSに属する命令のうち、未選択のものを命令RIとする。
b−5)スケジュール候補命令選択部が、命令RIが依存している命令のうち、すでにスケジュールされたもののうち、最もスレッド番号が大きいもののスレッド番号をLFとし、スレッド番号LFより大きくかつ現在命令が割り当てられていない最も番号の小さいスレッド番号をRMとし、スレッド番号TNをLFに設定する。
b−6)スレッド開始時刻制限解析部が、番号TNのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻の最低値を解析し、その時刻をER1とする。
b−7)占有状況解析部が、番号TNのスレッドについて、すでにスケジュールされた命令が占められていない時刻を解析し、その時刻の集合をER2とする。
b−8)依存遅延解析部が、命令RIが依存している命令のうち、すでにスケジュールされたもののうち、番号TNのスレッドにデータを届けるのが最も遅いものについて、その到着時刻をER3とする。
b−9)スレッド終了時刻制限解析部が、番号TNのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をER4とする。
b−10)スケジュール候補命令選択部が、集合ER2の要素のうち、 時刻ER1以上かつ時刻ER4以下かつ時刻ER3以上のもののうち、最小のものは存在するか判定する。
b−11)スケジュール候補命令選択部が、スレッド番号TNを1進める。
b−12)スケジュール候補命令選択部が、存在する場合はその時刻をER5とする。
b−13)スケジュール候補命令選択部が、スレッド番号TN、時刻ER5に命令RIを仮に割り当てたと仮定して、各スレッドの実行開始・終了時刻の制限に基づいて、命令RIを先頭とする最長依存命令列の末尾の命令TIの実行時刻を推定する。
b−14)スケジュール候補命令選択部が、スレッド番号TNに渡る、命令TIの実行が最も早い時刻となる命令RIのスレッド番号と時刻と、推定された命令TIの予測時刻を命令RIに記憶する。
b−15)スケジュール候補命令選択部が、スレッド番号TNがRMに達したか判定する。
b−16)スケジュール候補命令選択部が、スレッド番号TNを1進める。
b−17)スケジュール候補命令選択部が、集合RSの全ての命令を選択したか判定する。
b−18)命令配置部が、ステップb−14で記憶した命令TIの予測時刻が最も大きい命令をスケジュール対象CDとし、ステップb−14で記憶したスレッド番号と、ステップb−14で記憶した時刻に割り当てる。
b−19)命令CDを集合RSから除去し、命令CDに依存している命令について調べ、その命令について、命令CDに対する依存は解決したとし、依存している命令がなくなった場合はその命令を集合RSに登録する。
b−20)命令配置部が、全ての命令をスケジュールしたか判定する。
b−21)命令配置部が、スケジュール結果を出力する。
[第11の実施の形態]
第11の実施の形態では、ステップb−9)は、次の各ステップを含む。
b−9−1)スケジュール候補命令選択部が、命令RIを先頭とする、依存グラフにおける命令列について、最長のものTSとし、TSを、TL[0]をRIとして、TL[0]、TL[1]、TL[2]、…と表す。
b−9−2)スケジュール候補命令選択部が、変数V2を1とする。
b−9−3)スケジュール候補命令選択部が、命令TL[V2]が依存している命令のうち、すでにスケジュール、あるいは仮に割り当てられているもののうち、最もスレッド番号が大きいもののスレッド番号をLF2とし、スレッド番号LF2より大きくかつ、現在命令がスケジュールされていない最も番号の小さいスレッド番号をRM2とし、変数CUにLF2を代入する。
b−9−4)スレッド開始時刻制限解析部が、番号CUのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻の最低値を解析し、その時刻をER11とする。
b−9−5)占有状況解析部が、番号CUのスレッドについて、すでにスケジュール、あるいは仮割当てされた命令に占められていない時刻を解析し、その時刻の集合をER12とする。
b−9−6)依存遅延解析部が、命令TL[V2]が依存している命令のうち、すでにスケジュール、あるいは仮割当てされているものについて、TL[V2]へのデータの送信を調べ、それらの命令のデータの、番号CUのスレッドへの到着時刻を調べ、その最大値をER13とする。
b−9−7)スレッド終了時刻制限解析部が、番号CUのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をER14とする。
b−9−8)スケジュール候補命令選択部が、集合ER12の要素のうち、 時刻ER11以上かつ時刻ER14以下かつ時刻ER13以上のもののうち、最小のものは存在するか判定する。
b−9−9)スケジュール候補命令選択部が、スレッド番号CUを1進める。
b−9−10)スケジュール候補命令選択部が、存在する場合はその時刻をER15とする。
b−9−11)スケジュール候補命令選択部が、命令TL[V2]に対する、時刻ER15のスレッド番号CUに渡る最小値を記憶し、最小値が更新された場合、CUも記憶する。
b−9−12)スケジュール候補命令選択部が、CUがRM2に達したか判定する。
b−9−13)スケジュール候補命令選択部が、スレッド番号CUを1増やす。
b−9−14)スケジュール候補命令選択部が、ステップb−9−11で記憶したスレッド番号、時刻にTL[V2]を仮に割り当てる。
b−9−15)スケジュール候補命令選択部が、TSのすべての命令を仮に割り当てたか判定する。
b−9−16)スケジュール候補命令選択部が、変数V2を1増やす。
b−9−17)スケジュール候補命令選択部が、仮の割当てをすべて消去して、TL[V2]が仮に割り当てられたスレッド番号と時刻を出力する。
[第12の実施の形態]
第12の実施の形態は、次にスケジュールする命令を選択するステップにおいて、スケジュール候補の命令を先頭とする最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析する。
[第13の実施の形態]
第13の実施の形態は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶステップにおいて、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とする。
[第14の実施の形態]
第14の実施の形態に係るプログラム並列化プログラムは、逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化装置を構成するコンピュータを、命令実行開始・終了時刻制限選択手段、スレッド開始時刻制限解析手段、スレッド終了時刻制限解析手段、占有状況解析手段、スケジュール候補命令選択手段、及び命令配置手段として機能させる。
命令実行開始・終了時刻制限選択手段は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。
スレッド開始時刻制限解析手段は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
スレッド終了時刻制限解析手段は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
占有状況解析手段は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。
スケジュール候補命令選択手段は、次にスケジュールする命令を選択する。
命令配置手段は、命令に対し実行するプロセッサと時刻を割り当てる。
[第15の実施の形態]
第15の実施の形態に係るプログラム並列化プログラムは、逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化装置を構成するコンピュータを、命令実行開始・終了時刻制限選択手段、スレッド開始時刻制限解析手段、スレッド終了時刻制限解析手段、占有状況解析手段、依存遅延解析手段、スケジュール候補命令選択手段、命令配置手段、並列実行時間測定手段、及び最良スケジュール決定手段として機能させる。
命令実行開始・終了時刻制限選択手段は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。
スレッド開始時刻制限解析手段は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
スレッド終了時刻制限解析手段は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
占有状況解析手段は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。
依存遅延解析手段は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。
スケジュール候補命令選択手段は、次にスケジュールする命令を選択する。
命令配置手段は、命令に対し実行するプロセッサと時刻を割り当てる。
並列実行時間測定手段は、スケジュール結果に対し、並列実行時間を測定あるいは推定する。
最良スケジュール決定手段は、制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。
[第16の実施の形態]
第16の実施の形態に係るプログラム並列化プログラムは、逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置を構成するコンピュータを、制御フロー解析手段、スケジュール領域形成手段、命令間メモリデータフロー解析手段、命令実行開始・終了時刻制限選択手段、スレッド開始時刻制限解析手段、スレッド終了時刻制限解析手段、占有状況解析手段、依存遅延解析手段、スケジュール候補命令選択手段、命令配置手段、並列実行時間測定手段、最良スケジュール決定手段、レジスタ割り当て手段、及びプログラム出力手段として機能させる。
制御フロー解析手段は、入力した逐次処理プログラムの制御フローを解析する。
スケジュール領域形成手段は、制御フロー解析手段による制御フローの解析結果を参照して、スケジュール対象となる領域を決定する。
レジスタデータフロー解析手段は、スケジュール領域形成手段によるスケジュール領域の決定を参照して、レジスタのデータフローを解析する。
命令間メモリデータフロー解析手段は、あるアドレスに読み書きを行う命令と、アドレスから読み書きを行う命令の間の依存を解析する。
命令実行開始・終了時刻制限選択手段は、各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ。
スレッド開始時刻制限解析手段は、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
スレッド終了時刻制限解析手段は、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析する。
占有状況解析手段は、プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する。
依存遅延解析手段は、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する。
スケジュール候補命令選択手段は、次にスケジュールする命令を選択する。
命令配置手段は、命令に対し実行するプロセッサと時刻とを割り当てる。
並列実行時間測定手段は、スケジュール結果に対し、並列実行時間を測定あるいは推定する。
最良スケジュール決定手段は、制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する。
レジスタ割り当て手段は、最良スケジュール決定手段の結果を参照して、レジスタ割り当てを行う。
プログラム出力手段は、レジスタ割り当て手段の結果を参照して、並列化プログラムを生成し出力する。
[第17の実施の形態]
第17の実施の形態は、スケジュール候補命令選択手段が、スケジュール候補の命令を先頭とする最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析する。
[第18の実施の形態]
第18の実施の形態は、命令実行開始・終了時刻制限選択手段が、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とする。
上記各実施の形態によれば、並列実行時間のより短い並列化プログラムを生成することができる。その理由を以下に述べる。
第1の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。このことを前述した図6の例を用いて説明する。
図6(a)では、スレッド1に多くの命令を割り当てたため、プロセッサ2において命令が実行されないサイクルが生じている。本実施の形態によれば、図6(b)のように命令数を均等にして割り当てることができ、プロセッサ2における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。
第2の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドの実行開始時刻の間隔を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。このことを前述した図7の例を用いて説明する。
図7(a)では、スレッド2に割り当てられた命令列の開始時刻が遅れているため、プロセッサ1において命令が実行されないサイクルが生じている。本実施の形態によれば、図7(b)のように命令の実行開始時刻の間隔を整えて割り当てることができ、プロセッサ1における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。
各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃え、かつ、各スレッドの実行開始時刻の間隔を揃えるには、各スレッドの命令の開始・終了時刻に制限を加えた上でさらに、並列実行時間を短くできるスケジュールを行う必要がある。命令スケジュールにおいて並列実行時間を短くするためには、まだスケジュールされていない命令について、その命令を先頭とする最長依存命令列の末尾の命令の実行完了の時刻を予測し、その時刻が最も遅いような先頭の命令を先にスケジュールする必要がある。最長依存命令列とは、依存グラフ上での依存に沿った命令列で、その実行終了時刻が最も遅い命令列である。なぜなら、最も遅く実行が完了する命令列の、先頭の命令のスケジュールを後に回すと、ますますその命令列の実行完了時刻が大きくなる可能性があるからである。このため、この命令列の実行完了時刻の予測精度をあげる必要がある。このためには、先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握と、命令列の実行時刻の正確な予測が必要である。
本実施の形態によれば、各スレッドの命令の開始・終了時刻に制限を加えた上でさらに、これらを可能にする。結果として、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えて、かつ、各スレッドの実行開始時刻の間隔を揃えることができる。
ある命令を先頭とする依存グラフ上の命令列について、その先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握ができる理由は、各スレッドの命令の開始・終了時刻の制限を考慮して、命令を割当て可能なスレッド番号と時刻を選択できるためである。
図12を参照して具体例を説明する。図12(a)に示す命令の依存グラフを持つ命令列をスケジュールする。実行開始間隔が2、命令数が8になるような制限でスケジュールする。フォーク命令の遅延は、1サイクルとする。命令A7と命令A6をスケジュールした時点を考える。命令B6と命令C5を次にスケジュールする命令の候補とする。命令B6を先頭とする最長依存命令列は、B6〜B4、A3〜A1である。命令B6について最も早いスケジュール位置を調べる。スレッド番号1の時刻0〜2はすでにスケジュールされている命令で埋まっていることを把握する。さらに、スレッド番号2の時刻0〜1は開始時刻制限のために使用できないということを把握する。こうすることで、スケジュールできる最も早い位置はスレッド番号2、時刻2であると正確に把握できる。
また、ある命令を先頭とする最長依存命令列の末尾の命令について、正確な実行時刻の予測ができる理由は、次のとおりである。
第1の理由は、最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測できるためである。図9を参照して具体例を説明する。図9(a)に示す依存グラフを持つ命令列をスケジュールする。実行開始間隔が2、命令数が6になるような制限でスケジュールする。フォーク命令の遅延は、2サイクルとする。また、レジスタ値を隣接プロセッサに送信する際の遅延は、2サイクルとする。図のように、命令c2がスケジュールされており、スレッド番号1、時刻3〜4が空いているとする。ここで、命令d3をスケジュールすることを考える。命令d3をスレッド番号1、時刻3に割り当てると仮定して、命令d3を先頭とする最長依存命令列d3、d2、c1の末尾の命令c1の実行時刻を予測する。命令d2はスレッド番号1、時刻4に割り当てられると予測する。命令c1は命令c2に依存していて、命令c2はスレッド番号3、時刻7に割り当てられている。想定している並列プロセッサシステムでは、ある命令から別の命令へのデータの通信は、スレッド番号が変化しないか、増加する方向にしか行えない。このため、命令c1が割り当てられるスレッド番号は3以上となる。このことを考慮して、命令c1はスレッド番号3、時刻8に割り当てられると予測する。このように、命令d3、命令d2、命令c1のそれぞれについて割り当てられるスレッド番号と時刻を予想することにより、命令c1の実行される時刻をより正確に予測できる。
第2の理由は、各スレッドの命令の開始・終了時刻の制限を考慮して、命令列の実行時間を予測できるためである。図13を参照して具体例を説明する。図13(a)に示す依存グラフを持つ命令列をスケジュールする。実行開始間隔が2、命令数が8になるような制限でスケジュールする。フォーク命令の遅延は、2サイクルとする。また、レジスタ値を隣接プロセッサで通信する際の遅延は、2サイクルとする。スレッド番号1の時刻0〜6、スレッド番号2の時刻2〜6、スレッド番号3の時刻4〜6は、すでにスケジュールされている命令で埋まっているとする。ここで、命令A3をスケジュールすることを考える。ここで、命令A3をスレッド番号1、時刻7に割り当てると仮定して、A3を先頭とする依存グラフ上での命令列の末尾の命令A1の実行時刻を予測する。スレッド番号1、時刻8は実行開始・終了時刻の制限により利用できない、ということを把握し、A2はレジスタ値通信の遅延時間を考慮してスレッド番号2、時刻9に実行されると予測し、さらに、スレッド番号2、時刻10は実行開始・終了時刻の制限により利用できない、ということを把握し、A1はレジスタ値通信の遅延時間を考慮してスレッド番号3、時刻11に実行されると予測する。このように、A3をスレッド番号1、時刻7に割り当てる場合のA1の実行時刻を正確に予測できる。
以下、本発明の具体的な実施例について説明する。
図1を参照すると、本発明の第1の実施例にかかるプログラム並列化装置100は、記憶装置302の記憶部320Mから、図示しないプログラム解析装置によって生成された、逐次処理中間プログラム320を入力し、記憶装置303の記憶部330Mから、図示しない依存解析装置によって生成された、命令間の依存情報330を入力し、記憶装置304の記憶部340Mから、命令の実行開始・終了時刻の制限340を入力し、各命令の実行時刻と実行プロセッサを決定した並列化中間プログラム350を生成し、記憶装置305の記憶部350Mに記録する装置である。
図1に示すプログラム並列化装置100は、入力となる逐次処理中間プログラム320を記憶する磁気ディスクなどの記憶装置302と、入力となる命令間の依存情報330を記憶する磁気ディスク等の記憶装置303と、入力となる命令の実行開始・終了時刻の制限340を記憶する磁気ディスク等の記憶装置304と、出力となる並列化中間プログラム350を記憶する磁気ディスクなどの記憶装置305と、これらの記憶装置302、303、304及び305に接続された中央処理装置等の処理装置107とを備える。また、処理装置107は、スレッド開始・終了時刻制限スケジュール部108を備える。
このようなプログラム並列化装置100は、パーソナルコンピュータやワークステーションなどのコンピュータとプログラムとで実現することができる。プログラムは、磁気ディスク等のコンピュータ可読記録媒体に記録され、コンピュータの立ち上げ時などにコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータ上にスレッド開始・終了時刻制限スケジュール部108といった機能手段を実現する。
スレッド開始・終了時刻制限スケジュール部108は、逐次処理中間プログラム320と、命令間の依存情報330と、命令の実行開始・終了時刻の制限340を入力し、スケジュールを決定する。スケジュールとは、すなわち、各命令の実行スレッド番号と実行時刻を決定することである。そして、決定されたスケジュールを実現するように命令の実行順序を決定し、フォーク命令を挿入する。そして、並列化の結果である並列化中間プログラム350を記録する。
スレッド開始・終了時刻制限スケジュール部108は、あるスレッドについて、命令実行開始時刻の制限に基づいて、命令を配置できるスレッド番号と時刻のスレッドを解析するスレッド開始時刻制限解析部220と、あるスレッドについて、命令実行終了時刻の制限に基づいて、命令を配置できるスレッド番号と時刻のスレッドを解析するスレッド終了時刻制限解析部230と、すでにスケジュールされた命令によって占有されているスレッド番号と時刻のスロットを解析する占有状況解析部240と、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部250と、スレッド開始時刻制限解析部220と、スレッド開始時刻制限解析部230と、占有状況解析部240と、依存遅延解析部250の情報を元に、次にスケジュールを行う命令を選択するスケジュール候補命令選択部190と、スケジュール候補命令選択部190の決定に基づいて、命令をスロットに割り当てる、すなわち、命令の実行時刻と実行スレッドを決定する命令配置部200と、スケジュール結果を実現するように命令の実行順序を決定し、フォーク命令を挿入するフォーク挿入部210と、を備える。
次に、本実施例にかかるプログラム並列化装置100の動作について説明する。特に、図2及び図3を参照して、スレッド開始・終了時刻制限スケジュール部108で処理される各スレッドの命令の実行開始・終了時刻に制限を加えた上でのスケジュール処理を説明する。
スレッド開始・終了時刻制限スケジュール部108は、記憶装置302の記憶部320Mから逐次処理中間プログラム320を入力する。逐次処理中間プログラム320はグラフの形で表現される。逐次処理中間プログラム320を構成する関数は、関数を表すノードとして表現され、関数を構成する命令は、命令を表すノードとして表現される。また、ループは再帰関数に変換して、再帰関数として表現してもよい。また、逐次処理中間プログラム320においては、命令の実行時刻と実行スレッド番号とを決定する命令スケジュールの対象となる、スケジュール領域が決定されている。スケジュール領域は、例えば、基本ブロックとしてもよいし、複数の基本ブロックとしてもよい。
次に、記憶装置303の記憶部330Mから命令間の依存情報330を入力する。依存情報330は、レジスタ、メモリの読み書きに伴うデータフローの解析、制御フローの解析により得られる、命令間の依存であり、命令を表すノードを結ぶ有向辺で表す。
次に、記憶装置304の記憶部340Mから命令の実行開始・終了時刻の制限340を入力する。この制限340は、例えば、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるようなものでもよい。
図8を参照して、具体例を説明する。図8において、マス目は、スレッド番号と、時刻のスロットを表し、色分けされたマス目は、そこに命令が配置されていることを表す。間隔を1サイクル、命令数を4とするような制限は、図8(a)のような命令の配置の制限である。また、間隔を2サイクル、命令数を8とするような制限は、図8(b)のような命令の配置の制限である。また、全てのスレッドに対して開始時刻がスレッド番号とともに一定の増分で増えるが、各スレッドの命令数に制限を加えないような制限を用いてもよい。また、各スレッドの命令数にだけ制限をおいて、各スレッドに対して開始時刻に制限を加えないような制限を用いてもよい。
次に、各命令について、その命令を先頭とする最長依存命令列を調べる。最長依存命令列とは、依存グラフ上での命令列で、その実行終了時刻が最も遅い命令列である。
図10を参照して具体例を説明する。図10において、丸印は命令を表し、矢印は命令間の依存を表す。ここで、命令A4について、命令A4を先頭とする依存グラフ上での命令列は、A4、A3、A2、A1と、A4、C2、A1と二つある。このうち、前者の方が命令数が多く実行時間が長いため、実行終了時刻が最も遅いと推定する。
ある命令を先頭とする最長依存命令列を調べるために、各命令Iについて、HT(I)と呼ぶ値を、以下のように計算する(ステップS201)。
すなわち、命令Iに依存している命令の集合をDSETとする。次にDSETの各要素DIについて、HT(DI)にIからDIへの通信時間を加えたものを比べ、最大のものMAXDSETを求める。最後にHT(I)をMAXDSETに命令Iの実行時間を加えたものとする。計算の順番は以下のとおりである。
すなわち、命令IAに依存している命令の集合が空集合であるような命令IAについて計算する。続いて、命令IBに依存している全命令についてすでに計算が済んでいるような命令IBについて計算していく。また、命令ICについて、MAXDSETを与えるような、命令ICに依存する命令IDを、命令ICに記憶しておく。ICからIDをたどることで、実行終了時刻が最も遅いと推定される命令列をたどることができる。
図10を参照して具体例を説明する。図10に示す命令の依存グラフにおいて、丸印は命令を表し、矢印は命令間の依存を表す。命令の遅延時間は1サイクル、データの通信時間は0サイクルとする。HT(I)の計算はA1から始まり、HT(A1)が1と計算される。次にHT(A2)が2と計算される。そして、HT(A3)が3と計算され、HT(C2)が2と計算される。さらに、HT(A4)は、HT(A3)にA3からA4への通信時間0を加えたものと、HT(C2)にA3からA4への通信時間0を加えたものを比較し、多いほうを選択し、4と計算される。
次に、依存している命令がない命令を命令の集合RSに登録する(ステップS202)。
次に、集合RSの全命令に対して処理を行うため、処理を行っていない命令を未選択とマークし、処理を行った命令と区別する。そのために、まず集合RSの全命令を未選択とマークする(ステップS203)。
次に、集合RSに属する命令のうち、未選択のものを命令RIとする(ステップS204)。
次に、命令RIが依存している命令のうち、すでにスケジュールされたもののうち、最もスレッド番号が大きいもののスレッド番号をLFとする。そのような命令がない場合にはLFは1とする。スレッド番号LFより大きくかつ現在命令がスケジュールされていない最も番号の小さいスレッド番号をRMとする。スレッド番号TNをLFに設定する(ステップS205)。スレッド番号TNは、命令RIを割り当てようとするスレッド番号である。スレッド番号LFは、その最小値である。スレッド番号RMは、その最大値である。想定している並列プロセッサシステムでは、ある命令から別の命令へのデータの通信は、スレッド番号が変化しないか、増加する方向にしか行えない。このため、ある命令は、依存している命令のうち、最もスレッド番号が大きいものと同じ番号を持つスレッドか、それ以上の番号を持つスレッドでしか実行できない。このため、LF以上のスレッド番号のみ考慮する。
次に、命令RIについて、番号TNのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析し、その時刻の集合をER1とする(ステップS206)。各スレッドの命令実行開始時刻の制限により、命令を割り当て可能な時刻が制限される。例えば、すべてのスレッドで開始時刻がスレッド番号とともに一定の増分2で増えるような命令実行開始時刻の制限を用いた場合、N番のスレッドについては、2×(N−1)未満の時刻は使用できない。
図11を参照して具体例を説明する。この例では、すべてのスレッドで開始時刻がスレッド番号とともに一定の増分3で増えるような命令実行開始時刻の制限を用いる。番号1のスレッドではサイクル0から命令を割り当てることができる。番号2のスレッドでは、サイクル0〜2に命令を割り当てることはできない。番号3のスレッドには、サイクル0〜5に命令を割り当てることはできない。番号4のスレッドには、サイクル0〜8に命令を割り当てることはできない。
次に、命令RIについて、番号TNのスレッドについて、すでにスケジュールされた命令に占められていない時刻を解析し、その時刻の集合をER2とする(ステップS207)。どのスレッド番号のどの時刻がすでにスケジュールされた命令に占められているかの解析には、例えば、スレッド番号と時刻の二次元の表に、すでにスケジュールされた命令が割り当てられた位置を記録しておき、これを参照するという方法を用いてもよい。
次に、命令RIが依存している命令で、かつすでにスケジュールされた命令の、データのRIへの送信を調べる。送信がない場合はER3を0とする。送信がある場合は、それらの命令のデータの、番号TNのスレッドへの到着時刻を調べる。到着時刻の最大値を求め、それをER3とする(ステップS208)。命令IAから命令IBにレジスタ値の依存がある場合、命令IAは命令IBにレジスタデータを送信する。また、送信するデータは、例えば、レジスタデータ、メモリデータを含んでもよい。
次に、命令RIについて、番号TNのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をER4とする(ステップS209)。
次に、集合ER2の要素のうち、 時刻ER1以上かつ時刻ER4以下かつ時刻ER3以上のもののうち、最小のものは存在するか判定する(ステップS210)。
最小のものが存在しない場合は、スレッド番号TNを1進め、制御をステップS206に戻す(ステップS211)。
最小のものが存在する場合は、その時刻をER5とする(ステップS212)。
次に、スレッド番号TN、時刻ER5に命令RIを割り当てたと仮定して、各スレッドの実行開始・終了時刻の制限に基づいて、命令RIを先頭とする最長依存命令列の末尾の命令TIについて、その実行時刻を推定する(ステップS213)。このステップについては後ほどさらに詳しく説明する。
次に、命令RIを配置するスレッド番号を変えた際に、命令RIを先頭とする最長依存命令列の末尾の命令TIの実行時刻の予測値が変化する可能性があるため、スレッド番号を変化させて命令TIの実行時刻を予測する。そのうち最小となるような、命令RIを割り当てるスレッド番号と時刻と、命令TIの予測時刻を命令RIに記憶する(ステップS214)。
命令RIを割り当てようとするスレッド番号TNは、LFからRMまで変化させる。そのため、スレッド番号TNがRMに達したか判定する(ステップS215)。
次に、スレッド番号TNがスレッド番号RMに達していない場合は、TNを1進め、制御をステップS206に戻す(ステップS216)。
次に、スレッド番号TNがスレッド番号RMに達している場合は、集合RSの全ての命令を選択したか判定し、全ての命令を選択していなければ、制御をステップS204に戻す(ステップS217)。
全ての命令を選択していれば、S214で記憶した命令TIの予測時刻が最も大きい命令をスケジュール対象CDとし、記憶したスレッド番号と、記憶した時刻にスケジュールする(ステップS218)。命令スケジュールにおいて、並列実行時間を短くするためには、まだスケジュールされていない命令について、その命令を先頭とする最長依存命令列の実行完了の予測時刻が最も遅いものを選び、その先頭の命令を先にスケジュールする必要がある。なぜなら、最も遅い命令列の、先頭の命令のスケジュールを後に回すと、ますますその命令列の実行完了時刻が大きくなる可能性があるからである。このため、命令TIの予測時刻が最も大きい命令を優先してスケジュールする。最も大きい命令が複数ある場合は、例えば、HT(I)の値が大きいものを優先しても良い。
次に、命令CDを集合RSから除去する。また、命令CDに依存している命令について調べ、その命令について、命令CDに対する依存が解決したとする。依存している命令がなくなった場合はその命令を集合RSに登録する(ステップS219)。
次に、全ての命令をスケジュールしたか判定し、全ての命令をスケジュールしていなければ、制御をステップS203に戻す(ステップS220)。
最後に、全ての命令をスケジュールしていたら、スケジュール結果を出力し(ステップS221)、処理を終了する。
次に、図4及び図5を参照して、スレッド開始・終了時刻制限スケジュール部108で処理される各スレッドの命令の実行開始・終了時刻に制限を加えた上でのスケジュール処理のうち、ステップS213に対応する処理について詳細に説明する。
まず、命令RIを先頭とする、依存グラフにおける命令列について、最長のものTSとし、TSを、TL[0]をRIとして、TL[0]、TL[1]、TL[2]、…と表す(ステップS401)。最長の命令列の決定は、例えば、以下のようにしてもよい。すなわち、HT(RI)の計算の際に、RIに依存していてHT(RI)の値を決定した命令RJを記憶していた。命令RIから命令RJに辿り、さらに命令RJに記憶された命令RKを辿り、ということを繰り返すことにより、最長の命令列を決める。
次に、変数V2を1とする(ステップS402)。変数V2は、命令列TSを辿るための変数である。
次に、TL[V2]が依存している命令のうち、すでにスケジュール、あるいは仮に割当てられているもののうち、最もスレッド番号が大きいもののスレッド番号をLF2とする。そのような命令がない場合にはLF2は1とする。スレッド番号LF2より大きくかつ、現在命令がスケジュールされていない最も番号の小さいスレッド番号をRM2とする。変数CUにLF2を代入する(ステップS403)。変数CUは、TL[V2]を仮に割当てようとするスレッド番号を表す。スケジュールされているもの、あるいは仮に割当てられているものについては、そのスレッド番号と時刻がわかっているので、依存による遅延を考慮する。
次に、番号CUのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻の最低値を解析し、その時刻をER11とする(ステップS404)。
次に、番号CUのスレッドについて、すでにスケジュールされた命令に占められていない時刻を解析し、その時刻の集合をER12とする(ステップS405)。
次に、TL[V2]が依存している命令のうち、すでにスケジュール、あるいは仮に割り当てられているものについて、命令TL[V2]へのデータの送信を調べる。送信がない場合はER13を0とする。送信がある場合は、それらの命令のデータの、番号CUのスレッドへの到着時刻を調べる。到着時刻の最大値を求め、それをER13とする(ステップS406)。
次に、番号CUのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をER14とする(ステップS407)。
次に、集合ER12の要素のうち、 時刻ER11以上かつ時刻ER14以下かつ時刻ER13以上のもののうち、最小のものは存在するか判定する(ステップS408)。最小のものが存在しない場合は、スレッド番号CUを1進め、制御をS404に戻す(ステップS409)。最小のものが存在する場合は、その時刻をER15とする(ステップS410)。
次に、命令TL[V2]について、スレッド番号を変化させて、時刻ER15の最小値を調べる。そのため、命令TL[V2]に対する、時刻ER15のスレッド番号CUに渡る最小値を記憶し、最小値が更新された場合、CUも記憶する(ステップS411)。
次に、命令TL[V2]を配置しようとするスレッド番号CUは、LF2からRM2まで変化させる。そのため、スレッド番号CUがRM2に達したか判定し(ステップS412)、RM2に達していなければ、スレッド番号CUを1増やし(ステップS413)、制御をステップS404に戻す。RM2に達していれば、ステップS411で記憶したスレッド番号、時刻にTL[V2]を仮に割り当てる(ステップS414)。仮の割当て、命令スケジュールによる割当て区別して、後で取り消せるようにしておく。
次に、TSのすべての命令を仮に割当てたか判定し(ステップS415)、すべての命令を仮に割り当てていなければ、変数V2を1増やし、制御をステップS403に戻す(ステップS416)。すべての命令を仮に割り当てていれば、仮の割当てに関する情報をすべて消去して、TL[V2]のスロットのスレッド番号と時刻を返し処理を終了する(ステップS416)。ここで、TL[V2]は、命令RIを先頭とする、最長依存命令列の末尾の命令である。
次に、本実施例の効果を説明する。
本実施例によれば、並列実行時間のより短い並列化プログラムを生成することができる。その理由を以下に述べる。
第1の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。図6の例を用いて説明する。図6において、マス目はスレッド番号と、時刻のスロットを表し、色分けされたマス目はそこに命令が配置されていることを表す。同一プロセッサで動作する複数のスレッドを区別するために色を分けている。図6(a)では、スレッド1に多くの命令を割り当てたため、プロセッサ2において命令が実行されないサイクルが生じている。本実施例によれば、図6(b)のように命令数を均等にして割り当てることができ、プロセッサ2における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。
第2の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドの実行開始時刻の間隔を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。図7の例を用いて説明する。図7(a)では、スレッド2に割り当てられた命令列の開始時刻が遅れているため、プロセッサ1において命令が実行されないサイクルが生じている。本実施例によれば、図7(b)のように命令の実行開始時刻の間隔を整えて割り当てることができ、プロセッサ1における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。
各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃え、かつ、各スレッドの実行開始時刻の間隔を揃えるには、各スレッドの命令の実行開始・終了時刻に制限を加えた上でさらに、並列実行時間を短くできるスケジュールを行う必要がある。命令スケジュールにおいて並列実行時間を短くするためには、まだスケジュールされていない命令について、その命令を先頭とする最長依存命令列の末尾の命令の実行完了の時刻を予測し、その時刻が最も遅いような先頭の命令を先にスケジュールする必要がある。最長依存命令列とは、依存グラフ上での依存に沿った命令列で、その実行終了時刻が最も遅い命令列である。なぜなら、最も遅く実行が完了する命令列の、先頭の命令のスケジュールを後に回すと、ますますその命令列の実行完了時刻が大きくなる可能性があるからである。このため、この命令列の実行完了時刻の予測精度をあげる必要がある。このためには、先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握と、命令列の実行時刻の正確な予測が必要である。本実施例は、各スレッドの命令の実行開始・終了時刻に制限を加えた上でさらに、これらを可能にする。結果として、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えて、かつ、各スレッドの実行開始時刻の間隔を揃えることができる。
ここで、ある命令を先頭とする依存グラフ上の命令列について、その先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握ができる理由は、各スレッドの命令の実行開始・終了時刻の制限を考慮して、命令を割当て可能なスレッド番号と時刻を選択できるためである。
また、ある命令を先頭とする最長依存命令列の末尾の命令について、正確な実行時刻の予測ができる理由は、最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測できるためと、各スレッドの命令の開始・終了時刻の制限を考慮して、命令列の実行時間を予測できるためである。
(具体例)
図14を参照して、第1の実施例に係るプログラム並列化装置100におけるスレッド開始・終了時刻制限スケジュール部108の処理の具体例を説明する。
図14(a)は、入力となる逐次処理中間プログラムと、入力となる命令間の依存情報を示す図である。丸は命令を表し、矢印は命令間の依存を表す。入力となる命令の実行開始・終了時刻の制限は、全てのスレッドに対して開始時刻と終了時刻の差が一定値6で、開始時刻がスレッド番号とともに一定の増分2で増えるような制限とする。プロセッサ数は3とする。全命令の遅延時間は1サイクルとする。フォーク命令の遅延時間は2サイクルとする。レジスタデータを命令の間で通信する場合の遅延時間は、スレッド番号iのスレッドからスレッド番号jのスレッドに送る場合に、2+(j−i−1)*1サイクルとする。各スレッドの命令の実行開始・終了時刻の制限を実現するために、あらかじめフォーク命令を、スレッド番号pのスレッドについては時刻p*2に割り当てておく。
図15に、各スレッドの命令の実行開始・終了時間の制限と、フォーク命令を示す。灰色ではないマス目に命令を割り当てる。命令f1〜f3はあらかじめ割り当てられているフォーク命令である。
次に、図14(a)に示す具体例に対する第1の実施例によるスレッド開始・終了時刻制限スケジュール部108の動作の詳細を、図2から図5のフローチャートも参照しつつ説明する。
まず、ステップS201において、各命令IについてのHT(I)を計算する。全命令の遅延時間は1サイクルであるので、図14(b)に示す値となる。例えば、HT(命令a6)は6である。命令HT(I)を与える命令は、各命令に依存している命令である。例えば、命令a7に対しては命令a6である。
次に、ステップS202において、他の命令に依存していない命令a6、命令b5、命令c4、命令d2、命令e2を集合RSに登録する。
次に、ステップS203において、集合RSの全命令を未選択とする。
次に、ステップS204において、集合RSに属する命令のうち、未選択のもの命令a6を命令RIにする。
次に、ステップS205において、命令a6が依存している命令はないので、スレッド番号LFを1とする。また、LFより大きくかつ命令が割り当てられていない最小スレッド番号は2であるので、スレッド番号RMは2とする。スレッド番号TNをLFすなわち1にする。
次に、ステップS206において、各スレッドの命令の実行開始時刻の制限に従うと、番号1のスレッドについてはサイクル0から命令を割当て可能であるので、時刻ER1を0にする。
次に、ステップS207において、番号1のスレッドについては、サイクル0に命令f1が割当てられているため、集合ER2を0以外の全てのサイクルとする。
次に、ステップS208において、命令a6が依存している命令はないため、ER3を0にする。
次に、ステップS209において、命令の実行終了時刻の制限に従うと、番号1のスレッドについてはサイクル5まで命令を割当て可能であるので、時刻ER4を5にする。
次に、ステップS210において、集合ER2の要素のうち、 時刻ER1以上かつ時刻ER4以下かつ時刻ER3以上のもののうち、最小のものは1で、存在するので、制御をステップS212に移す。
次に、ステップS212において、時刻ER5を1にする。
次に、ステップS213において、スレッド番号TN、時刻ER5に命令RIを割り当てたと仮定して、各スレッドの実行開始・終了時刻の制限に基づいて、命令RIが属する最長依存命令列の末尾の命令TIの実行時刻を推定する。
図3に移る。まず、 ステップS401において、命令a6を先頭とする、依存グラフにおける命令列について、最長のものはa6、a5、a4、a3、a2、a1であるので、これを命令列TSとする。
次に、ステップS402において、変数V2を1にする。
次に、ステップS403において、TL[1]は命令a5であり、命令a5が依存しているのは命令a6なのでスレッド番号LF2を1とする。現在命令が割り当てられていないスレッドのうち、番号が最小のものは2であるので、スレッド番号RM2は2とする。変数CUにLF2すなわち1を代入する。
次に、ステップS404おいて、各スレッドの命令実行開始時刻の制限に基づくと、番号1のスレッドについては、命令は時刻0以上に割り当てることができるので時刻ER11を0にする。
次に、ステップS405において、番号1のスレッドについては、時刻0に命令が割り当てられていて、時刻1に命令が仮に割り当てられているので、集合ER12は0と1以外とする。
次に、ステップS406において、命令a5が依存しているのは命令a6なのでER13を時刻2とする。
次に、ステップS407において、命令実行終了時刻の制限に基づくと、番号1のスレッドについては、命令は時刻5以下にしか割り当てることができないので時刻ER14を5にする。
次に、ステップS408において、集合ER12の要素のうち、 時刻ER11以上かつ時刻ER14以下かつ時刻ER13以上のもののうち、最小のものは2で、存在するので、制御をステップS410に移す。
次に、ステップS410において、時刻ER15を2にする。
次に、ステップS411において、時刻の最小値を2と記憶する。また、スレッド番号CUの値1も記憶する。
次に、ステップS412において、スレッド番号RM2は1である。CUは2に達していないので、ステップS413において、スレッド番号CUを1進め、制御をステップS404に戻す。
ステップS404〜S413からなるループの2番目の繰り返しは1番目の繰り返しと同様に実行されるので概要のみを説明する。ステップS404で、時刻ER11は2とする。ステップS405において、時刻2にフォーク命令が割り当てられているので、ER12は3とする。ステップS406において、命令a5が依存しているのは命令a6で、命令a6はスレッド番号1、時刻1に仮に割り当てられているので、データをスレッド番号2に送信すると、到着時刻は時刻3となる。このため、ER13は時刻3となる。ステップS407において、時刻ER14は7とする。そして、ステップS410において、時刻ER15は3となる。このため、ステップS411では、時刻の最小値は更新されない。そして、ステップS412において、変数CUはスレッド番号RM2に達し、制御はS414に移る。
次に、ステップS414において、命令a5をスレッド番号1、時刻2に仮に割り当てる。
次に、ステップS415において、まだ仮に割り当てていないTSの命令があるので、制御をステップS416に移す。
次に、ステップS416において、変数V2を1増やし、制御をステップS403に移す。
ステップS403〜S416からなるループの2番目の繰り返しは1番目の繰り返しと同様に実行される。TL[2]は命令a4であり、スレッド番号1、時刻3に仮に割り当てられる。さらに、TL[3]は命令a3であり、スレッド番号1、時刻4に仮に割り当てられる。さらに、TL[4]は命令a2であり、スレッド番号1、時刻5に仮に割り当てられる。
5番目の繰り返しについて説明する。TL[5]は命令a1である。ステップS403で変数CUを1とする。ステップS405において、集合ER12は時刻0〜5以外となる。スレッド番号1は命令の実行終了間隔の制限により、時刻5以下にしか命令が割り当てることができない。そのためステップS407において、時刻ER14が5となる。そのため、ステップS408において、スレッド番号1には、命令a2を割り当てられる時刻が存在しないことが分かる。このため、ステップS409において、命令a2を割り当てようとしているスレッド番号を示す変数CUが2となり、ステップS404に制御が移る。命令a1はスレッド番号1、時刻5の命令a2に依存している。さらに命令a2からスレッド番号2にデータを送信すると遅延時間が2サイクルかかる。このためステップS406において、時刻ER13は7となる。このため、命令a1はスレッド番号2、時刻7に仮に割り当てられる。
図16に命令a6がスレッド番号1、時刻1に割り当てられたと仮定したときの、命令列a6〜a1の仮の割当ての結果を示す。
ステップS415において、命令列TSの全ての命令を仮に割り当てたので、制御をステップS417に移す。
ステップS417において、仮の割当てをすべて消去して、命令TL[V2]、すなわち命令a1が仮に割り当てられたスレッド番号2、時刻7を出力して処理を終了する。
図2及び図3に戻る。ステップS214において、命令a6のスレッド番号1と時刻1と、命令a1の時刻7を記憶する。
ステップS215において、スレッド番号RMは2である。スレッド番号TNは1であるのでまだRMに達していないと判断し、ステップS216に制御を移す。
ステップS216において、スレッド番号TNを1進め、制御をステップS206に移す。
以下の説明では、ステップS206〜S216からなるループを「ループC」と呼ぶ。ループCの2番目の繰り返しは1番目の繰り返しと同様に実行されるので概要のみを説明する。まず、ステップS206において、各スレッドの命令の実行開始時刻の制限により、時刻ER1は2とされる。そして、ステップS207において、時刻2に割り当てられているフォーク命令のために、集合ER2は2以外とされる。そして、ステップS208において、命令a6に依存している命令はないのでER3は0とされる。ステップS209において、時刻ER4は7とされる。そして、ステップS210、ステップS212でER5は3とされる。ステップS213では、命令a6をスレッド番号2、時刻3に仮に割り当てたと仮定して、命令a6を先頭とする最長依存命令列a6〜a1を仮に割り当てて、命令列のうちで最も遅くに実行される命令a1の実行時刻を推定する。
図17に命令a6がスレッド番号2、時刻3に割り当てられたと仮定したときの、命令列a6〜a1の仮の割当ての結果を示す。
ステップS214において、命令a1の時刻9は以前記憶したものより大きいので記憶されない。
ステップS215において、スレッド番号TNは2であるためRMに達したと判断し、制御をステップS217に移す。
ステップS217において、まだ割り当てていない命令があるため制御をステップS204に戻す。
以下の説明では、S204〜S217からなるループを「ループB」と呼ぶ。ループBの2番目の繰り返しは1番目の繰り返しと同様に実行されるので概要のみを説明する。ステップS204で、命令b5を命令RIとする。S205〜S212において、スレッド番号TNは1、時刻ER5は時刻1とされる。ステップS213において、命令b5をこのスレッド番号と時刻に割り当てたと仮定して、命令b5を先頭とする最長依存命令列b5〜b3、a2,a1について、これらを仮に割り当てる。そして、この命令列の末尾の命令a1の実行時刻を推定する。
図18に命令b5がスレッド番号1、時刻1に割り当てられたと仮定したときの、命令列b5〜b3、a2,a1の仮の割当ての結果を示す。
この結果が、命令b5については、命令a1が最も早い時刻に実行されるものである。このため、ステップS215、ステップS216、ループCの2番目の繰り返しの説明を省略する。ループCは2回だけ繰り返し、ステップS217に制御が移る。
ステップS217において、まだ割り当てていない命令があるため制御をステップS204に戻す。
ループBの3番目の繰り返しの概要を説明する。命令c4について、命令c4を先頭とする最長依存命令列は命令c4〜c1である。命令c1の実行時刻が最も早くなるような、命令c4の割当ては、スレッド番号1、時刻1で、そのときの命令c1の割当ては、スレッド番号1、時刻4である。
ループBの4番目の繰り返しの概要を説明する。命令d2について、命令d2を先頭とする最長依存命令列は命令d2〜c1である。命令c1の実行時刻が最も早くなるような、命令d2の割当ては、スレッド番号1、時刻1で、そのときの命令c1の割当ては、スレッド番号1、時刻2である。
ループBの5番目の繰り返しの概要を説明する。命令e2について、命令e2を先頭とする最長依存命令列は命令e2〜c1である。命令c1の実行時刻が最も早くなるような、命令e2の割当ては、スレッド番号1、時刻1で、そのときの命令c1の割当ては、スレッド番号1、時刻2である。
次にステップS218において、集合RSに属する各命令について、その命令を先頭とする最長依存命令列の末尾の命令の実行時刻が最大のものを選ぶ。ここでは、命令a6の最長依存命令列a6〜a1の命令a1の時刻が7で最大である。このため命令a6を選び、スレッド番号1、時刻1に割り当てる。図19にスケジュールの結果を示す。
ステップS219において、命令a6を集合RSから除去する。命令a6に依存している命令a5は、命令a6にだけ依存していたので、集合RSに登録する。
ステップS220において、まだスケジュールを行っていない命令があるので、制御をS203に戻す。
以下の説明では、ステップS203〜S220からなるループを「ループA」と呼ぶ。図20にループAの実行結果を示す。各行は、ループAの結果を示す。各列は、集合RSに含まれる各命令についてのループCの結果を示す。それぞれ、その命令と、その割当て候補のスレッド番号と時刻と、その命令を先頭とする最長依存命令列の末尾の命令と、その予測実行スレッド番号と時刻を示す。下線が引かれているものは、スケジュール対象として選ばれたものである。
ループAの2番目の繰り返しでは、命令a5がスケジュールされる。
ループAの3番目の繰り返しでは、命令b5がスケジュールされる。ここで、命令b5はスレッド番号1、時刻3にもスケジュールできるが、スレッド番号2、時刻3がループCで選ばれている。これは、命令b5の最長依存命令列の末尾の命令a1の予測実行時刻の差異による。命令b5をスレッド番号1、時刻3にスケジュールした際は、各スレッドの命令の実行開始・終了時刻の制限のため、命令a1はスレッド番号3、時刻9に実行されると予測される。図21にこの様子を示す。隣接プロセッサにデータを送信する場合の遅延が2サイクルであることに注意されたい。
一方、スレッド番号2、時刻3にスケジュールした際は、命令a1はスレッド番号2、時刻7に実行されると予測される。図22にこの様子を示す。
このように、各スレッドの命令の実行開始・終了時刻の制限を考慮することで、命令をスケジュールする場所により最長依存命令列の末尾の命令の予測実行時刻が変化することが解析できる。
以下、ループAの繰り返しで、命令a4、b4、c4、c3、c2、d2、e2、c1、a3、b3、a2、a1の順でスケジュールされる。
最後にステップ221において、スケジュール結果を出力して終了する。図23にスケジュール結果を示す。
以上説明したように、本具体例によれば、並列実行時間のより短い並列化プログラムを生成することができる。その理由を以下に述べる。
第1の理由は、各スレッドの命令の実行開始時刻の制限を考慮できるため、スケジュール可能な時刻が正確に把握できるためである。例えば、ループAの1番目の繰り返しで、命令a6をスレッド番号2にスケジュールすると仮定したとき、各スレッドの命令の実行開始時刻の制限から、スケジュールできる時刻は2以上と分かる。
第2の理由は、ある命令を先頭とする最長依存命令列について、命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測できるため、ある命令を先頭とする最長依存命令列の末尾の命令について、正確な実行時刻の予測ができるためである。例えば、ループAの9番目の繰り返しで、命令d2をスレッド番号1、時刻4にスケジュールすると仮定したとき、さらに、命令d2を先頭とする最長依存命令列d2、c1について、命令c1が実行されるスレッド番号と時刻を予測する。命令c1は命令c2に依存しており、命令c2はスレッド番号3、時刻7に割り当てられている。このため、命令c1はスレッド番号3、時刻8に実行されると予測する。この様子を図24に示す。
このように、最長依存命令列のそれぞれの命令について、実行されるスレッド番号と時刻を予測するため、最長依存命令列の末尾の命令について、正確な実行時刻の予測ができる。
第3の理由は、命令の実行終了時刻の制限を考慮できるため、割当て可能なスレッド番号と時刻が正確に把握できるため、最長依存命令列の末尾の命令の実行時刻がより正確に予測できるためである。例えば、ループAの3番目の繰り返しで、命令b5をスレッド番号1、時刻3にスケジュールすると仮定したとき、命令b4は時刻4、命令b3は時刻5に仮に割り当てられ、命令a2は、命令の実行終了時刻の制限のため、スレッド番号2、時刻7に仮に割り当てられ、末尾の命令a1は、命令の実行終了時刻の制限のため、スレッド番号3、時刻9に実行されると予測される。この様子を図25に示す。
命令b5をスレッド番号2、時刻3にスケジュールすると仮定したときは、命令a1はスレッド番号2、時刻7に実行されると予測される。この様子を図26に示す。
このように、命令の実行終了時刻の制限を考慮することで最長依存命令列の末尾の命令の実行時刻がより正確に予測できる。
図27を参照すると、本発明の第2の実施例にかかるプログラム並列化装置100Aは、記憶装置302の記憶部320Mから、図示しないプログラム解析装置によって生成された、逐次処理中間プログラム320を入力し、記憶装置303の記憶部330Mから、図示しない依存解析装置によって生成された、命令間の依存情報330を入力し、記憶装置306の記憶部360Mから、命令の実行開始・終了時刻の制限集合360を入力し、各命令の実行時刻と実行プロセッサを決定した並列化中間プログラム350を生成し、記憶装置305の記憶部350Mに記録する装置である。
プログラム並列化装置100Aは、入力となる逐次処理中間プログラム320を記憶する磁気ディスクなどの記憶装置302と、入力となる命令間の依存情報330を記憶する磁気ディスク等の記憶装置303と、入力となる命令の実行開始・終了時刻の制限集合360を記憶する磁気ディスク等の記憶装置306と、出力となる並列化プログラム350を記憶する磁気ディスクなどの記憶装置305と、これらの記憶装置302、303、305及び306に接続された中央処理装置等の処理装置107Aとで構成されている。また処理装置107Aは、スレッド開始・終了時刻制限スケジュール部108Aを備える。
このようなプログラム並列化装置100Aは、パーソナルコンピュータやワークステーションなどのコンピュータとプログラムとで実現することができる。プログラムは、磁気ディスク等のコンピュータ可読記録媒体に記録され、コンピュータの立ち上げ時などにコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータ上にスレッド開始・終了時刻制限スケジュール部108Aといった機能手段を実現する。
スレッド開始・終了時刻制限スケジュール部108Aは、各スレッドの命令実行開始・終了時刻の制限集合の複数の要素について、命令スケジュールを行い、最も並列実行時間の短い命令スケジュールを決定する。命令スケジュールとはすなわち、各命令の実行スレッド番号と実行時刻を決定することである。そして、決定されたスケジュールを実現するように命令の実行順序を決定し、フォーク命令を挿入する。そして、並列化の結果である並列化中間プログラム350を記録する。
スレッド開始・終了時刻制限スケジュール部108Aは、各スレッドの命令実行開始・終了時刻の制限を選択する命令実行開始・終了時刻制限選択部180と、各スレッドの命令実行開始時刻の制限に基づいて、命令を配置できる時刻を解析するスレッド開始時刻制限解析部220と、各スレッドの命令実行終了時刻の制限に基づいて、命令を配置できる時刻を解析するスレッド終了時刻制限解析部230と、すでにスケジュールされた命令によって占有されているスレッド番号と時刻のスロットを解析する占有状況解析部240と、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部250と、スレッド開始時刻制限解析部220と、スレッド終了時刻制限解析部230と、占有状況解析部240と、依存遅延解析部250の情報を元に、次にスケジュールを行う命令を選択するスケジュール候補命令選択部190と、スケジュール候補命令選択部190の決定に基づいて、命令をスロットに割り当てる、すなわち、命令の実行時刻と実行スレッドを決定する命令配置部200と、スケジュール結果を実現するように命令の実行順序を決定し、フォーク命令を挿入するフォーク挿入部210と、スケジュール結果の並列実行時間を測定あるいは予測する並列実行時間測定部270と、各スレッドの命令実行開始・終了時刻の制限について、それを変化させて、それぞれのスケジュール結果を比較し、最良のものを選択する最良スケジュール決定部260と、を備える。
次に、本実施例にかかるプログラム並列化装置100Aの動作について説明する。特に、図28を参照して、スレッド開始・終了時刻制限スケジュール部108Aで処理される、各スレッドの命令の実行開始・終了時刻に制限を加えた上でのスケジュール処理を説明する。
スレッド開始・終了時刻制限スケジュール部108Aは、記憶装置302の記憶部320Mから逐次処理中間プログラム320を入力する。逐次処理中間プログラム320は、グラフの形で表現される。逐次処理中間プログラム320を構成する関数は、関数を表すノードとして表現され、関数を構成する命令は、命令を表すノードとして表現される。また、ループは再帰関数に変換して、再帰関数として表現してもよい。また、逐次処理中間プログラム320においては、命令の実行時刻と実行スレッド番号とを決定する命令スケジュールの対象となる、スケジュール領域が決定されている。スケジュール領域は、例えば、基本ブロックとしてもよいし、複数の基本ブロックとしてもよい。
次に、記憶装置303の記憶部330Mから命令間の依存情報330を入力する。依存情報330は、レジスタ、メモリの読み書きに伴うデータフローの解析、制御フローの解析により得られる、命令間の依存であり、命令を表すノードを結ぶ有向辺で表す。
次に、記憶装置306の記憶部360Mから各スレッドの命令の実行開始・終了時刻の制限の集合を命令の実行開始・終了時刻の制限集合360から入力する。
個々の制限は、例えば、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるようなものでもよい。図8を参照して、具体例を説明する。
図8で、マス目はスレッド番号と、時刻のスロットを表し、色分けされたマス目はそこに命令が配置されていることを表す。同一プロセッサで動作する複数のスレッドを区別するために色を分けている。間隔を1サイクル、命令数を4とするような制限は、図8(a)のような命令の配置の制限である。また、間隔を2サイクル、命令数を8とするような制限は、図8(b)のような命令の配置の制限である。また、全てのスレッドに対して開始時刻がスレッド番号とともに一定の増分で増えるが、各スレッドの命令数に制限を加えないような制限を用いてもよい。また、各スレッドの命令数にだけ制限をおいて、各スレッドに対して開始時刻に制限を加えないような制限を用いてもよい。
全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような制限を、〈開始時刻の増分,開始時刻と終了時刻の差〉と表すことにする。プロセッサ数をNPE、フォーク命令の遅延時間をLforkとする。制限の集合は、例えば、〈Lfork、Lfork×NPE〉、〈Lfork+1,(Lfork+1)×NPE〉、〈Lfork+2,(Lfork+2)×NPE〉、…を用いてもよい。また、全てのスレッドに対して開始時刻がスレッド番号とともに一定の増分で増えるが、各スレッドの命令数に制限を加えないような制限をさらに加えたものを用いてもよい。
まず、各スレッドの命令の実行開始・終了時刻の制限の集合から、未選択のものを選び、SHとする(ステップS101)。
次に、制限SHに従って命令スケジュールを行う。スケジュール結果をSCとする(ステップS102)。このステップについては第1の実施例の図2から図5に示したものと同一である。
次に、スケジュール結果SCの並列実行時間を計測あるいは推定する(ステップS103)。並列実行時間は、例えば、スレッド番号と時刻の二次元の表に、すでにスケジュールされた命令が割り当てられた位置を記録しておき、これを参照してもよい。また、例えば、シミュレーションによって推定してもよい。また、例えば、スケジュール結果SCを実現するオブジェクトコードを生成し、実行して計測してもよい。
次に、記憶していた最短並列実行時間より短ければスケジュール結果SCを最短スケジュールとして記憶する(ステップS104)。
次に、全ての制限を選択したか判定する(ステップS105)。全ての制限を選択していなければ、制御をS101に戻す。
全ての制限を選択していれば、最短スケジュールを最終的なスケジュールとして出力して終了する(ステップS106)。
次に、第2の実施例の効果を説明する。
第2の実施例によれば、第1の実施例に比べて、並列実行時間のより短い並列化プログラムを生成することができる。その理由は、各スレッドの命令の実行開始・終了時刻の制限について、複数の制限の中からよりよい制限を選択して、その制限に基づいたスケジュールを得ることができるからである。
図29を参照すると、本発明の第3の実施例にかかるプログラム並列化装置100Aは、図示しない逐次コンパイラによって生成された機械語命令形式の逐次処理プログラム101を入力し、マルチスレッド型並列プロセッサ向けの並列化プログラム103を生成し出力する装置である。
プログラム並列化装置100Bは、入力となる逐次処理プログラム101を記憶する磁気ディスクなどの記憶装置102と、入力となる命令の実行開始・終了時刻の制限集合360を記憶する磁気ディスク等の記憶装置306と、出力となる並列化プログラム103を記憶する磁気ディスクなどの記憶装置104と、逐次処理プログラム101を並列化プログラム103に変換する過程で使用するプロファイルデータを記憶する磁気ディスク等の記憶装置301と、これらの記憶装置102、104、301及び306に接続された中央処理装置等の処理装置107Bとで構成されている。また処理装置107Bは、制御フロー解析部110と、スケジュール領域形成部140と、レジスタデータフロー解析部150と、命令間メモリデータフロー解析部170と、スレッド開始・終了時刻制限スケジュール部108Aと、レジスタ割り当て部280と、プログラム出力部290とを備える。
このようなプログラム並列化装置100Bは、パーソナルコンピュータやワークステーションなどのコンピュータとプログラムとで実現することができる。プログラムは、磁気ディスク等のコンピュータ可読記録媒体に記録され、コンピュータの立ち上げ時などにコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータ上に制御フロー解析部110、スケジュール領域形成部140、レジスタデータフロー解析部150、命令間メモリデータフロー解析部170、スレッド開始・終了時刻制限スケジュール部108A、レジスタ割り当て部280およびプログラム出力部290といった機能手段を実現する。
制御フロー解析部110は、記憶装置102の記憶部101Mから逐次処理プログラム101を入力し、制御フローを解析する。この解析結果を参照して、ループを再帰関数に変換してもよい。この変換によって、ループの各イタレーションを並列化することができる。
スケジュール領域形成部140は、制御フロー解析部110による制御フローの解析結果および、記憶装置301の記憶部310Mから入力したプロファイルデータ310を参照して、命令の実行時刻と実行スレッド番号とを決定する命令スケジュールの対象となるスケジュール領域を決定する。
レジスタデータフロー解析部150は、制御フロー解析部110による制御フローの解析結果および、スケジュール領域形成部140によるスケジュール領域の決定を参照して、レジスタの読み書きに伴うデータフローを解析する。
命令間メモリデータフロー解析部170は、制御フロー解析部110による制御フローの解析結果および、記憶装置301の記憶部310Mから入力したプロファイルデータ310を参照して、あるメモリアドレスに対する読み書きに伴うデータフローを解析する。
スレッド開始・終了時刻制限スケジュール部108Aは、各スレッドの命令の実行開始・終了時刻の制限集合について、その集合の複数の要素について、命令スケジュールを行い、最も並列実行時間の短い命令スケジュールを決定する。命令スケジュールとはすなわち、各命令の実行時刻と実行スレッド番号を決定することである。その際に、レジスタデータフロー解析部150によるレジスタのデータフローの解析結果および、命令間メモリデータフロー解析部170による命令間のデータフローの解析結果を参照する。そして、決定されたスケジュールを実現するように命令の実行順序を決定し、フォーク命令を挿入する。
レジスタ割り当て部280は、スレッド開始・終了時刻制限スケジュール部108Aによって決定された命令の実行順序とフォーク命令を参照して、レジスタ割り当てを行う。
プログラム出力部290は、レジスタ割り当て部280の結果を参照して、実行可能プログラムを生成して出力する。
スレッド開始・終了時刻制限スケジュール部108Aは、各スレッドの命令の実行開始・終了時刻の制限を選択する命令実行開始・終了時刻制限選択部180と、各スレッドの命令実行開始時刻の制限に基づいて、命令を配置できる時刻を解析するスレッド開始時刻制限解析部220と、各スレッドの命令実行終了時刻の制限に基づいて、命令を配置できる時刻を解析するスレッド終了時刻制限解析部230と、すでにスケジュールされた命令によって占有されているスレッド番号と時刻のスロットを解析する占有状況解析部240と、命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部250と、スレッド開始時刻制限解析部220と、スレッド終了時刻制限解析部230と、占有状況解析部240と、依存遅延解析部250の情報を元に、次にスケジュールを行う命令を選択するスケジュール候補命令選択部190と、スケジュール候補命令選択部190の決定に基づいて、命令をスロットに割り当てる、すなわち、命令の実行時刻と実行スレッドを決定する命令配置部200と、スケジュール結果を実現するように命令の実行順序を決定し、フォーク命令を挿入するフォーク挿入部210と、スケジュール結果の並列実行時間を測定あるいは予測する並列実行時間測定部270と、各スレッドの命令実行開始・終了時刻の制限について、それを変化させて、それぞれのスケジュール結果を比較し、最良のものを選択する最良スケジュール決定部260と、を備える。
次に、本実施例にかかるプログラム並列化装置100Bの動作について説明する。
まず、制御フロー解析部110は、記憶装置102の記憶部101Mから逐次処理プログラム101を入力し、制御フローを解析する。プログラム並列化装置の内部では、逐次処理プログラム101はグラフの形で表現される。逐次プログラム101を構成する関数は、関数を表すノードとして表現され、関数を構成する命令は、命令を表すノードとして表現される。
スケジュール領域形成部140は、制御フロー解析部110による制御フローの解析結果および、記憶装置301の記憶部310Mから入力したプロファイルデータ310を参照して、命令の実行時刻と実行スレッドとを決定する命令スケジュールの対象となるスケジュール領域を決定する。スケジュール領域は、例えば、基本ブロックとしてもよいし、複数の基本ブロックとしてもよい。
レジスタデータフロー解析部150は、制御フロー解析部110による制御フローの解析結果および、スケジュール領域形成部140によるスケジュール領域の決定を参照して、レジスタの読み書きに伴うデータフローを解析する。データフローの解析は、例えば、関数内に限定して行ってもよいし、関数間にまたがって行ってもよい。データフローは命令間の依存として、命令を表すノードを結ぶ有向辺で表す。
命令間メモリデータフロー解析部170は、制御フロー解析部110による制御フローの解析結果および、記憶装置301の記憶部310Mから入力したプロファイルデータ310を参照して、あるメモリアドレスに対する読み書きに伴うデータフローを解析する。データフローは命令間の依存として、命令を表すノードを結ぶ有向辺で表す。
スレッド開始・終了時刻制限スケジュール部108Aは、各スレッドの命令の実行開始・終了時刻の制限集合について、その集合の複数の要素について、命令スケジュールを行い、最も並列実行時間の短い命令スケジュールを決定する。命令スケジュールとはすなわち、各命令の実行時刻と実行スレッド番号を決定することである。命令スケジュールの際に、レジスタデータフロー解析部150によるレジスタのデータフローの解析結果および、命令間メモリデータフロー解析部170による命令間の依存の解析結果を参照する。そして、決定されたスケジュールを実現するように命令の実行順序を決定し、フォーク命令を挿入する。
レジスタ割り当て部280は、スレッド開始・終了時刻制限スケジュール部108Aによって決定された命令の実行順序とフォーク命令を参照して、レジスタ割り当てを行う。
プログラム出力部290は、レジスタ割り当て部280の結果を参照して、実行可能プログラムを生成して出力する。
スレッド開始・終了時刻制限スケジュール部108Aで処理される、各スレッドの命令の実行開始・終了時刻に制限を加えた上でのスケジュール処理は、第2の実施例と同じであるため、説明を省略する。
次に、本実施例の効果を説明する。
本実施例によれば、並列実行時間のより短い並列化プログラムを生成することができる。その理由を以下に述べる。
第1の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。図6の例を用いて説明する。図6(a)では、スレッド1に多くの命令を割り当てたため、プロセッサ2において命令が実行されないサイクルが生じている。本実施例によれば、図6(b)のように命令数を均等にして割り当てることができ、プロセッサ2における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。
第2の理由は、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドの実行開始時刻の間隔を揃えることにより、プロセッサが命令を実行しないサイクルを削減できるためである。図7の例を用いて説明する。図7(a)では、スレッド2に割り当てられた命令列の開始時刻が遅れているため、プロセッサ1において命令が実行されないサイクルが生じている。本実施例によれば、図7(b)のように命令の実行開始時刻の間隔を整えて割り当てることができ、プロセッサ1における命令が実行されないサイクルを削減することができ、並列実行時間を短くできる。
各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃え、かつ、各スレッドの実行開始時刻の間隔を揃えるには、各スレッドの命令の実行開始・終了時刻に制限を加えた上でさらに、並列実行時間を短くできるスケジュールを行う必要がある。命令スケジュールにおいて並列実行時間を短くするためには、まだスケジュールされていない命令について、その命令を先頭とする最長依存命令列の末尾の命令の実行完了の時刻を予測し、その時刻が最も遅いような先頭の命令を先にスケジュールする必要がある。なぜなら、最も遅く実行が完了する命令列の、先頭の命令のスケジュールを後に回すと、ますますその命令列の実行完了時刻が大きくなる可能性があるからである。このため、この命令列の実行完了時刻の予測精度をあげる必要がある。このためには、先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握と、命令列の実行時刻の正確な予測が必要である。本実施例は、各スレッドの命令の実行開始・終了時刻に制限を加えた上でさらに、これらを可能にする。結果として、各スレッドにおける命令を実行しない空き時間を減らし、かつ、各スレッドが実行する命令数を揃えて、かつ、各スレッドの実行開始時刻の間隔を揃えることができる。
ここで、ある命令を先頭とする依存グラフ上の命令列について、その先頭の命令がスケジュールできるスレッド番号と時刻の正確な把握ができる理由は、各スレッドの命令の実行開始・終了時刻の制限を考慮して、命令を割当て可能なスレッド番号と時刻を選択できるためである。
また、ある命令を先頭とする最長依存命令列の末尾の命令について、正確な実行時刻の予測ができる理由は、最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を予測できるためと、各スレッドの命令の実行開始・終了時刻の制限を考慮して、命令列の実行時間を予測できるためである。
[その他の実施例]
以上、本発明の実施の形態及び実施例について説明したが、本発明は以上の実施の形態及び実施例にのみ限定されず、その他各種の付加変更が可能である。例えば、前記各実施例において、プロファイルデータ310を省略した構成にすることも可能である。
なお、上述したプログラム並列化装置は、その構成要素となる上述した各部(各手段)の処理(機能)を実現可能なものであれば、その物理的構成、ハードウェア(アナログ回路、デジタル回路等)構成、及びソフトウェア(プログラム)構成については、特に限定されるものではない。例えば、独立して個別の回路やユニット或いはプログラム部品(プログラムモジュール等)を構成したり、1つの回路やユニット内に一体的に構成したりする等、いずれの形態でも提供可能である。これらの形態は、実際に使用する装置の機能や用途等の事情に応じて適宜選択可能である。また、上述した各構成要素の処理(機能)に対応して、これらと同様の処理を行う各ステップを有する動作方法(プログラム並列化方法)も、本発明の範疇に含まれる。
また、上述した各部(各手段)の機能の少なくとも一部をCPU(Central Processing Unit)又はMPU(Micro Processing Unit)等のコンピュータによるソフトウェア処理で実現する場合には、コンピュータにより実行されるプログラムも、本発明の範疇に含まれる。このプログラムは、CPU等により直接実行可能な形式のプログラムに限らず、ソース形式のプログラムや、圧縮処理されたプログラム、暗号化されたプログラム等、種々形態のプログラムを含む。また、このプログラムは、装置全体の制御を行うOS(Operating System)やファームウェア等の制御プログラムと連携して動作し、或いはその一部に組み込まれて一体的に動作するアプリケーションプログラムやそれを構成するソフトウェア部品(ソフトウェアモジュール)等、いずれの形態でも適用可能である。さらに、このプログラムは、無線又は有線回線を介して外部装置と通信する通信機能を有する装置に実装して使用する場合、例えば回線上に接続されたサーバ等の外部ノードからダウンロードして自装置内の記録媒体にインストールして使用することもできる。これらの形態は、実際に使用する装置の機能や用途等の事情に応じて適宜選択可能である。
また、上記のコンピュータプログラムを記録したコンピュータ読み取り可能な記録媒体も、本発明の範疇に含まれる。この場合、記録媒体は、ROM(Read Only Memory)等のメモリ等、装置内に固定して使用されるものや、利用者により持ち運びが可能な可搬型のもの等、いずれの形態でも適用可能である。
以上、実施の形態及び実施例を参照して本願発明を説明したが、本願発明は上記実施の形態及び実施例に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
この出願は、2008年2月15日に出願された日本出願特願2008−034614号を基礎とする優先権を主張し、その開示の全てをここに取り込む。
以上説明したように、本発明は、逐次処理プログラムからマルチスレッド型並列プロセッサ向けの並列化プログラムを生成するプログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラムに利用可能である。

Claims (18)

  1. 逐次処理中間プログラムを入力し、並列化中間プログラムを出力するプログラム並列化装置において、
    各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析部と、
    各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド終了時刻制限解析部と、
    すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析部と、
    命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部と、
    次にスケジュールする命令を選択するスケジュール候補命令選択部と、
    命令に対し実行するプロセッサと時刻を割り当てる命令配置部と、
    を有することを特徴とするプログラム並列化装置。
  2. 逐次処理中間プログラムを入力し、並列化中間プログラムを出力するプログラム並列化装置において、
    各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択部と、
    各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析部と、
    各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド終了時刻制限解析部と、
    すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析部と、
    命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部と、
    次にスケジュールする命令を選択するスケジュール候補命令選択部と、
    命令に対し実行するプロセッサと時刻を割り当てる命令配置部と、
    スケジュール結果に対し、並列実行時間を測定あるいは推定する並列実行時間測定部と、
    前記制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する最良スケジュール決定部と、
    を有することを特徴とするプログラム並列化装置。
  3. 逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置において、
    入力した前記逐次処理プログラムの制御フローを解析する制御フロー解析部と、
    前記制御フロー解析部による制御フローの解析結果を参照して、スケジュール対象となる領域を決定するスケジュール領域形成部と、
    前記スケジュール領域形成部によるスケジュール領域の決定を参照して、レジスタのデータフローを解析するレジスタデータフロー解析部と、
    あるアドレスに読み書きを行う命令と、前記アドレスから読み書きを行う命令の間の依存を解析する命令間メモリデータフロー解析部と、
    各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択部と、
    各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析部と、
    各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド終了時刻制限解析部と、
    すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析部と、
    命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析部と、
    次にスケジュールする命令を選択するスケジュール候補命令選択部と、
    命令に対し実行するプロセッサと時刻を割り当てる命令配置部と、
    スケジュール結果に対し、並列実行時間を測定あるいは推定する並列実行時間測定部と、
    前記制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する最良スケジュール決定部と、
    前記最良のスケジュール決定結果を参照して、レジスタ割り当てを行うレジスタ割り当て部と、
    前記レジスタ割り当て結果を参照して、並列化プログラムを生成し出力するプログラム出力部と、
    を有することを特徴とするプログラム並列化装置。
  4. 前記スケジュール候補命令選択部が、スケジュール候補の命令を先頭とする依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析することを特徴とする請求項1から3のいずれか1項に記載のプログラム並列化装置。
  5. 前記命令実行開始・終了時刻制限選択部が、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とすることを特徴とする請求項2または3に記載のプログラム並列化装置。
  6. 逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化方法において、
    各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶステップと、
    ある命令について、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
    ある命令について、各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
    プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析するステップと、
    命令間の依存による遅延を解析するステップと、
    次にスケジュールする命令を選択するステップと、
    命令に対し実行するプロセッサと時刻を割り当てるステップと、
    を含むことを特徴とするプログラム並列化方法。
  7. 逐次処理中間プログラムを入力し、並列化中間プログラムを出力するプログラム並列化方法において、
    各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶステップと、
    各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
    各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
    プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析するステップと、
    命令間の依存による遅延を解析するステップと、
    次にスケジュールする命令を選択するステップと、
    命令に対し実行するプロセッサと時刻を割り当てるステップと、
    スケジュール結果に対し、並列実行時間を測定あるいは推定するステップと、
    前記制限を変えてスケジュールを繰り返し、最良のスケジュールを決定するステップと、
    を含むことを特徴とするプログラム並列化方法。
  8. 逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化方法において、
    入力した前記逐次処理プログラムの制御フローを解析するステップと、
    前記制御フロー解析部による制御フローの解析結果を参照して、スケジュール対象となる領域を決定するステップと、
    前記スケジュール領域形成部によるスケジュール領域の決定を参照して、レジスタのデータフローを解析するステップと、
    あるアドレスに読み書きを行う命令と、前記アドレスから読み書きを行う命令の間の依存を解析するステップと、
    各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶステップと、
    各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
    各スレッドの命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻を解析するステップと、
    プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析するステップと、
    命令間の依存による遅延を解析するステップと、
    次にスケジュールする命令を選択するステップと、
    命令に対し実行するプロセッサと時刻を割り当てるステップと、
    スケジュール結果に対し、並列実行時間を測定あるいは推定するステップと、
    前記制限を変えてスケジュールを繰り返し、最良のスケジュールを決定するステップと、
    前記最良のスケジュール決定結果を参照して、レジスタ割り当てを行うステップと、
    前記レジスタ割り当て結果を参照して、並列化プログラムを生成し出力するステップと、
    を含むことを特徴とするプログラム並列化方法。
  9. a)命令実行開始・終了時刻制限選択部が、各スレッドの命令の実行開始・終了時刻の制限の集合から、未選択のものを選び、SHとするステップと、
    b)スレッド開始時刻制限解析部とスレッド終了時刻制限解析部と占有状況解析部と依存遅延解析部とスケジュール候補命令選択部と命令配置部とが、前記制限SHに従って命令スケジュールを行い、スケジュール結果をSCとするステップと、
    c)並列実行時間測定部が、前記スケジュール結果SCの並列実行時間を計測あるいは推定するステップと、
    d)最良スケジュール決定部が、記憶していた最短並列実行時間より短ければ前記スケジュール結果SCを最短スケジュールとして記憶するステップと、
    e)前記最良スケジュール決定部が、全ての制限を選択したか判定するステップと、
    f)前記最良スケジュール決定部が、最短スケジュールを最終的なスケジュールとして出力するステップと、
    を含むことを特徴とする請求項6から8のいずれか1項に記載のプログラム並列化方法。
  10. 前記ステップb)は、
    b−1)前記命令配置部が、各命令IについてのHT(I)を計算し、また、その値を与える命令を記憶するステップと、
    b−2)前記命令配置部が、依存している命令がない命令を集合RSに登録するステップと、
    b−3)前記命令配置部が、前記集合RSの全命令を未選択とするステップと、
    b−4)前記スケジュール候補命令選択部が、前記集合RSに属する命令のうち、未選択のものを命令RIとするステップと、
    b−5)前記スケジュール候補命令選択部が、前記命令RIが依存している命令のうち、すでにスケジュールされたもののうち、最もスレッド番号が大きいもののスレッド番号をLFとし、前記スレッド番号LFより大きくかつ現在命令が割り当てられていない最も番号の小さいスレッド番号をRMとし、スレッド番号TNを前記LFに設定するステップと、
    b−6)前記スレッド開始時刻制限解析部が、前記スレッド番号TNのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻の最低値を解析し、その時刻をER1とするステップと、
    b−7)前記占有状況解析部が、前記スレッド番号TNのスレッドについて、すでにスケジュールされた命令が占められていない時刻を解析し、その時刻の集合をER2とするステップと、
    b−8)前記依存遅延解析部が、前記命令RIが依存している命令のうち、すでにスケジュールされたもののうち、前記スレッド番号TNのスレッドにデータを届けるのが最も遅いものについて、その到着時刻をER3とするステップと、
    b−9)前記スレッド終了時刻制限解析部が、前記スレッド番号TNのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をER4とするステップと、
    b−10)前記スケジュール候補命令選択部が、前記集合ER2の要素のうち、前記時刻ER1以上かつ前記時刻ER4以下かつ前記時刻ER3以上のもののうち、最小のものは存在するか判定するステップと、
    b−11)前記スケジュール候補命令選択部が、スレッド番号TNを1進めるステップと、
    b−12)前記スケジュール候補命令選択部が、存在する場合はその時刻をER5とするステップと、
    b−13)前記スケジュール候補命令選択部が、前記スレッド番号TN、前記時刻ER5に前記命令RIを仮に割り当てたと仮定して、各スレッドの実行開始・終了時刻の制限に基づいて、前記命令RIを先頭とする最長依存命令列の末尾の命令TIの実行時刻を推定するステップと、
    b−14)前記スケジュール候補命令選択部が、前記スレッド番号TNに渡る、前記命令TIの実行が最も早い時刻となる前記命令RIのスレッド番号と時刻と、推定された前記命令TIの予測時刻を前記命令RIに記憶するステップと、
    b−15)前記スケジュール候補命令選択部が、前記スレッド番号TNがRMに達したか判定するステップと、
    b−16)前記スケジュール候補命令選択部が、前記スレッド番号TNを1進めるステップと、
    b−17)前記スケジュール候補命令選択部が、前記集合RSの全ての命令を選択したか判定するステップと、
    b−18)前記命令配置部が、前記ステップb−14で記憶した前記命令TIの予測時刻が最も大きい命令をスケジュール対象CDとし、前記ステップb−14で記憶したスレッド番号と、前記ステップb−14で記憶した時刻に割り当てるステップと、
    b−19)前記命令CDを集合RSから除去し、前記命令CDに依存している命令について調べ、その命令について、前記命令CDに対する依存は解決したとし、依存している命令がなくなった場合はその命令を前記集合RSに登録するステップと、
    b−20)前記命令配置部が、全ての命令をスケジュールしたか判定するステップと、
    b−21)前記命令配置部が、スケジュール結果を出力するステップと、
    を含むことを特徴とする請求項9記載のプログラム並列化方法。
  11. 前記ステップb−9)は、
    b−9−1)前記スケジュール候補命令選択部が、前記命令RIを先頭とする、依存グラフにおける命令列について、最長のものTSとし、前記命令TSを、TL[0]をRIとして、TL[0]、TL[1]、TL[2]、…と表すステップと、
    b−9−2)前記スケジュール候補命令選択部が、変数V2を1とするステップと、
    b−9−3)前記スケジュール候補命令選択部が、前記命令TL[V2]が依存している命令のうち、すでにスケジュール、あるいは仮に割り当てられているもののうち、最もスレッド番号が大きいもののスレッド番号をLF2とし、前記スレッド番号LF2より大きくかつ、現在命令がスケジュールされていない最も番号の小さいスレッド番号をRM2とし、変数CUに前記LF2を代入するステップと、
    b−9−4)前記スレッド開始時刻制限解析部が、前記スレッド番号CUのスレッドについて、各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻の最低値を解析し、その時刻をER11とするステップと、
    b−9−5)前記占有状況解析部が、前記スレッド番号CUのスレッドについて、すでにスケジュール、あるいは仮割当てされた命令に占められていない時刻を解析し、その時刻の集合をER12とするステップと、
    b−9−6)前記依存遅延解析部が、前記命令TL[V2]が依存している命令のうち、すでにスケジュール、あるいは仮割当てされているものについて、前記命令TL[V2]へのデータの送信を調べ、それらの命令のデータの、前記スレッド番号CUのスレッドへの到着時刻を調べ、その最大値をER13とするステップと、
    b−9−7)前記スレッド終了時刻制限解析部が、前記スレッド番号CUのスレッドについて、命令実行終了時刻の制限に基づいて、命令を割り当て可能な時刻の最大値を解析し、その値をER14とするステップと、
    b−9−8)前記スケジュール候補命令選択部が、前記集合ER12の要素のうち、前記時刻ER11以上かつ前記時刻ER14以下かつ前記時刻ER13以上のもののうち、最小のものは存在するか判定するステップと、
    b−9−9)前記スケジュール候補命令選択部が、前記スレッド番号CUを1進めるステップと、
    b−9−10)前記スケジュール候補命令選択部が、存在する場合はその時刻をER15とするステップと、
    b−9−11)前記スケジュール候補命令選択部が、前記命令TL[V2]に対する、前記時刻ER15のスレッド番号CUに渡る最小値を記憶し、最小値が更新された場合、前記スレッド番号CUも記憶するステップと、
    b−9−12)前記スケジュール候補命令選択部が、前記スレッド番号CUが前記RM2に達したか判定するステップと、
    b−9−13)前記スケジュール候補命令選択部が、前記スレッド番号CUを1増やすステップと、
    b−9−14)前記スケジュール候補命令選択部が、前記ステップb−9−11で記憶したスレッド番号、時刻に前記命令TL[V2]を仮に割り当てるステップと、
    b−9−15)前記スケジュール候補命令選択部が、前記命令TSのすべての命令を仮に割り当てたか判定するステップと、
    b−9−16)前記スケジュール候補命令選択部が、前記変数V2を1増やすステップと、
    b−9−17)前記スケジュール候補命令選択部が、仮の割当てをすべて消去して、前記命令TL[V2]が仮に割り当てられたスレッド番号と時刻を出力するステップと、
    を含むことを特徴とする請求項10記載のプログラム並列化方法。
  12. 次にスケジュールする命令を選択するステップにおいて、スケジュール候補の命令を先頭とする最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析することを特徴とする請求項6から11のいずれか1項に記載のプログラム並列化方法。
  13. 各スレッドの命令実行開始・終了時刻の制限の集合から制限を選ぶステップにおいて、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とすることを特徴とする請求項6から11のいずれか1項に記載のプログラム並列化方法。
  14. 逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化装置を構成するコンピュータを、
    各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択手段と、
    各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析手段と、
    各スレッドの実行命令数の制限に基づいて、ある命令について、その命令が属する依存命令列のうち最も遅い時刻に実行される命令と、その命令の実行時刻を推定するスレッド終了時刻制限解析手段と、
    プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析手段と、
    命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析手段と、
    次にスケジュールする命令を選択するスケジュール候補命令選択手段と、
    命令に対し実行するプロセッサと時刻を割り当てる命令配置手段と、
    として機能させることを特徴とするプログラム並列化プログラム。
  15. 逐次処理中間プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化中間プログラムを出力するプログラム並列化装置を構成するコンピュータを、
    各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択手段と、
    各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析手段と、
    各スレッドの実行命令数の制限に基づいて、ある命令について、その命令が属する依存命令列のうち最も遅い時刻に実行される命令と、その命令の実行時刻を推定するスレッド終了時刻制限解析手段と、
    プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析手段と、
    命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析手段と、
    次にスケジュールする命令を選択するスケジュール候補命令選択手段と、
    命令に対し実行するプロセッサと時刻を割り当てる命令配置手段と、
    スケジュール結果に対し、並列実行時間を測定あるいは推定する並列実行時間測定手段と、
    制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する最良スケジュール決定手段と、
    として機能させることを特徴とするプログラム並列化プログラム。
  16. 逐次処理プログラムを入力し、マルチスレッド型並列プロセッサ向けの並列化プログラムを出力するプログラム並列化装置を構成するコンピュータを、
    入力した前記逐次処理プログラムの制御フローを解析する制御フロー解析手段と、
    前記制御フロー解析手段による制御フローの解析結果を参照して、スケジュール対象となる領域を決定するスケジュール領域形成手段と、
    前記スケジュール領域形成手段によるスケジュール領域の決定を参照して、レジスタのデータフローを解析するレジスタデータフロー解析手段と、
    あるアドレスに読み書きを行う命令と、前記アドレスから読み書きを行う命令の間の依存を解析する命令間メモリデータフロー解析手段と、
    各スレッドの命令実行開始時刻の間隔と、実行命令数の制限の集合から制限を選ぶ命令実行開始・終了時刻制限選択手段と、
    各スレッドの命令実行開始時刻の制限に基づいて、命令を割り当て可能な時刻を解析するスレッド開始時刻制限解析手段と、
    各スレッドの実行命令数の制限に基づいて、ある命令について、その命令が属する依存命令列のうち最も遅い時刻に実行される命令と、その命令の実行時刻を推定するスレッド終了時刻制限解析手段と、
    プロセッサごとに、すでにスケジュールされた命令に占められていない時刻を解析する占有状況解析手段と、
    命令間の依存による遅延に基づいて、命令を割当て可能な時刻を解析する依存遅延解析手段と、
    次にスケジュールする命令を選択するスケジュール候補命令選択手段と、
    命令に対し実行するプロセッサと時刻を割り当てる命令配置手段と、
    スケジュール結果に対し、並列実行時間を測定あるいは推定する並列実行時間測定手段と、
    制限を変えてスケジュールを繰り返し、最良のスケジュールを決定する最良スケジュール決定手段と、
    前記最良のスケジュール決定結果を参照して、レジスタ割り当てを行うレジスタ割り当て手段と、
    前記レジスタ割り当て結果を参照して、並列化プログラムを生成し出力するプログラム出力手段と、
    として機能させることを特徴とするプログラム並列化プログラム。
  17. 前記スケジュール候補命令選択手段が、スケジュール候補の命令を先頭とする最長依存命令列に属する命令のそれぞれについて、実行されるスレッド番号と時刻を解析することを特徴とする請求項14から16のいずれか1項に記載のプログラム並列化プログラム。
  18. 前記命令実行開始・終了時刻制限選択手段が、全てのスレッドに対して開始時刻と終了時刻の差が一定で、開始時刻がスレッド番号とともに一定の増分で増えるような実行開始・終了時刻の制限のみを制限の集合とすることを特徴とする請求項14から16のいずれか1項に記載のプログラム並列化プログラム。
JP2009553440A 2008-02-15 2009-02-12 プログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラム Active JP5278336B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2009553440A JP5278336B2 (ja) 2008-02-15 2009-02-12 プログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラム

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
JP2008034614 2008-02-15
JP2008034614 2008-02-15
JP2009553440A JP5278336B2 (ja) 2008-02-15 2009-02-12 プログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラム
PCT/JP2009/052309 WO2009101976A1 (ja) 2008-02-15 2009-02-12 プログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラム

Publications (2)

Publication Number Publication Date
JPWO2009101976A1 JPWO2009101976A1 (ja) 2011-06-09
JP5278336B2 true JP5278336B2 (ja) 2013-09-04

Family

ID=40957006

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009553440A Active JP5278336B2 (ja) 2008-02-15 2009-02-12 プログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラム

Country Status (3)

Country Link
US (1) US20110067015A1 (ja)
JP (1) JP5278336B2 (ja)
WO (1) WO2009101976A1 (ja)

Families Citing this family (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10621092B2 (en) 2008-11-24 2020-04-14 Intel Corporation Merging level cache and data cache units having indicator bits related to speculative execution
US9672019B2 (en) 2008-11-24 2017-06-06 Intel Corporation Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
US9189233B2 (en) 2008-11-24 2015-11-17 Intel Corporation Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
US8230410B2 (en) * 2009-10-26 2012-07-24 International Business Machines Corporation Utilizing a bidding model in a microparallel processor architecture to allocate additional registers and execution units for short to intermediate stretches of code identified as opportunities for microparallelization
JP5148674B2 (ja) * 2010-09-27 2013-02-20 株式会社東芝 プログラム並列化装置およびプログラム
US9003383B2 (en) * 2011-09-15 2015-04-07 You Know Solutions, LLC Analytic engine to parallelize serial code
WO2013048468A1 (en) 2011-09-30 2013-04-04 Intel Corporation Instruction and logic to perform dynamic binary translation
KR101892273B1 (ko) * 2011-10-12 2018-08-28 삼성전자주식회사 스레드 프로그레스 트래킹 방법 및 장치
US9880842B2 (en) 2013-03-15 2018-01-30 Intel Corporation Using control flow data structures to direct and track instruction execution
US9891936B2 (en) 2013-09-27 2018-02-13 Intel Corporation Method and apparatus for page-level monitoring
JP6287018B2 (ja) * 2013-10-04 2018-03-07 富士通株式会社 可視化方法、表示方法、情報処理装置、可視化プログラム及び表示プログラム
WO2015107378A1 (en) * 2014-01-20 2015-07-23 Sony Corporation Parallelization method and system
JP6245031B2 (ja) * 2014-03-27 2017-12-13 富士通株式会社 コンパイルプログラム、コンパイル方法およびコンパイル装置
JP6369170B2 (ja) * 2014-07-02 2018-08-08 富士通株式会社 実行時間推定装置及び方法
US9583116B1 (en) * 2014-07-21 2017-02-28 Superpowered Inc. High-efficiency digital signal processing of streaming media
US10318261B2 (en) * 2014-11-24 2019-06-11 Mentor Graphics Corporation Execution of complex recursive algorithms
US9996354B2 (en) * 2015-01-09 2018-06-12 International Business Machines Corporation Instruction stream tracing of multi-threaded processors
DE102015103727A1 (de) * 2015-03-13 2016-09-15 Phoenix Contact Gmbh & Co. Kg Projektiergerät und Verfahren zum Konfigurieren und/oder Parametrieren von Automatisierungskomponenten eines Automatisierungssystems
US11112845B2 (en) * 2015-06-24 2021-09-07 National Taiwan University Probabilistic framework for compiler optimization with multithread power-gating controls
CN108595371B (zh) * 2016-01-20 2019-11-19 北京中科寒武纪科技有限公司 用于向量运算的数据读取、写入及读写调度器及保留站
US11567855B1 (en) * 2020-09-09 2023-01-31 Two Six Labs, LLC Automated fault injection testing
CN116010047B (zh) * 2022-12-12 2023-12-15 爱芯元智半导体(宁波)有限公司 线程调度方法、硬件电路及电子设备

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH03242731A (ja) * 1990-02-21 1991-10-29 Nec Corp コンパイル処理方式
JPH10187464A (ja) * 1996-12-16 1998-07-21 Internatl Business Mach Corp <Ibm> マルチスカラ・プログラムを作成する方法およびシステム
JP2003030050A (ja) * 2001-07-18 2003-01-31 Nec Corp マルチスレッド実行方法及び並列プロセッサシステム
JP2004302706A (ja) * 2003-03-31 2004-10-28 Nec Corp プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
JP2005018610A (ja) * 2003-06-27 2005-01-20 Toshiba Corp スケジューリング方法および情報処理システム

Family Cites Families (34)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2902402B2 (ja) * 1987-09-30 1999-06-07 三菱電機株式会社 データ処理装置
DE69123629T2 (de) * 1990-05-04 1997-06-12 Ibm Maschinenarchitektur für skalaren Verbundbefehlssatz
US5303356A (en) * 1990-05-04 1994-04-12 International Business Machines Corporation System for issuing instructions for parallel execution subsequent to branch into a group of member instructions with compoundability in dictation tag
US5655096A (en) * 1990-10-12 1997-08-05 Branigin; Michael H. Method and apparatus for dynamic scheduling of instructions to ensure sequentially coherent data in a processor employing out-of-order execution
US5630128A (en) * 1991-08-09 1997-05-13 International Business Machines Corporation Controlled scheduling of program threads in a multitasking operating system
WO1994027216A1 (en) * 1993-05-14 1994-11-24 Massachusetts Institute Of Technology Multiprocessor coupling system with integrated compile and run time scheduling for parallelism
EP0798633B1 (en) * 1996-03-29 2005-06-08 Matsushita Electric Industrial Co., Ltd. Data processor having a variable number of pipeline stages
US6625635B1 (en) * 1998-11-02 2003-09-23 International Business Machines Corporation Deterministic and preemptive thread scheduling and its use in debugging multithreaded applications
JP2000207223A (ja) * 1999-01-12 2000-07-28 Matsushita Electric Ind Co Ltd 並列処理向けのプログラム処理方法および装置、並びに並列処理向けのプログラム処理を実行するプログラムを記録した記録媒体および並列処理向けの命令列を記録した記録媒体
JP3641997B2 (ja) * 2000-03-30 2005-04-27 日本電気株式会社 プログラム変換装置及び方法並びに記録媒体
US7140022B2 (en) * 2000-06-02 2006-11-21 Honeywell International Inc. Method and apparatus for slack stealing with dynamic threads
JP3702814B2 (ja) * 2001-07-12 2005-10-05 日本電気株式会社 マルチスレッド実行方法及び並列プロセッサシステム
US7418703B2 (en) * 2002-03-20 2008-08-26 Nec Corporation Parallel processing system by OS for single processor
US20040015684A1 (en) * 2002-05-30 2004-01-22 International Business Machines Corporation Method, apparatus and computer program product for scheduling multiple threads for a processor
CN100395709C (zh) * 2003-02-20 2008-06-18 皇家飞利浦电子股份有限公司 一种用于指令转换的数据处理方法及其系统
EP1658563B1 (en) * 2003-08-28 2013-06-05 MIPS Technologies, Inc. Apparatus, and method for initiation of concurrent instruction streams in a multithreading microprocessor
JP4171910B2 (ja) * 2004-03-17 2008-10-29 日本電気株式会社 並列処理システム及び並列処理プログラム
JP3901181B2 (ja) * 2004-06-30 2007-04-04 日本電気株式会社 プログラム並列化装置及びその方法並びにプログラム
US7664936B2 (en) * 2005-02-04 2010-02-16 Mips Technologies, Inc. Prioritizing thread selection partly based on stall likelihood providing status information of instruction operand register usage at pipeline stages
US7627864B2 (en) * 2005-06-27 2009-12-01 Intel Corporation Mechanism to optimize speculative parallel threading
US20070011687A1 (en) * 2005-07-08 2007-01-11 Microsoft Corporation Inter-process message passing
US7539852B2 (en) * 2005-08-29 2009-05-26 Searete, Llc Processor resource management
US7627739B2 (en) * 2005-08-29 2009-12-01 Searete, Llc Optimization of a hardware resource shared by a multiprocessor
US7975059B2 (en) * 2005-11-15 2011-07-05 Microsoft Corporation Generic application level protocol analyzer
US7765536B2 (en) * 2005-12-21 2010-07-27 Management Services Group, Inc. System and method for the distribution of a program among cooperating processors
US8387033B2 (en) * 2005-12-21 2013-02-26 Management Services Group, Inc. System and method for the distribution of a program among cooperating processing elements
WO2007084700A2 (en) * 2006-01-19 2007-07-26 University Of Maryland Office Of Technology Commercialization System and method for thread handling in multithreaded parallel computing of nested threads
US20070234014A1 (en) * 2006-03-28 2007-10-04 Ryotaro Kobayashi Processor apparatus for executing instructions with local slack prediction of instructions and processing method therefor
US8032821B2 (en) * 2006-05-08 2011-10-04 Microsoft Corporation Multi-thread spreadsheet processing with dependency levels
US8595744B2 (en) * 2006-05-18 2013-11-26 Oracle America, Inc. Anticipatory helper thread based code execution
US8108872B1 (en) * 2006-10-23 2012-01-31 Nvidia Corporation Thread-type-based resource allocation in a multithreaded processor
GB2443277B (en) * 2006-10-24 2011-05-18 Advanced Risc Mach Ltd Performing diagnostics operations upon an asymmetric multiprocessor apparatus
US20100070958A1 (en) * 2007-01-25 2010-03-18 Nec Corporation Program parallelizing method and program parallelizing apparatus
US7937568B2 (en) * 2007-07-11 2011-05-03 International Business Machines Corporation Adaptive execution cycle control method for enhanced instruction throughput

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH03242731A (ja) * 1990-02-21 1991-10-29 Nec Corp コンパイル処理方式
JPH10187464A (ja) * 1996-12-16 1998-07-21 Internatl Business Mach Corp <Ibm> マルチスカラ・プログラムを作成する方法およびシステム
JP2003030050A (ja) * 2001-07-18 2003-01-31 Nec Corp マルチスレッド実行方法及び並列プロセッサシステム
JP2004302706A (ja) * 2003-03-31 2004-10-28 Nec Corp プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
JP2005018610A (ja) * 2003-06-27 2005-01-20 Toshiba Corp スケジューリング方法および情報処理システム

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
CSNG200100269006; 酒井淳嗣、鳥居 淳、近藤真己、市川成浩、小俣仁美、西 直樹、枝廣正人: '制御並列アーキテクチャ向け自動並列化コンパイル手法' 情報処理学会論文誌 第40巻,第5号, 19990515, p.2045〜2053, 社団法人情報処理学会 *
JPN6009015941; 酒井淳嗣、鳥居 淳、近藤真己、市川成浩、小俣仁美、西 直樹、枝廣正人: '制御並列アーキテクチャ向け自動並列化コンパイル手法' 情報処理学会論文誌 第40巻,第5号, 19990515, p.2045〜2053, 社団法人情報処理学会 *

Also Published As

Publication number Publication date
US20110067015A1 (en) 2011-03-17
JPWO2009101976A1 (ja) 2011-06-09
WO2009101976A1 (ja) 2009-08-20

Similar Documents

Publication Publication Date Title
JP5278336B2 (ja) プログラム並列化装置、プログラム並列化方法及びプログラム並列化プログラム
JP4957729B2 (ja) プログラム並列化方法、プログラム並列化装置及びプログラム
JP4042604B2 (ja) プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
JP5971334B2 (ja) タスク配置装置、タスク配置方法、および、コンピュータ・プログラム
Jeffrey et al. Data-centric execution of speculative parallel programs
KR20100089350A (ko) 재구성 가능 어레이의 스케줄러, 스케줄링 방법 및 이를 이용한 컴퓨팅 장치
EP3908920B1 (en) Optimizing hardware fifo instructions
US7058937B2 (en) Methods and systems for integrated scheduling and resource management for a compiler
US8869129B2 (en) Apparatus and method for scheduling instruction
US9354850B2 (en) Method and apparatus for instruction scheduling using software pipelining
US20150127926A1 (en) Instruction scheduling approach to improve processor performance
WO2022073346A1 (en) Devices, methods, and media for efficient data dependency management for in-order issue processors
KR20140109146A (ko) 재구성가능 아키텍처를 위한 스케줄러 및 스케줄링 방법
JP2016192152A (ja) 並列化コンパイル方法、並列化コンパイラ、及び車載装置
Zaki et al. Implementation, scheduling, and adaptation of partial expansion graphs on multicore platforms
JP5983623B2 (ja) タスク配置装置及びタスク配置方法
Arató et al. Time-constrained scheduling of large pipelined datapaths
Berson et al. GURRR: A global unified resource requirements representation
WO2021098105A1 (en) Method and apparatus for functional unit assignment
Saba et al. Anytime algorithms for gpu architectures
Castrillón Mazo et al. Parallel Code Flow
Briais et al. How to eliminate non-positive circuits in periodic scheduling: a proactive strategy based on shortest path equations
Mandal Complexity Analysis and Algorithms for Data Path Synthesis
BORDOLOI Interactive design space exploration of real-time embedded systems

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20120112

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20130423

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130506

R150 Certificate of patent or registration of utility model

Ref document number: 5278336

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150