JP3702815B2 - プロセッサ間レジスタ継承方法及びその装置 - Google Patents

プロセッサ間レジスタ継承方法及びその装置 Download PDF

Info

Publication number
JP3702815B2
JP3702815B2 JP2001212248A JP2001212248A JP3702815B2 JP 3702815 B2 JP3702815 B2 JP 3702815B2 JP 2001212248 A JP2001212248 A JP 2001212248A JP 2001212248 A JP2001212248 A JP 2001212248A JP 3702815 B2 JP3702815 B2 JP 3702815B2
Authority
JP
Japan
Prior art keywords
register
processor
thread
general
value
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.)
Expired - Fee Related
Application number
JP2001212248A
Other languages
English (en)
Other versions
JP2003029986A (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 JP2001212248A priority Critical patent/JP3702815B2/ja
Priority to US10/163,505 priority patent/US6907517B2/en
Priority to GB0216271A priority patent/GB2380293B/en
Publication of JP2003029986A publication Critical patent/JP2003029986A/ja
Application granted granted Critical
Publication of JP3702815B2 publication Critical patent/JP3702815B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3824Operand accessing
    • G06F9/3826Bypassing or forwarding of data results, e.g. locally between pipeline stages or within a pipeline stage
    • G06F9/3828Bypassing or forwarding of data results, e.g. locally between pipeline stages or within a pipeline stage with global bypass, e.g. between pipelines, between clusters
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/3009Thread control instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3824Operand accessing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3838Dependency mechanisms, e.g. register scoreboarding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming

Description

【0001】
【発明の属する技術分野】
本発明は単一のプログラムを複数のスレッドに分割して複数のプロセッサにより並列に実行する並列プロセッサシステムに関し、特にフォーク後に親スレッドで更新されたレジスタを子スレッドに継承する方法と装置に関する。
【0002】
【従来の技術】
単一のプログラムを並列プロセッサシステムで並列に処理する手法として、プログラムをスレッドと呼ぶ命令流に分割して複数のプロセッサで並列に実行するマルチスレッド実行方法があり、この方法を記載した文献として、特開平10−27108号公報(以下、文献1と称す)、「On−Chip Multiprocessor指向 制御並列アーキテクチャMUSCATの提案」(並列処理シンポジュウムJSPP97論文集、情報処理学会、pp.229−236、May 1997)(以下、文献2と称す)、特開平10−78880号公報(以下、文献3と称す)、「非数値計算プログラムのスレッド間命令レベル並列を利用するプロセッサ・アーキテクチャSKY」(並列処理シンポジウムJSPP98論文集、情報処理学会、pp.87−94、平成10年6月)(以下、文献4と称す)、「Multiscalar Processor」(G.S.Sohi,S.E.Breach and T.N.Vijaykumar, The22nd International Symposium on Computer Architecture,IEEE Computer SocietyPress,1995,ページ414−425)(以下、文献5と称す)等がある。以下、これらの文献に記載された従来の技術について説明する。
【0003】
一般にマルチスレッド実行方法において、他のプロセッサ上に新たなスレッドを生成することを、スレッドをフォーク(fork)すると言い、フォーク動作を行った側のスレッドを親スレッド、生成された新しいスレッドを子スレッド、スレッドをフォークする箇所をフォーク点、子スレッドの先頭箇所をフォーク先アドレスまたは子スレッドの開始点と呼ぶ。文献1〜4では、スレッドのフォークを指示するためにフォーク点にフォーク命令が挿入される。フォーク命令にはフォーク先アドレスが指定され、フォーク命令の実行によりそのフォーク先アドレスから始まる子スレッドが他プロセッサ上に生成され、子スレッドの実行が開始される。また、スレッドの処理を終了させるターム(term)命令と呼ばれる命令が用意されており、各プロセッサはターム命令を実行することによりスレッドの処理を終了する。
【0004】
図12にマルチスレッド実行方法の処理の概要を示す。同図(a)は3つのスレッドA、B、Cに分割された単一のプログラムを示す。このプログラムを単一のプロセッサで処理する場合、同図(b)に示すように1つのプロセッサPEがスレッドA、B、Cを順番に処理していく。これに対して文献1〜5のマルチスレッド実行方法では、同図(c)に示すように、1つのプロセッサPE1にスレッドAを実行させ、プロセッサPE1でスレッドAを実行している最中に、スレッドAに埋め込まれたフォーク命令によってスレッドBを他のプロセッサPE2に生成し、プロセッサPE2においてスレッドBを実行させる。また、プロセッサPE2はスレッドBに埋め込まれたフォーク命令によってスレッドCをプロセッサPE3に生成する。プロセッサPE1、PE2はそれぞれスレッドB、Cの開始点の直前に埋め込まれたターム命令によってスレッドの処理を終了し、プロセッサPE3はスレッドCの最後の命令を実行すると、その次の命令(一般にはシステムコール命令)を実行する。このように複数のプロセッサでスレッドを同時に並行して実行することにより、逐次処理に比べて性能の向上が図られる。
【0005】
従来の他のマルチスレッド実行方法として、図12(d)に示すように、スレッドAを実行しているプロセッサPE1からフォークを複数回行うことにより、プロセッサPE2にスレッドBを、またプロセッサPE3にスレッドCをそれぞれ生成するマルチスレッド実行方法も存在する。この図12(d)のモデルに対して、同図(c)に示したようにスレッドはその生存中に高々1回に限って有効な子スレッドを生成することができるという制約を課したマルチスレッド実行方法をフォーク1回モデルと呼ぶ。フォーク1回モデルでは、スレッド管理の大幅な簡略化が可能となり、現実的なハードウェア規模でスレッド管理部のハードウェア化が実現できる。また、個々のプロセッサは子スレッドを生成する他プロセッサが1プロセッサに限定されるため、隣接するプロセッサを単方向にリング状に接続した並列プロセッサシステムでマルチスレッド実行が可能となる。本発明はこのようなフォーク1回モデルを前提とする。
【0006】
子スレッドをフォークした場合、親スレッドから子スレッドへのレジスタ継承が必要になる。このレジスタ継承に関しては、一般に2通りの方式がある。1つは、文献1〜3の並列プロセッサシステムで採用されているように、親スレッドのフォーク時点のレジスタファイルの内容だけを継承対象とし、フォーク後に更新されたレジスタは継承しない方式であり、これを以下、フォーク時レジスタ転送方式と呼ぶ。もう1つは、文献4、5の並列プロセッサシステムで採用されているように、フォーク後に更新されたレジスタも継承対象とする方式である。これを以下、フォーク後レジスタ転送方式と呼ぶ。
【0007】
例えば図13(a)に示すように、レジスタr20の値を+1する命令1、関数funcを呼出す命令2、レジスタr20の値を+1する命令3、関数funcを呼出す命令4、レジスタr20の値を+1した値をレジスタr13に置く命令5が、その順に記述された逐次実行プログラムにおいて、命令5以降の命令流を子スレッドとして実行する場合、フォーク時レジスタ転送方式では、同図(b)に示すように子スレッドが参照するレジスタr20の値が確定する時点にフォーク命令を挿入する。
【0008】
他方、フォーク後レジスタ転送方式では、レジスタr20の確定値をフォーク後に子スレッドへ転送するため、レジスタr20の値が確定するのを待たずに子スレッドを先行してフォークすることができる。従って、例えば図13(c)に示すように命令1の直前にフォーク命令を挿入することができる。但し、このままでは子スレッド側で正依存(RAW;Read After Write)違反が生じるため、文献4及び5ではコンパイラによる静的な依存解析によって子スレッドで必要なレジスタ及びそのレジスタ値が確定する時点を検出し、転送すべきレジスタが定義ないし決定した直後にレジスタ転送命令を挿入するか(文献4)、命令コード中にレジスタ転送ビットを設け(文献5)、共に受信側では、確定したレジスタ値が受信されるまで命令の実行を待ち合わせている。
【0009】
マルチスレッド実行方法では、実行の確定した先行スレッドを並列に実行することを基本とするが、実際のプログラムでは実行の確定するスレッドが充分に得られない場合も多い。また、動的に決定される依存やコンパイラ解析能力の限界等により並列化率が低く抑えられ所望の性能が得られない可能性が生じる。このため文献1等では、制御投機を導入し、ハードウェア的にスレッドの投機実行をサポートしている。制御投機では、実行する可能性の高いスレッドを実行確定前に投機的に実行する。投機状態のスレッドは、実行の取り消しがハードウェア上可能である範囲内で仮実行を行う。子スレッドが仮実行を行っている状態を仮実行状態と言い、子スレッドが仮実行状態にあるとき親スレッドはスレッド仮生成状態にあると言う。仮実行状態の子スレッドでは共有メモリへの書き込みは抑制され、別途設けた仮実行用バッファ(temporary buffer)に対して書き込みが行われる。投機が正しいことが確定すると、親スレッドから子スレッドに対して投機成功通知が出され、子スレッドは仮実行用バッファの内容を共有メモリに反映し、仮実行用バッファを用いない通常の状態となる。また親スレッドはスレッド仮生成状態からスレッド生成状態となる。他方、投機が失敗したことが確定すると、親スレッドでスレッド破棄命令(abort)が実行され、子スレッド以下の実行がキャンセルされる。また、親スレッドはスレッド仮生成状態からスレッド未生成状態となり、再び子スレッドの生成が可能になる。つまり、フォーク1回モデルではスレッド生成は高々1回に限定されるが、制御投機を行い、投機が失敗した場合には再びフォークが可能となる。この場合においても、生成できる有効な子スレッドは高々1つである。
【0010】
その他、文献2に記載のMUSCATでは、スレッド間の同期命令など、スレッドの並列動作を柔軟に制御するための専用命令が数多く用意されている。
【0011】
【発明が解決しようとする課題】
前述したようにフォーク後レジスタ転送方式では、子スレッドで必要なレジスタの値が確定するのを待たずに先行して子スレッドをフォークすることができ、その分、フォーク時レジスタ転送方式に比べて命令実行の並列度が向上する。しかし、フォーク後に親スレッドで更新されたレジスタを子スレッドに継承するため、RAW違反が子スレッド側で生じないように制御する必要がある。この制御を、文献4及び5に記載された前述した方法で実現すると、不必要な同期が発生し、性能が低下する場合がある。その理由はRAW違反をコンパイラ時点の依存解析によって静的に解消しようとしており、且つ、子スレッドに継承すべきレジスタについて親スレッドと子スレッド間で必ず同期をとるようにしているためである。以下、具体例を挙げてこの問題点を説明する。
【0012】
今、図14(a)に示すように、レジスタr10の更新命令を含むブロックa、分岐命令b、レジスタr10の更新命令を含むブロックc、レジスタr10の参照命令を含むブロックdを有する逐次処理プログラムを想定し、ブロックaの直前でブロックdを子スレッドとしてフォークすることを考える。この場合、ブロックdでレジスタr10が参照されているため、親スレッドから子スレッドへレジスタr10の値を継承する必要がある。フォーク点以降、レジスタr10はブロックaとブロックcで更新されているが、ブロックcは分岐命令bの分岐成立時にのみ実行されるため、分岐成立時にはブロックcで更新されたレジスタr10の値を、また分岐不成立時にはブロックaで更新されたレジスタr10の値を、子スレッドへ継承する必要がある。文献5等による従来方法では、このような場合、図14(b)に示すように分岐成立、不成立が確定した箇所にレジスタr10の確定値を子スレッドへ転送する命令を挿入しなければならない。このため、実際のプログラム実行に際しては分岐命令bの分岐成功、不成功にかかわらず子スレッドのレジスタr10を参照する命令が長期間待たされることになる。分岐成立のときはブロックcで更新されたレジスタr10の値を参照するため、当該待ち合わせは致し方ないが、分岐不成立の場合はブロックaで更新されたレジスタr10の値がそのまま使えるため、当該待ち合わせは不必要な同期待ちと言える。
【0013】
本発明の目的は、フォーク後に親スレッドで更新されたレジスタを子スレッドに継承する新規な方法と装置を提供することにある。
【0014】
本発明の別の目的は、フォーク後レジスタ転送方式を採用する並列プロセッサシステムにおいて、RAW違反をコンパイル時点でなくプログラム実行時に動的に解消し得るようにすることにある。
【0015】
本発明の他の目的は、フォーク後レジスタ転送方式を採用する並列プロセッサシステムにおいて、RAW違反を解消するために不必要な待ち合わせが発生しないようにして性能の向上を図ることにある。
【0016】
【課題を解決するための手段】
第1の発明は、単一のプログラムを複数のスレッドに分割し複数のプロセッサで並列に実行する並列プロセッサシステムにおいてフォーク後に親スレッドで更新されたレジスタを子スレッドに継承する方法において、フォーク後、親スレッドの汎用レジスタ書き込み毎に更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信し、子スレッド側のプロセッサでは子スレッドを投機的に実行し、正依存の違反を検出すると再実行を行う。正依存の違反の検出は、具体的には、各プロセッサの汎用レジスタに1対1に対応し、スレッド開始時点で第1の状態を保持し、対応する汎用レジスタに対するスレッド開始後の最初のアクセスがリードの場合に第2の状態を保持し、対応する汎用レジスタに対するスレッド開始後の最初のアクセスがライトの場合に第3の状態を保持する状態レジスタを備え、レジスタ値が親スレッド側のプロセッサから送信された汎用レジスタに対応する状態レジスタが第2の状態を保持しているとき、正依存の違反が発生したと検出する。
【0017】
第2の発明は、第1の発明において、子スレッドへの転送停止、転送再開を制御する特殊命令によって操作されるマスクビットを汎用レジスタに1対1に対応して備え、フォーク後、親スレッドの汎用レジスタ書き込み毎に、書き込みの行われた汎用レジスタに対応するマスクビットが転送許可状態である場合に限って、更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信する。
【0018】
第3の発明は、第1の発明において、フォーク時点のスタックポインタの値を保存するスタックポインタ保存手段と、現在のスタックポインタの値と前記スタックポインタ保存手段に保存されたスタックポインタの値との一致を検出する検出手段とを備え、フォーク後、親スレッドの汎用レジスタ書き込み毎に、書き込みの行われた汎用レジスタが関数の返り値レジスタである場合、及び書き込みの行われた汎用レジスタが関数の返り値レジスタ以外のレジスタであって前記検出手段で一致が検出されている場合に限って、更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信する。
【0019】
第4の発明は、第1の発明において、各汎用レジスタに1対1に対応するストアアドレスレジスタを備え、ストア命令実行時に汎用レジスタ毎にストアアドレスを前記ストアアドレスレジスタに記憶し、汎用レジスタの内容切り替えを検出した際に当該汎用レジスタの子スレッドへの転送を禁止状態にすると共にストアアドレスレジスタへの書き込みを停止し、ロード時のアドレスをストアアドレスレジスタに記憶されたストアアドレスと比較することによって汎用レジスタの内容が元に戻ったことを検出して、当該汎用レジスタの子スレッドへの転送禁止状態を解除する。
【0020】
第5の発明は、第1乃至第4の発明において、更新後の汎用レジスタの値が更新前と異なる場合に限って、更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信する。
【0021】
【作用】
第1の発明にあっては、フォーク後、親スレッドの汎用レジスタ書き込み毎に更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信し、子スレッド側のプロセッサでは子スレッドを投機的に実行し、RAW違反を検出すると再実行を行うことにより、RAW違反をコンパイル時点でなくプログラム実行時に動的に解消し、且つRAW違反を解消するために不必要な待ち合わせが発生しないようにする。
【0022】
第1の発明の作用を従来の技術の説明で用いた図14(a)の逐次処理プログラムを例に以下説明する。ブロックaの直前でブロックdを子スレッドとしてフォークする場合、第1の発明では、子スレッド側のプロセッサはブロックdから子スレッドを投機的に実行する。他方、親スレッド側のプロセッサは、フォーク後、ブロックaでレジスタr10が更新されると、その値を子スレッド側に転送し、また分岐命令bの分岐が成立してブロックcを実行した場合、ブロックcで更新されたレジスタr10の値を再び子スレッド側に転送する。投機的に実行を開始した子スレッドがRAW違反によって再実行するか否かは、親スレッドにおける分岐命令bの分岐の成否および親スレッドにおけるレジスタr10の更新、転送のタイミングと子スレッドにおけるレジスタr10の参照のタイミングによって決まる。図1に幾つかの実行シーケンス例を示す。
【0023】
図1(a)は、分岐命令bの分岐が不成立で、且つ子スレッド側のプロセッサ#1がブロックdのレジスタr10の参照命令を、親スレッド側のプロセッサ#0からブロックaで更新されたレジスタr10の値を受信した後に実行した場合のシーケンスを示す。この場合、RAW違反は発生せず、子スレッドの再実行はない。図1(b)は、分岐命令bの分岐が不成立である点は図1(a)と同じであるが、親スレッド側のプロセッサ#0からブロックaで更新されたレジスタr10の値を受信する前に、子スレッド側のプロセッサ#1がブロックdのレジスタr10の参照命令を実行した点が相違しており、この場合、RAW違反が発生し、子スレッドの再実行が行われる。他方、図1(c)は、分岐命令bの分岐が成立した場合の実行シーケンス例を示し、親スレッドのブロックcで更新されたレジスタr10の値を受信した時点でRAWが検出され、子スレッドが再実行されている。
【0024】
これらの実行シーケンスを図14(b)に示した従来方法と比較すると、図14(b)ではブロックcの直後にレジスタr10を子スレッドに転送する命令が挿入されているため、この転送のタイミングは図1(c)におけるブロックcで更新されたレジスタr10の転送タイミングとほぼ近い。従来方法は、このタイミングでブロックdのレジスタr10の参照命令の実行が初めて開始される。従って、本発明によれば、分岐命令bの分岐が成立する状況下においても従来方法にほぼ近い性能を確保しながら、分岐不成立時には図1(a)及び(b)に示す如く従来方法に比べて子スレッドの処理を格段に早めることができる。
【0025】
また第1の発明では、フォーク後、親スレッドでレジスタが更新されると、必ずそのレジスタの値を子スレッド側のプロセッサに転送するため、従来方法におけるようなレジスタ転送命令などの付加情報を並列化プログラム中に挿入する必要がなく、またコンパイラによる静的な依存解析が必ずしも必要でないという利点も有する。
【0026】
他方、レジスタの更新時に常に転送を行うと却って性能が低下する場合もある。例えば、汎用レジスタはその個数に限りがあるため、使える汎用レジスタが無くなったときに使用中の汎用レジスタの値をメモリに退避して当該汎用レジスタを別の目的で使用し、その使用を終えるとメモリに退避してあるレジスタ値を当該汎用レジスタに復帰する操作が行われる。この操作は汎用レジスタの内容切り替えと呼ばれているが、この内容切り替えが親スレッドで実行されると第1の発明では転送の必要のないレジスタ値も転送されてしまい、子スレッド側でRAW違反による無駄な再実行が起こってしまう。また、レジスタが前回と同じ値に更新された場合、子スレッドへの転送は本来不要であるが、第1の発明ではレジスタ転送が実行され、子スレッド側でRAW違反による無駄な再実行が起こってしまう。第2乃至第4の発明では、汎用レジスタの内容切り替えに伴う無用なレジスタ転送を回避し、第5の発明では、レジスタが前回と同じ値に更新された場合の無用なレジスタ転送を回避する。
【0027】
【発明の実施の形態】
次に本発明の実施の形態の例について図面を参照して詳細に説明する。
【0028】
【第1の実施の形態】
図2を参照すると、本発明を適用した並列プロセッサシステムの一例は、4スレッド並列実行型プロセッサであり、4個のプロセッサ1−i(i=0〜3)が信号線2−iによってスレッド管理部3に接続されると共に、信号線4−iによって共有のメモリ5に接続されている。また、隣接するプロセッサ同士が通信バス6−0〜6−3によって単方向にリング状に接続されている。この例では、4スレッド並列実行型プロセッサを取り上げたが、8スレッドや16スレッドの並列実行型プロセッサ等、一般にn(≧2)スレッド並列実行型プロセッサに対して本発明は適用可能である。
【0029】
各プロセッサ1−iは、プログラムカウンタ(以下、PCと称す)及びレジスタファイルを独立に有し、PCに従って、メモリ5中のスレッドの命令を同時にフェッチ、解釈、実行する機能を有している。また、各プロセッサ1−iは、スレッド実行の取り消し(キャンセル)が可能なように仮実行用バッファ(temporary buffer)を有している。各プロセッサ1−iは、スレッド管理部3から信号線2−iを通じてターゲットPC値を伴うスレッド開始要求7cが送信された時点で、仮実行用バッファを使ってスレッドの実行を仮実行状態で開始する。この時点でスレッド管理部3において当該プロセッサ1−iはビジー状態として管理される。スレッドの実行を終了するプロセッサ1−iは、スレッド管理部3に対して信号線2−iを通じてスレッド終了通知7dを送信する。このスレッド終了通知7dは、通知元のプロセッサ1−iが最古親スレッドを実行していることを条件にスレッド管理部3で受理され、当該プロセッサ1−iはフリー状態として管理され、プロセッサ1−iにスレッド終了許可7eが返却される。プロセッサ1−iはスレッド終了許可7eを受信した時点で仮実行状態を解き、仮実行用バッファの内容を共有のメモリ5に反映させ、スレッドの実行を終える。
【0030】
各プロセッサ1−iは、実行中の親スレッドに存在するフォーク命令によって隣接する一方のプロセッサ1−j(i≠j)(プロセッサ1−0はプロセッサ1−1、プロセッサ1−1はプロセッサ1−2、プロセッサ1−2はプロセッサ1−3、プロセッサ1−3はプロセッサ1−0)に子スレッドをフォークすることができる。各プロセッサ1−iは、子スレッドのフォークを行う際、信号線2−iを通じてスレッド管理部3に対し、子スレッドのフォーク先アドレス(開始PC値)を伴うフォーク要求7aを送信する。スレッド管理部3は、フォーク要求7aを受信すると、隣接プロセッサの状態に基づいて、隣接する他プロセッサ1−jに対するフォークが可能か否かを判定し、可能ならば当該プロセッサ1−jに対してフォーク先アドレスを伴うスレッド開始要求7cを送信する一方、フォーク要求元のプロセッサ1−iに対しては、フォーク応答7bを返却する。フォーク応答7bを受信したプロセッサ1−iは、通信バス6−iを通じてフォーク先プロセッサ1−jに親スレッドのレジスタの値を転送するレジスタ継承を行い、スレッド開始要求7cを受信したプロセッサ1−jは、フォーク先アドレスから子スレッドの実行を投機的に開始する。
【0031】
図3に各々のプロセッサ1−iの要部ブロック図を示す。図3において、制御ユニット11は、PCや、PCに従ってメモリ5からスレッドの命令をフェッチする命令フェッチユニットや、フェッチされた命令をデコードし、実行する実行ユニットを含んでいる。レジスタファイル13は汎用レジスタ12−0〜12−mの集合であり、ユニット11からレジスタリードバス14及びレジスタリード信号16によってリードでき、レジスタライトバス15及びレジスタライト信号17によってライトできる。レジスタリードバス14は読み出し値を転送するバス、レジスタライトバス15は書き込み値を転送するバスであり、レジスタリード信号16は読み出し対象とする汎用レジスタのレジスタ番号を、レジスタライト信号17は書き込み対象とする汎用レジスタのレジスタ番号をそれぞれ示す。つまり、ユニット11は、汎用レジスタ12−k(k=0〜m)のアクセス時、リードのときは汎用レジスタ12−kのレジスタ番号をレジスタリード信号16として出力し、ライトのときは汎用レジスタ12−kのレジスタ番号をレジスタライト信号17として出力する。仮実行用バッファ18は、バス19を通じてユニット11に接続されており、ユニット11はこの仮実行用バッファ18を使ってスレッドの仮実行(投機実行)を行う。
【0032】
ステータスレジスタ20−kは、汎用レジスタ12−kに1対1に対応しており、レジスタリード信号16及びレジスタライト信号17が入力されている。各ステータスレジスタ20−kの初期状態はクリーン状態であり、レジスタリード信号16のレジスタ番号が自レジスタに対応する汎用レジスタ12−kを示す場合、現在の状態がクリーン状態であればリード状態に遷移し、それ以外は現状態を維持し、レジスタライト信号17のレジスタ番号が自レジスタに対応する汎用レジスタ12−kを示す場合、現在の状態がクリーン状態であればローカルストア状態に遷移し、それ以外は現状態を維持する。各ステータスレジスタ20−kの状態遷移を図4に示す。各ステータスレジスタ20−kは、当該プロセッサにおけるスレッド開始時にクリーン状態にあり、スレッド実行開始後、対応する汎用レジスタ12−kに対するユニット11からの最初のアクセスが読み出しの場合はリード状態に遷移し、最初のアクセスが書き込みの場合は変数定義から始まったことを表すローカルストア状態に遷移する。共に、その後にリード、ライトが行われても、リード状態、ローカルストア状態を維持する。
【0033】
通信バス21は、フォーク先プロセッサに対してレジスタ継承を行うためのバスであり、ユニット11がレジスタライトバス15に出力する書き込み値22とレジスタライト信号17に出力するレジスタ番号23とを転送する。通信バス24は、フォーク元プロセッサからレジスタ継承を受けるためのバスであり、レジスタへの書き込み値25とレジスタ番号26とを転送する。汎用レジスタ12−0〜12−mのうち、レジスタ番号26と同じレジスタ番号の汎用レジスタが書き込み値25で書き換えられる。通信バス24は、フォーク元プロセッサにおいては通信バス21に相当する。通信バス21、24は図2の通信バス6−0〜6−3に対応する。
【0034】
RAW検出回路27は、ステータスレジスタ20−0〜20−mの状態と、フォーク元プロセッサから通信バス24に出されたレジスタ番号26とから、RAW違反を検出する検出回路である。ステータスレジスタ20−0〜20−mのうち、レジスタ番号26が示すステータスレジスタの状態がリード状態であれば、RAW違反が発生したと検出する。RAW検出回路27は、RAW違反を検出すると、キャンセル信号28を仮実行用バッファ18に出力し、仮実行用バッファ18の内容を全てキャンセルする。キャンセル信号28はユニット11にも通知されており、ユニット11は実行中のスレッドをキャンセルし、その開始点よりリスタートする。このリスタート時、ステータスレジスタ20−kは全てクリーン状態に戻される。なお、従来の制御投機等と同様に、キャンセルされたスレッドが子スレッドをフォークしていた場合、子スレッド以下のスレッドもキャンセルされる。
【0035】
次に、フォーク後に親スレッドで更新されたレジスタを子スレッドに継承する動作を親スレッド側のプロセッサと子スレッド側のプロセッサに分けて、図3を参照して説明する。
【0036】
(1)親スレッド側のプロセッサ
ユニット11は、子スレッドをフォークすると、そのフォーク後、レジスタライトバス15を介して何れかの汎用レジスタ12−kを更新する際に、そのレジスタ番号23をレジスタライト信号17として出力する。通信バス21は、レジスタライトバス15に出力された書き込み値22とレジスタライト信号17に出力されたレジスタ番号23を、子スレッドをフォークしたプロセッサに向けて送信する。
【0037】
(2)子スレッド側のプロセッサ
ユニット11は、信号線2−iを通じてスレッド管理部3からスレッド開始要求7cを受信すると、全てのステータスレジスタ20−kをクリーン状態に初期化し、仮実行用バッファ18を使って、スレッド開始要求7cで指定されたスレッドの開始点から汎用レジスタに関して投機的にスレッドを実行する。実行の過程で何れかの汎用レジスタ12−kに対するアクセスが必要になると、リードの場合はレジスタリードバス14を通じてアクセスし、リードした汎用レジスタの番号をレジスタリード信号16に出力する。また、ライトの場合はレジスタライトバス15を通じてアクセスし、ライトした汎用レジスタの番号をレジスタライト信号17に出力する。
【0038】
各ステータスレジスタ20−kは、対応する汎用レジスタ12−kに対する最初のアクセスがリードの場合はリード状態に遷移し、最初のアクセスがライトの場合はローカルストア状態に遷移する。また、通信バス24経由で親スレッド側のプロセッサから書き込み値25とレジスタ番号26が送信されてくると、汎用レジスタ12−0〜12−mのうち、レジスタ番号26に対応する汎用レジスタが書き込み値25で書き換えられる。若し、今回更新された汎用レジスタ12−kに対応するステータスレジスタ20−kがリード状態であれば、RAW検出回路27はRAW違反を検出し、キャンセル信号28を出力する。これにより、仮実行用バッファ18がクリアされ、ユニット11は実行中のスレッドをキャンセルし、スレッドの開始点から当該スレッドを再び投機的に実行する。このとき全てのステータスレジスタ20−kはクリーン状態に初期化される。
【0039】
ユニット11は、スレッドをその最後の命令まで投機的に実行すると、スレッド管理部3に対して信号線2−iを通じてスレッド終了通知7dを送信し、スレッド終了許可7eをスレッド管理部3から受信した時点で、仮実行用バッファ18の内容を共有のメモリ5に反映させ、スレッドの実行を終える。
【0040】
【第2の実施の形態】
本実施の形態は、子スレッドへのレジスタ転送の停止、再開を制御する特殊命令を用意し、フォーク後の親スレッドの汎用レジスタ書き込み時、転送許可状態にある汎用レジスタだけを子スレッド側のプロセッサへ送信するようにした点で第1の実施の形態と相違する。以下、第1の実施の形態との相違点を中心に本実施の形態を説明する。
【0041】
図5を参照すると、本実施の形態における並列プロセッサシステムの各々のプロセッサ1−iは、図3に示した構成に加えて、汎用レジスタ12−kに1対1に対応するマスクビット31−kと、レジスタライト信号17が示すレジスタ番号23の汎用レジスタ12−kに対応するマスクビット31−kが転送許可状態にある場合に限って、今回書き込みの行われた汎用レジスタのレジスタ番号23を通信バス21に出力するゲート回路32とを備えている。マスクビット31−kは、スレッドの開始時点で転送許可状態(例えば“1”)にあり、ユニット11で実行される特殊命令により更新バス33上に出力される制御信号によって転送禁止状態(例えば“0”)に更新され、または再び転送許可状態に戻される。
【0042】
上記の特殊命令を、本実施の形態では、propagate命令(略して、prop命令)と呼ぶ。prop命令は、転送停止用と転送再開用の2種類があり、並列化プログラム中に以下のような形式で挿入される。
prop !r20 …(a)
prop r20 …(b)
【0043】
prop命令aは、この命令以降、レジスタr20の子スレッドへの転送を停止する命令である。prop命令bは、この命令以降、レジスタr20の子スレッドへの転送を再開する命令である。
【0044】
図6(a)に、prop命令を挿入する前の並列化プログラムの例を示す。このプログラムでは関数func内でレジスタr20に関して内容切り替えが行われている。この関数func内のレジスタr20の書き込みは真の依存ではないが、第1の実施の形態では内容切り替えに伴うレジスタr20の更新時にレジスタr20の値が子スレッド側に転送されるためRAW違反検出による再実行が起こってしまう。
【0045】
図6(b)に、prop命令を挿入した並列化プログラムの例を示す。関数funcの呼び出し前後でprop命令によりレジスタr20の転送を停止、再開することによって、無駄な転送およびRAW違反検出による再実行を防止している。
【0046】
次に、図6(b)のプログラムを例に本実施の形態の動作を説明する。なお、子スレッド側のプロセッサの動作は第1の実施の形態と同じなので、親スレッド側のプロセッサの動作だけを説明する。
【0047】
ユニット11は、フォーク命令「fork th1」によって子スレッドをフォークする。次のレジスタr20の更新を含む命令「add r20,r20,1」をユニット11が実行したとき、レジスタr20に対応するマスクビット31−kは転送許可状態の初期状態にあるため、更新後のレジスタr20の値がレジスタ番号と共に通信バス21経由で子スレッド側のプロセッサに送信される。次の命令はprop命令aであり、レジスタr20に対応するマスクビット31−kが転送禁止状態に設定される。従って、関数funcが呼び出され、その中でレジスタr20の更新を含む命令「move r20,r0」、「lw r20,20(sp)」等がユニット11で実行されても、レジスタr20は転送されない。関数funcの呼び出し命令の直後の命令はprop命令bであり、レジスタr20に対応するマスクビット31−kが転送許可状態に戻される。従って、次にレジスタr20の更新を含む命令「add r20,r20,1」をユニット11が実行すると、更新後のレジスタr20の値が子スレッド側のプロセッサへ転送される。以下、図6(b)のプログラムでは、次の関数funcの呼び出し前にprop命令aによってレジスタr20の転送が再び禁止されている。
【0048】
【第3の実施の形態】
本実施の形態は、汎用レジスタの内容切り替えのほとんどが関数呼び出しに因るものである点に着目し、親スレッド側プロセッサはフォーク時にスタックポインタ(SP)の値を保存しておき、フォーク後に汎用レジスタの更新があった時、更新された汎用レジスタが関数の返り値レジスタである場合を除き、現在のスタックポインタの値と保存してあったスタックポインタの値が等しいときのみ更新後の汎用レジスタの値を子スレッド側プロセッサへ転送するようにした点で第1の実施の形態と相違する。以下、第1の実施の形態との相違点を中心に本実施の形態を説明する。
【0049】
図7を参照すると、本実施の形態における並列プロセッサシステムの各々のプロセッサ1−iは、図3に示した構成に加えて、フォーク時点のスタックポインタ(SP)の値を保存するシャドウスタックポインタ41と、現在のスタックポインタ(SP)の値とシャドウスタックポインタ41の値の一致を検出する比較回路42と、この比較回路42が一致を検出したときに限ってレジスタライト信号17が示すレジスタ番号23を通信バス21に出力するゲート回路43と、書き込みの行われた汎用レジスタが関数の返り値レジスタである場合には、比較回路42の一致、不一致にかかわらず当該返り値レジスタのレジスタ番号23を通信バス21に出力する返り値レジスタライト信号線44とを備えている。
【0050】
次に、本実施の形態の動作を説明する。なお、子スレッド側のプロセッサの動作は第1の実施の形態と同じなので、親スレッド側のプロセッサの動作だけを説明する。
【0051】
ユニット11は、子スレッドをフォークすると、シャドウスタックポインタ41にフォーク信号45を出力することにより、レジスタファイル13中の汎用レジスタの1つであるスタックポインタ(SP)の値を信号線46経由でシャドウスタックポインタ41に保存する。その後、シャドウスタックポインタ41に保存されたスタックポインタの値は、比較回路42において、信号線46経由で読み出されているスタックポインタ(SP)の値と比較され、一致、不一致の信号がゲート回路43に出力される。
【0052】
ユニット11は、子スレッドのフォーク後、レジスタライトバス15を介して何れかの汎用レジスタ12−kを更新する毎に、そのレジスタ番号をレジスタライト信号17として出力する。また、書き込みの行われた汎用レジスタが関数の返り値レジスタである場合には、返り値レジスタの番号を返り値レジスタライト信号線44に出力する。関数の返り値レジスタは、コンピュータのアーキテクチャ、コンパイラなどにより事前に決まっている。若し、書き込みの行われた汎用レジスタが関数の返り値レジスタである場合、返り値レジスタライト信号線44上のレジスタ番号23とレジスタライトバス15上の書き込み値22とが通信バス22によって子スレッド側プロセッサへ転送される。また、書き込みの行われた汎用レジスタが関数の返り値レジスタ以外の場合、比較回路42において、現在のスタックポインタ(SP)とシャドウスタックポインタ41に保存されているスタックポインタ値とが一致している場合に限って、レジスタライト信号17のレジスタ番号23がゲート回路43を通過し、書き込み値22と共に通信バス22によって子スレッド側プロセッサへ転送される。
【0053】
例えば図6(a)に示したプログラムの場合、フォーク命令「fork th1」によって子スレッドをフォークした時点のスタックポインタ(SP)の値が信号線46経由でシャドウスタックポインタ41に保存され、次のレジスタr20の更新を含む命令「add r20,r20,1」の時点では、現在のスタックポインタ(SP)の値がシャドウスタックポインタ41に保存された値と一致するので、更新後のレジスタr20の値がレジスタ番号と共に通信バス21経由で子スレッド側のプロセッサに送信される。次の関数呼出し命令によって関数funcが呼び出され、スタックポインタ(SP)が更新されると、シャドウスタックポインタ41に保存された値と相違することになり、レジスタr20の更新を含む命令「move r20,r0」、「lw r20,20(sp)」等がユニット11で実行されても、レジスタr20は転送されない。その後、スタックポインタ(SP)が元の値に復帰し、関数funcの処理が終了すると、スタックポインタ(SP)の値がシャドウスタックポインタ41の値と等しくなるので、次にレジスタr20の更新を含む命令「add r20,r20,1」をユニット11が実行すると、更新後のレジスタr20の値が子スレッド側のプロセッサへ転送される。
【0054】
【第4の実施の形態】
本実施の形態は、汎用レジスタの内容切り替えはメモリ(特にスタック領域)へのストア、ロードを伴う場合が多いこと、内容切り替えが起こったということは、「レジスタを参照することなしに当該レジスタにデータを書き込む命令」を検出することで付加情報無しで判断可能である点に着目し、各汎用レジスタに1対1に対応するストアアドレスレジスタを設け、ストア命令実行時に汎用レジスタ毎のストアアドレスを対応するストアアドレスレジスタに記憶しておき、汎用レジスタの内容切り替えを検出した際に当該汎用レジスタの子スレッドへの転送を禁止状態にすると共にストアアドレスレジスタへの書き込みを停止し、他方、ロード時のアドレスをストアアドレスレジスタに記憶されたストアアドレスと比較することによって汎用レジスタの内容が元に戻ったか否かを判断して、子スレッドへの転送禁止状態を解除するようにした点で第1の実施の形態と相違する。以下、第1の実施の形態との相違点を中心に本実施の形態を説明する。
【0055】
図8を参照すると、本実施の形態における並列プロセッサシステムの各々のプロセッサ1−iは、図3に示した構成に加えて、汎用レジスタ12−kに1対1に対応するストアアドレスレジスタ51−k及びマスクビット52−kと、レジスタライト信号17が示すレジスタ番号23の汎用レジスタ12−kに対応するマスクビット52−kが転送許可状態(例えば“1”)にある場合に限って、今回更新されたレジスタ番号23を通信バス21に出力するゲート回路53と、ユニット11から信号線54及びタイミング調整用のディレイ59を通じて出力されるロードアドレスに一致するストアアドレスがストアアドレスレジスタ51−kに記録されているか否かを検出する比較回路55とを備えている。
【0056】
各ストアアドレスレジスタ51−kには、レジスタライト信号17が示すレジスタ番号23と信号線56を通じてユニット11から出力されるストアアドレスとが入力されており、レジスタ番号23に対応するストアアドレスレジスタ51−kに信号線56上のストアアドレスが記録される。但し、対応するマスクビット52−kが転送禁止状態(例えば“0”)に設定されている場合、新たなストアアドレスの記録は行われない。各ストアアドレスレジスタ51−kに記録されたストアアドレスは、参照バス58を介して比較回路55から参照可能になっている。
【0057】
各マスクビット52−kは、ユニット11から更新バス57を通じて転送許可状態、転送禁止状態に設定でき、また比較回路55の出力によって転送許可状態に設定することができる。各マスクビット52−kの出力はゲート回路53及び対応するストアアドレスレジスタ51−kに出力される。
【0058】
次に、本実施の形態の動作を説明する。なお、子スレッド側のプロセッサの動作は第1の実施の形態と同じなので、親スレッド側のプロセッサの動作だけを説明する。
【0059】
ユニット11は、子スレッドのフォーク時点で、更新バス57を通じて全てのマスクビット52−kを転送許可状態に初期設定する。その後、汎用レジスタ12−kのリードを含むストア命令の実行時、レジスタリード信号16に汎用レジスタ12−kのレジスタ番号を出力すると共に信号線56にそのストアアドレスを出力し、汎用レジスタ12−kに対応するストアアドレスレジスタ51−kにストアアドレスを記録する。また、汎用レジスタ12−kについてその値を参照することなしにデータを書き込むムーブ命令などの命令の実行時、汎用レジスタ12−kの内容切り替えが起こったものと判断し、更新バス57を通じて汎用レジスタ12−kに対応するマスクビット52−kを転送禁止状態に設定する。従って、汎用レジスタ12−kが更新されても、その値は子スレッドへは転送されなくなる。
【0060】
その後、汎用レジスタ12−kの内容を元の値に戻すためにユニット11でロード命令が実行されると、ユニット11からそのロードアドレスがディレイ59で例えば1命令サイクルだけ遅延されて比較回路55に出力される。比較回路55は、出力されたロードアドレスに一致するストアアドレスがストアアドレスレジスタ51−kに記録されているか否かを判断し、記録されていれば、マスクビット52−kを転送禁止状態から転送許可状態に変更する。これにより、汎用レジスタ12−kが更新されると、その更新値が子スレッドへ再び転送されるようになる。
【0061】
例えば図6(a)に示したプログラムの場合、フォーク命令「fork th1」によって子スレッドをフォークした時点で全てのマスクビット52−kが転送許可状態に設定される。従って、次のレジスタr20の更新を含む命令「add r20,r20,1」の時点では、更新後のレジスタr20の値がレジスタ番号と共に通信バス21経由で子スレッド側のプロセッサに送信される。次の関数呼出し命令によって関数funcが呼び出され、ストア命令「sw r20,20(sp)」が実行されると、レジスタr20に対応するストアアドレスレジスタ51−kにストアアドレスが記録される。そして、move命令「r20,r0」の実行時、レジスタr20の内容切り替えが起こったことがユニット11で検出され、レジスタr20に対応するマスクビット52−kが転送禁止状態に変更される。このため、レジスタr20の更新後の値は子スレッドへは転送されない。次のロード命令「lw r20,20(sp)」の場合も同様である。そして、このロード命令の実行時にユニット11から信号線54に出されるロードアドレスがレジスタr20に対応するストアアドレスレジスタ51−kに記録されているストアアドレスと一致することが比較回路55で検出され、レジスタr20に対応するマスクビット52−kが転送許可状態に戻される。従って、関数funcの処理が終了し、次にレジスタr20の更新を含む命令「add r20,r20,1」をユニット11が実行すると、更新後のレジスタr20の値が子スレッド側のプロセッサへ転送されることになる。
【0062】
【第5の実施の形態】
第1乃至第4の実施の形態では、更新後の汎用レジスタの値が更新前と異なる値であるかどうかに関係なく、更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信した。しかし、汎用レジスタへの書き込み値が直前の値と同じ場合は送信しなくて良い。本実施の形態では、汎用レジスタへの書き込み時に書き込み前の値と比較することによって無駄なレジスタ送信量を削減し、子スレッド側での無駄なRAW違反検出による再実行を防止する。以下、第1の実施の形態との相違点を中心に本実施の形態を説明する。
【0063】
図9を参照すると、本実施の形態における並列プロセッサシステムの各々のプロセッサ1−iは、図3に示した構成に加えて、汎用レジスタ12−0〜12−mのうちユニット11がレジスタライト信号17に出力したレジスタ番号23の汎用レジスタ12−kの書き込み前の内容をレジスタリードバス61を通じて参照し、この書き込み前のレジスタ値とレジスタライトバス15に出力された書き込み値22との一致を検出する比較回路62と、比較回路62の出力を反転するインバータ63と、インバータ63の出力とレジスタライト信号17に出力されたレジスタ番号23とを入力し、比較回路62で書き込み前後のレジスタ値の一致が検出された場合に限って、レジスタ番号23を通信バス21に出力するゲート回路64とを備えている。
【0064】
次に、本実施の形態の動作を説明する。なお、子スレッド側のプロセッサの動作は第1の実施の形態と同じなので、親スレッド側のプロセッサの動作だけを説明する。
【0065】
ユニット11は、子スレッドをフォークすると、そのフォーク後、レジスタライトバス15を介して何れかの汎用レジスタ12−kを更新する際に、そのレジスタ番号23をレジスタライト信号17として出力する。比較回路62は、レジスタライト信号17のレジスタ番号23に従って同じレジスタ番号を持つ汎用レジスタ12−kの書き込み前のレジスタ値を読み出し、ユニット11がレジスタライトバス15に出力した書き込み値22と比較し、一致した場合にはその出力を“0”にし、インバータ63を通じてゲート回路64を開く。一致しない場合、比較回路62の出力は“1”のままであり、ゲート回路64は閉じている。従って、汎用レジスタ12−kの書き込み値22が更新前の値と同じである場合に限って、通信バス21は、書き込み値22とレジスタ番号23をフォーク先プロセッサに向けて送信する。
【0066】
以上は、第1の実施の形態に対して適用したが、第2乃至第4の実施の形態においても同様に、更新前後のレジスタ値が一致する場合に限ってフォーク先プロセッサへレジスタ値を転送するように構成することができる。
【0067】
以上の各実施の形態では、フォーク後に親スレッドで更新されないが子スレッド側で必要となるレジスタの継承方法に関しては特に言及しなかった。本発明では、これらのレジスタの継承に関しては、文献1乃至3に記載されるようにフォーク点の親レジスタのレジスタファイルの全内容を子スレッドへ一括に転送する方法を使用しても良いし、子スレッドで必要なレジスタがコンパイラの静的解析によって判明しているのであればフォーク点の親レジスタのレジスタファイルの内、少なくとも子スレッドで必要なレジスタの値を転送するようにしても良い。更に、フォーク点における親スレッドのレジスタファイルの内容をレジスタ単位で順次に転送しながら、一度転送したレジスタが親スレッドで更新されたら再転送を行うような方法など任意の方法を採用することもできる。本発明は、フォーク後に親スレッドで更新されないが子スレッド側で必要となるレジスタの継承方法については任意の方法を採用することができるが、以下、幾つかの実施の形態を挙げておく。
【0068】
【第6の実施の形態】
図10を参照すると、本実施の形態における並列プロセッサシステムの各々のプロセッサ1−iは、図3に示した構成に加えて、子スレッドをフォークした旨の通知を信号線71を通じてユニット11から受けることにより参照バス72を介して汎用レジスタ12−0〜12−mの内容を順次に読み出し、その書き込み値及びレジスタ番号を通信バス21に出力し、全ての汎用レジスタ12−0〜12−mの転送を終えると信号線71を通じてユニット11にその旨通知するシーケンサ73を備えている。ユニット11は、シーケンサ73から転送終了が通知されると、フォーク命令の次の命令の実行を開始する。なお、コンパイラの静的解析によって子スレッドに継承すべきレジスタが判明している場合、その情報を信号線71を通じてシーケンサ73に伝えることにより、子スレッドに継承すべきレジスタの内容だけを転送することもできる。
【0069】
本実施の形態では、シーケンサ73は、フォーク後に親スレッドで更新されたレジスタを子スレッドに継承する通信バス21を使ってレジスタ内容を転送したが、別の大容量の通信バスを用いて全ての汎用レジスタ12−0〜12−mの内容を一括転送する構成にしても良い。また、本実施の形態は第1の実施の形態に適用したものであるが、第2乃至第5の実施の形態においても同様に適用できる。
【0070】
【第7の実施の形態】
図11を参照すると、本実施の形態における並列プロセッサシステムの各々のプロセッサ1−iは、図3に示した構成に加えて、各汎用レジスタ12−kに1対1に対応する転送状態ビット81−kと、レジスタトランスファシーケンサ82とを備えている。
【0071】
全ての転送状態ビット81−kは、子スレッドをフォークした旨の通知がユニット11から信号線83に出力された時点で未転送状態(例えば“1”)に初期設定され、レジスタトランスファシーケンサ82によってフォーク先プロセッサに転送が行われた時点で転送済状態(例えば“0”)に設定される。しかし、転送後、ユニット11が汎用レジスタ12−kを更新すると、レジスタライト信号17上のレジスタ番号に基づき、更新された汎用レジスタ12−kに対応する転送状態ビット81−kが再び未転送状態に設定される。
【0072】
レジスタトランスファシーケンサ82は、子スレッドをフォークした旨の通知を信号線83を通じてユニット11から受けると、参照バス84を介して汎用レジスタ12−0〜12−mの内容を順次に読み出し、その書き込み値22及びレジスタ番号23を通信バス21に出力し、出力した汎用レジスタ12−kに対応する転送状態ビット81−kを転送済状態に変更する。汎用レジスタ12−0から汎用レジスタ12−mまで一通りの転送を終えると、レジスタトランスファシーケンサ82は、転送状態ビット81−0〜81−mのうちに未転送状態になっているものが存在するか否かを常時監視し、未転送状態になっている転送状態ビット81−kを検出する毎に、参照バス84を介して該当する汎用レジスタ12−kの内容を読み出し、その書き込み値22及びレジスタ番号23を通信バス21に出力し、出力した汎用レジスタ12−kに対応する転送状態ビット81−kを転送済状態に変更する。本実施の形態では、ユニット11はフォーク後、直ちにフォーク命令以後の命令の実行を開始する。
【0073】
以上、本発明を幾つかの実施の形態を挙げて説明したが、本発明は以上の実施の形態にのみ限定されず、その他各種の付加変更が可能である。例えば、前記各実施の形態では、複数のプロセッサに共通にスレッド管理部3を設ける集中スレッド管理型の並列プロセッサシステムに本発明を適用したが、文献1等に記載されるように各プロセッサ毎にスレッド管理部を設ける分散スレッド管理型の並列プロセッサシステムにも本発明は適用可能である。また、隣接するプロセッサ間同士を単方向にリング状に接続する通信バスを使ってレジスタ転送を行ったが、全てのプロセッサが共通の通信バスに接続された並列プロセッサシステムでは当該共通の通信バスを使ってレジスタ転送が行われる。
【0074】
【発明の効果】
以上説明したように本発明によれば、フォーク後、親スレッドの汎用レジスタ書き込み毎に更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信し、子スレッド側のプロセッサでは子スレッドを投機的に実行し、RAW違反を検出すると再実行を行うことにより、RAW違反をコンパイル時点でなくプログラム実行時に動的に解消でき、且つRAW違反解消のための不必要な待ち合わせを解消することができる。
【0075】
また、第2乃至第4の発明によれば、汎用レジスタの内容切り替えに伴う無用なレジスタ転送を回避でき、第5の発明によれば、レジスタが前回と同じ値に更新された場合の無用なレジスタ転送を回避でき、共にレジスタ転送量を削減できると共に無駄なRAW違反検出による子スレッド側の再実行を防止することができる。
【図面の簡単な説明】
【図1】本発明の作用の説明図である。
【図2】本発明を適用した並列プロセッサシステムの一例を示すブロック図である。
【図3】本発明の第1の実施の形態におけるプロセッサの要部ブロック図である。
【図4】ステータスレジスタの状態遷移図である。
【図5】本発明の第2の実施の形態におけるプロセッサの要部ブロック図である。
【図6】prop命令を挿入する前と後の並列化プログラムの例を示す図である。
【図7】本発明の第3の実施の形態におけるプロセッサの要部ブロック図である。
【図8】本発明の第4の実施の形態におけるプロセッサの要部ブロック図である。
【図9】本発明の第5の実施の形態におけるプロセッサの要部ブロック図である。
【図10】本発明の第6の実施の形態におけるプロセッサの要部ブロック図である。
【図11】本発明の第7の実施の形態におけるプロセッサの要部ブロック図である。
【図12】従来のマルチスレッド実行方法の処理の概要を示す図である。
【図13】レジスタ継承に関する2通りの方式(フォーク時レジスタ転送方式、フォーク後レジスタ転送方式)の説明に用いるプログラム例を示す図である。
【図14】従来の問題点の説明図である。
【符号の説明】
1−0〜1−3…プロセッサ
2−0〜2−3…信号線
3…スレッド管理部
4−0〜4−3…信号線
5…メモリ
6−0〜6−3…通信バス

Claims (12)

  1. 単一のプログラムを複数のスレッドに分割し複数のプロセッサで並列に実行する並列プロセッサシステムにおけるフォーク後に親スレッドで更新されたレジスタを子スレッドに継承する方法において、フォーク後、親スレッドの汎用レジスタ書き込み毎に更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信し、子スレッド側のプロセッサでは子スレッドを投機的に実行し、正依存の違反を検出すると再実行を行うことを特徴とするプロセッサ間レジスタ継承方法。
  2. 各プロセッサの汎用レジスタに1対1に対応し、スレッド開始時点で第1の状態を保持し、対応する汎用レジスタに対するスレッド開始後の最初のアクセスがリードの場合に第2の状態を保持し、対応する汎用レジスタに対するスレッド開始後の最初のアクセスがライトの場合に第3の状態を保持する状態レジスタを備え、レジスタ値が親スレッド側のプロセッサから送信された汎用レジスタに対応する状態レジスタが第2の状態を保持しているとき、正依存の違反が発生したと検出する請求項1記載のプロセッサ間レジスタ継承方法。
  3. 子スレッドへの転送停止、転送再開を制御する特殊命令によって操作されるマスクビットを汎用レジスタに1対1に対応して備え、フォーク後、親スレッドの汎用レジスタ書き込み毎に、書き込みの行われた汎用レジスタに対応するマスクビットが転送許可状態である場合に限って、更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信する請求項1または2記載のプロセッサ間レジスタ継承方法。
  4. フォーク時点のスタックポインタの値を保存するスタックポインタ保存手段と、現在のスタックポインタの値と前記スタックポインタ保存手段に保存されたスタックポインタの値との一致を検出する検出手段とを備え、フォーク後、親スレッドの汎用レジスタ書き込み毎に、書き込みの行われた汎用レジスタが関数の返り値レジスタである場合、及び書き込みの行われた汎用レジスタが関数の返り値レジスタ以外のレジスタであって前記検出手段で一致が検出されている場合に限って、更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信する請求項1または2記載のプロセッサ間レジスタ継承方法。
  5. 各汎用レジスタに1対1に対応するストアアドレスレジスタを備え、ストア命令実行時に汎用レジスタ毎にストアアドレスを前記ストアアドレスレジスタに記憶し、汎用レジスタの内容切り替えを検出した際に当該汎用レジスタの子スレッドへの転送を禁止状態にすると共にストアアドレスレジスタへの書き込みを停止し、ロード時のアドレスをストアアドレスレジスタに記憶されたストアアドレスと比較することによって汎用レジスタの内容が元に戻ったことを検出して、当該汎用レジスタの子スレッドへの転送禁止状態を解除する請求項1または2記載のプロセッサ間レジスタ継承方法。
  6. 更新後の汎用レジスタの値が更新前と異なる場合に限って、更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信する請求項1乃至5の何れか1項に記載のプロセッサ間レジスタ継承方法。
  7. 単一のプログラムを複数のスレッドに分割し複数のプロセッサで並列に実行する並列プロセッサシステムにおけるフォーク後に親スレッドで更新されたレジスタを子スレッドに継承する装置において、フォーク後、親スレッドの汎用レジスタ書き込み毎に更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信する手段と、子スレッド側のプロセッサでは子スレッドを投機的に実行し、正依存の違反を検出すると再実行を行う手段とを備えることを特徴とするプロセッサ間レジスタ継承装置。
  8. 各プロセッサは、汎用レジスタに1対1に対応し、スレッド開始時点で第1の状態を保持し、対応する汎用レジスタに対するスレッド開始後の最初のアクセスがリードの場合に第2の状態を保持し、対応する汎用レジスタに対するスレッド開始後の最初のアクセスがライトの場合に第3の状態を保持する状態レジスタと、レジスタ値が親スレッド側のプロセッサから送信された汎用レジスタに対応する状態レジスタが第2の状態を保持しているとき、正依存の違反が発生したと検出する検出手段とを備える請求項7記載のプロセッサ間レジスタ継承装置。
  9. 各プロセッサは、子スレッドへの転送停止、転送再開を制御する特殊命令によって操作されるマスクビットを汎用レジスタに1対1に対応して備え、フォーク後、親スレッドの汎用レジスタ書き込み毎に、書き込みの行われた汎用レジスタに対応するマスクビットが転送許可状態である場合に限って、更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信する手段を備える請求項7または8記載のプロセッサ間レジスタ継承装置。
  10. 各プロセッサは、フォーク時点のスタックポインタの値を保存するスタックポインタ保存手段と、現在のスタックポインタの値と前記スタックポインタ保存手段に保存されたスタックポインタの値との一致を検出する検出手段と、フォーク後、親スレッドの汎用レジスタ書き込み毎に、書き込みの行われた汎用レジスタが関数の返り値レジスタである場合、及び書き込みの行われた汎用レジスタが関数の返り値レジスタ以外のレジスタであって前記検出手段で一致が検出されている場合に限って、更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信する手段とを備える請求項7または8記載のプロセッサ間レジスタ継承装置。
  11. 各プロセッサは、各汎用レジスタに1対1に対応するストアアドレスレジスタと、ストア命令実行時に汎用レジスタ毎にストアアドレスを前記ストアアドレスレジスタに記憶する手段と、汎用レジスタの内容切り替えを検出した際に当該汎用レジスタの子スレッドへの転送を禁止状態にすると共にストアアドレスレジスタへの書き込みを停止する手段と、ロード時のアドレスをストアアドレスレジスタに記憶されたストアアドレスと比較することによって汎用レジスタの内容が元に戻ったことを検出して、当該汎用レジスタの子スレッドへの転送禁止状態を解除する手段とを備える請求項7または8記載のプロセッサ間レジスタ継承装置。
  12. 更新後の汎用レジスタの値が更新前と異なるか否かを検出する手段と、更新後の汎用レジスタの値が更新前と異なる場合に限って、更新後のレジスタ値を親スレッド側のプロセッサから子スレッド側のプロセッサへ送信する手段とを備える請求項7乃至11の何れか1項に記載のプロセッサ間レジスタ継承装置。
JP2001212248A 2001-07-12 2001-07-12 プロセッサ間レジスタ継承方法及びその装置 Expired - Fee Related JP3702815B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2001212248A JP3702815B2 (ja) 2001-07-12 2001-07-12 プロセッサ間レジスタ継承方法及びその装置
US10/163,505 US6907517B2 (en) 2001-07-12 2002-06-07 Interprocessor register succession method and device therefor
GB0216271A GB2380293B (en) 2001-07-12 2002-07-12 Interprocessor register succession method and device therefor

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2001212248A JP3702815B2 (ja) 2001-07-12 2001-07-12 プロセッサ間レジスタ継承方法及びその装置

Publications (2)

Publication Number Publication Date
JP2003029986A JP2003029986A (ja) 2003-01-31
JP3702815B2 true JP3702815B2 (ja) 2005-10-05

Family

ID=19047440

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2001212248A Expired - Fee Related JP3702815B2 (ja) 2001-07-12 2001-07-12 プロセッサ間レジスタ継承方法及びその装置

Country Status (3)

Country Link
US (1) US6907517B2 (ja)
JP (1) JP3702815B2 (ja)
GB (1) GB2380293B (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9558152B2 (en) 2011-03-16 2017-01-31 Fujitsu Limited Synchronization method, multi-core processor system, and synchronization system

Families Citing this family (28)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7185338B2 (en) * 2002-10-15 2007-02-27 Sun Microsystems, Inc. Processor with speculative multithreading and hardware to support multithreading software
US20050050305A1 (en) * 2003-08-28 2005-03-03 Kissell Kevin D. Integrated mechanism for suspension and deallocation of computational threads of execution in a processor
US7836450B2 (en) * 2003-08-28 2010-11-16 Mips Technologies, Inc. Symmetric multiprocessor operating system for execution on non-independent lightweight thread contexts
US9032404B2 (en) * 2003-08-28 2015-05-12 Mips Technologies, Inc. Preemptive multitasking employing software emulation of directed exceptions in a multithreading processor
US7870553B2 (en) * 2003-08-28 2011-01-11 Mips Technologies, Inc. Symmetric multiprocessor operating system for execution on non-independent lightweight thread contexts
US7849297B2 (en) * 2003-08-28 2010-12-07 Mips Technologies, Inc. Software emulation of directed exceptions in a multithreading processor
DE602004017879D1 (de) * 2003-08-28 2009-01-02 Mips Tech Inc Integrierter mechanismus zum suspendieren und endznem prozessor
US7444497B2 (en) * 2003-12-30 2008-10-28 Intel Corporation Managing external memory updates for fault detection in redundant multithreading systems using speculative memory support
US9189230B2 (en) 2004-03-31 2015-11-17 Intel Corporation Method and system to provide concurrent user-level, non-privileged shared resource thread creation and execution
US7788650B2 (en) * 2005-05-10 2010-08-31 Intel Corporation Compiler-based critical section amendment for a multiprocessor environment
US8074224B1 (en) * 2005-12-19 2011-12-06 Nvidia Corporation Managing state information for a multi-threaded processor
US8510596B1 (en) 2006-02-09 2013-08-13 Virsec Systems, Inc. System and methods for run time detection and correction of memory corruption
US8549499B1 (en) * 2006-06-16 2013-10-01 University Of Rochester Parallel programming using possible parallel regions and its language profiling compiler, run-time system and debugging support
US20080229062A1 (en) * 2007-03-12 2008-09-18 Lorenzo Di Gregorio Method of sharing registers in a processor and processor
US8209559B2 (en) * 2008-12-24 2012-06-26 Intel Corporation Low power polling techniques
JP4886826B2 (ja) 2009-08-24 2012-02-29 インターナショナル・ビジネス・マシーンズ・コーポレーション フォールト・トレラント・コンピュータ・システム、方法及びプログラム
US10949200B2 (en) * 2013-06-16 2021-03-16 President And Fellows Of Harvard College Methods and apparatus for executing data-dependent threads in parallel
EP3044719B1 (en) 2013-09-12 2019-08-28 Virsec Systems Inc. Automated runtime detection of malware
JP5811211B2 (ja) * 2014-02-27 2015-11-11 富士通株式会社 マルチコアプロセッサシステム、マルチコアプロセッサシステムの制御方法、およびマルチコアプロセッサシステムの制御プログラム
EP3161638A1 (en) 2014-06-24 2017-05-03 Virsec Systems, Inc. Automated root cause analysis of single or n-tiered applications
CN106687981B (zh) 2014-06-24 2020-09-01 弗塞克系统公司 用于自动化检测输入和输出验证和资源管理漏洞的系统和方法
GB2528115B (en) * 2014-07-11 2021-05-19 Advanced Risc Mach Ltd Dynamic saving of registers in transactions
US10180840B2 (en) 2015-09-19 2019-01-15 Microsoft Technology Licensing, Llc Dynamic generation of null instructions
US10198263B2 (en) 2015-09-19 2019-02-05 Microsoft Technology Licensing, Llc Write nullification
US11681531B2 (en) 2015-09-19 2023-06-20 Microsoft Technology Licensing, Llc Generation and use of memory access instruction order encodings
US10031756B2 (en) * 2015-09-19 2018-07-24 Microsoft Technology Licensing, Llc Multi-nullification
US10061584B2 (en) 2015-09-19 2018-08-28 Microsoft Technology Licensing, Llc Store nullification in the target field
WO2017218872A1 (en) 2016-06-16 2017-12-21 Virsec Systems, Inc. Systems and methods for remediating memory corruption in a computer application

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5430850A (en) * 1991-07-22 1995-07-04 Massachusetts Institute Of Technology Data processing system with synchronization coprocessor for multiple threads
US5812811A (en) 1995-02-03 1998-09-22 International Business Machines Corporation Executing speculative parallel instructions threads with forking and inter-thread communication
US5717926A (en) 1995-02-28 1998-02-10 International Business Machines Corporation Efficient forking of a process
JP2882475B2 (ja) 1996-07-12 1999-04-12 日本電気株式会社 スレッド実行方法
JP2970553B2 (ja) 1996-08-30 1999-11-02 日本電気株式会社 マルチスレッド実行方法
GB2321546B (en) 1996-12-16 2001-03-28 Ibm Constructing a multiscalar program including a plurality of thread descriptors that each reference a next thread descriptor to be processed
JP3209205B2 (ja) * 1998-04-28 2001-09-17 日本電気株式会社 プロセッサにおけるレジスタ内容の継承装置
US6766517B1 (en) * 1999-10-14 2004-07-20 Sun Microsystems, Inc. System and method for facilitating thread-safe message passing communications among threads in respective processes
JP3729064B2 (ja) 2000-11-29 2005-12-21 日本電気株式会社 データ依存関係検出装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9558152B2 (en) 2011-03-16 2017-01-31 Fujitsu Limited Synchronization method, multi-core processor system, and synchronization system

Also Published As

Publication number Publication date
GB2380293A (en) 2003-04-02
GB2380293B (en) 2005-02-16
US6907517B2 (en) 2005-06-14
GB0216271D0 (en) 2002-08-21
JP2003029986A (ja) 2003-01-31
US20030028755A1 (en) 2003-02-06

Similar Documents

Publication Publication Date Title
JP3702815B2 (ja) プロセッサ間レジスタ継承方法及びその装置
JP3630118B2 (ja) スレッド終了方法及び装置並びに並列プロセッサシステム
JP3209205B2 (ja) プロセッサにおけるレジスタ内容の継承装置
JP3702814B2 (ja) マルチスレッド実行方法及び並列プロセッサシステム
JP3014773B2 (ja) プロセサアーキテクチャ
JP3984786B2 (ja) 異なる待ち時間を伴う命令のスケジューリング
JP2898820B2 (ja) 自己並列化式のコンピュータ・システムおよび方法
US6732276B1 (en) Guarded computer instruction execution
US4928226A (en) Data processor for parallelly executing conflicting instructions
CN108196884B (zh) 利用生成重命名的计算机信息处理器
EP0495165A2 (en) Overlapped serialization
JPH04275628A (ja) 演算処理装置
KR20120025492A (ko) Smt 기계에서 비교 및 전달 명령어를 사용한 안정적 실행
EP0372751B1 (en) Pipelined data-processing apparatus
US6725365B1 (en) Branching in a computer system
JPH10301778A (ja) レジスタの名前変更を管理する方法および装置
US5634136A (en) Data processor and method of controlling the same
KR20220057482A (ko) 데이터 구조 포기
US20100100709A1 (en) Instruction control apparatus and instruction control method
EP1050805B1 (en) Transfer of guard values in a computer system
KR20030007425A (ko) 고속 및 저속 리플레이 경로를 갖는 리플레이 구조를구비한 프로세서
US11663014B2 (en) Speculatively executing instructions that follow a status updating instruction
JP2894438B2 (ja) パイプライン処理装置
CN114116229B (zh) 调节指令流水线的方法及装置、存储器和存储介质
CN114968364B (zh) 一种条件语句的处理方法、装置及存储介质

Legal Events

Date Code Title Description
A871 Explanation of circumstances concerning accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A871

Effective date: 20040823

A975 Report on accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A971005

Effective date: 20041008

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20041124

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: 20050628

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20050711

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090729

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100729

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110729

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110729

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120729

Year of fee payment: 7

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120729

Year of fee payment: 7

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130729

Year of fee payment: 8

LAPS Cancellation because of no payment of annual fees