以下、図面を用いて実施形態を説明する。信号が伝達される信号線は、信号名と同じ符号を使用して説明される。
図1は、演算処理装置および演算処理装置の制御方法の一実施形態を示す。図1に示す演算処理装置は、複数の演算処理部10、20および保持部30を有する。演算処理部10は、実行部12、制御部14および判定部16を有し、演算処理部20は、実行部22、制御部24および判定部26を有する。例えば、演算処理装置はCPUであり、演算処理部10、20は、CPUに搭載されるコアである。
実行部12、22は、複数のスレッドを並列に実行することができ、あるいは1つのスレッドを単独で実行することができる。保持部30は、演算処理部10、20のそれぞれから共有され、実行部12、22の各々が実行する処理がシングルスレッドSTH(STH0またはSTH1)に到達したことを示す到達情報を保持する。シングルスレッドSTHは、実行部12、22のいずれかのみが排他的に実行するスレッドである。例えば、演算処理部10の実行部12がシングルスレッドSTHを実行した場合、他方の演算処理部20の実行部22は、シングルスレッドSTHを実行せずにスキップすることになる。図1に示す例では、保持部30は、1つのシングルスレッドSTHに対応する到達情報を保持する。
制御部14、24の各々は、実行部12、22の処理がシングルスレッドSTHの入口に到達した場合に、到達情報を保持部30に格納する。判定部16、26の各々は、保持部30に保持された到達情報に基づき、シングルスレッドを実行部12、22に実行させるかを判定する。
図1の下側は、スレッドPTH0が実行部12、22により並列に実行された後、シングルスレッドSTH0が実行部22により実行され、さらに、スレッドPTH1が実行部12、22により並列に実行された後、シングルスレッドSTH1が実行部22により実行される例を示す。符号T0、T1、T2、T3、T4、T5は、時刻を示しており、実行部22による処理は、実行部12による処理より早く進むことが分かる。
時刻T0、T1では、実行部12、22のいずれの処理もシングルスレッドSTH0の入口に到達していないため、保持部30は、「シングルスレッドSTH0に処理が到達した実行部なし」を示す到達情報を保持する。
時刻T2において、実行部22が実行する処理がシングルスレッドSTH0の入口に到達し、制御部24は、「シングルスレッドSTH0に実行部22の処理が到達」を示す到達情報を保持部30に格納する。保持部30は、演算処理装置内に設けられるため、到達情報の格納に掛かる時間は、演算処理装置の外部の記憶装置等に到達情報を格納する時間に比べて短い。シングルスレッドSTH0の入口に処理が到達した実行部22を含む演算処理部20の判定部26は、シングルスレッドSTH0に対する到達情報が保持部30に保持されていることに基づき、シングルスレッドSTH0を実行部22に実行させる。次に、時刻T3において、実行部12は、スレッドPTH0を実行し、実行部22は、スレッドPTH1を実行する。
時刻T4において、実行部22が実行する処理がシングルスレッドSTH1の入口に到達する。しかし、保持部30が保持する到達情報は、「シングルスレッドSTH0に実行部22の処理が到達」(すなわち、実行部12の処理は、シングルスレッドSTH0の入口に未到達)を示している。保持部30が保持可能な到達情報は、1つのシングルスレッドSTHに対応する情報であるため、演算処理部20の制御部24は、「シングルスレッドSTH1に実行部22の処理が到達」を示す到達情報を保持部30に格納しない。シングルスレッドSTH1に対する到達情報が保持部30に保持されないため、演算処理部20の判定部26は、シングルスレッドSTH1の実行部22による実行を保留させることを判定する。
すなわち、判定部26は、実行部12が実行する処理がシングルスレッドSTH0の入口に到達する前に、実行部22が実行する処理がシングルスレッドSTH0より後に実行されるシングルスレッドSTH1の入口に到達したことを検出する。そして、シングルスレッドSTH1に対応する到達情報を格納する領域が保持部30にない場合、実行部22は、シングルスレッドSTH1の実行を保留する。
次に、時刻T5において、実行部12が実行する処理がシングルスレッドSTH0の入口に到達する。演算処理部10の判定部16は、保持部30が保持する到達情報を参照し、全ての実行部12、22の処理がシングルスレッドSTH0の入口に到達したことを判定する。また、判定部16は、保持部30が保持する到達情報に基づき、既に他の演算処理部20の実行部22がシングルスレッドSTH0を実行済みであることを検出し、実行部12が実行する処理をシングルスレッドSTH0の入口から出口にジャンプさせる。これにより、実行部12によるシングルスレッドSTH0の実行はスキップされる。
到達情報の参照に掛かる時間は、演算処理装置の外部の記憶装置等に保持された到達情報を参照する時間に比べて短い。そして、演算処理部10の制御部14は、保持部30が保持する到達情報を、「シングルスレッドSTH1に処理が到達した実行部なし」に初期化する。
この後、演算処理部20の制御部24は、保持部30に保持された到達情報を参照し、シングルスレッドSTH1に対する到達情報が保持されているため、「シングルスレッドSTH1に実行部22の処理が到達」を示す到達情報を保持部30に格納する。そして、演算処理部20の判定部26は、シングルスレッドSTH1に対する到達情報が保持部30に保持されていることに基づき、シングルスレッドSTH1を実行部22に実行させる。
以上、図1に示した実施形態では、演算処理装置が到達情報を保持する保持部30を有するため、演算処理装置の外部の記憶装置等に到達情報を格納する場合に比べて、到達情報にアクセスする時間を短くすることができる。ここで、アクセス時間は、到達情報を保持部30に格納する格納時間および到達情報を保持部30から読み出す読み出し時間である。これにより、演算処理部10、20は、シングルスレッドSTH0(またはSTH1)への到達を示す到達情報の保持部30への格納時間を短くすることができ、シングルスレッドSTH0(またはSTH1)の実行の可否を判定する時間を短くすることができる。この結果、スレッドPTH0、STH0、PTH1、STH1の処理効率を向上することができる。
演算処理部20の判定部26は、「シングルスレッドSTH1に演算処理部20の処理が到達」を示す到達情報を保持部30が保持していない場合、シングルスレッドSTH1の実行部22による実行を保留させることを判定する。新たな到達情報を格納する領域が保持部30にない場合、シングルスレッドSTH1の実行を保留することで、保持部30の記憶容量に応じてシングルスレッドSTHの実行の可否を制御することができる。
図2は、演算処理装置および演算処理装置の制御方法の別の実施形態を示す。図2に示すCPUは、複数のコアC(C0、C1、C2、C3)、キャッシュメモリCMおよびレジスタ部REGUを有する。コアCは、互いに同一または同様の構成であるため、図2では、コアC0の構成を示し、以下では、コアC0の構成が説明される。なお、コアCの数は、4つに限定されない。CPUは、演算処理装置の一例であり、コアCは、演算処理部の一例である。CPUは、メインメモリMMに接続され、CPUとメインメモリMMとにより、情報処理システムSYSが構築される。
コアC0は、演算部OPU、データレジスタ部DREG、アドレスレジスタ部AREG、プログラムカウンタPC、インクリメンタINC、命令レジスタ部IREG、デコーダ部DECおよびセレクタS1、S2を有する。演算部OPUは、レジスタファイルREG、演算器EXおよびフラグレジスタSF、ZFを有する。演算部OPUは、スレッドを実行する実行部の一例である。
プログラムカウンタPCは、セレクタS1から受けるアドレスをインクリメンタINCおよびセレクタS2に出力する。インクリメンタINCは、プログラムカウンタPCから受けるアドレスをインクリメントし、インクリメントしたアドレスをセレクタS1に出力する。
セレクタS1は、命令コードを順次にフェッチする場合、インクリメンタINCからのアドレスを選択し、分岐命令またはジャンプ命令等が実行される場合、演算部OPUからのアドレスを選択する。そして、セレクタS1は、選択したアドレスをプログラムカウンタPCに出力する。セレクタS2は、命令コードをフェッチする場合、プログラムカウンタPCから出力されるアドレスを選択し、ロード命令またはストア命令を実行する場合、アドレスレジスタ部AREGから出力されるアドレスを選択する。そして、セレクタS2は、選択したアドレスを、アドレスバスAD0を介してキャッシュメモリCMに出力する。
コアC0が命令をフェッチする場合、アドレスAD0に応じて、キャッシュメモリCMから命令コードが読み出され、読み出された命令コードがデータバスDINを介して命令レジスタ部IREGに格納される。キャッシュメモリCMが命令コードを保持していない場合、キャッシュメモリCMは、アドレスバスAD1を介してメインメモリMMにアドレスを出力し、データバスDTを介してメインメモリMMから命令コードを受ける。例えば、アドレスAD1は、アドレスAD0の上位アドレスであり、キャッシュメモリCMの1キャッシュライン分の命令コード(プログラム)がメインメモリMMから読み出される。そして、キャッシュメモリCMは、メインメモリMMから読み出した命令コードを保持するとともに、保持した命令コードのうち読み出し対象の命令コードを、データバスDINを介して命令レジスタ部IREGに出力する。
コアC0がロード命令を実行する場合、アドレスAD0に応じて、キャッシュメモリCMからデータが読み出され、読み出されたデータがデータバスDINを介してレジスタファイルREGに格納される。キャッシュメモリCMがロード命令の対象のデータを保持していない場合、命令コードの読み出しと同様に、キャッシュメモリCMは、メインメモリMMから1キャッシュライン分のデータを読み出す。そして、キャッシュメモリCMは、メインメモリMMから読み出したデータを保持するとともに、保持したデータのうちロード対象のデータを、データバスDINを介してレジスタファイルREGに出力する。
コアC0がストア命令を実行する場合、アドレスバスAD0に出力されたアドレスに応じて、データレジスタ部DREGからデータバスDOUTに出力されたデータがキャッシュメモリCMに書き込まれる。
命令レジスタ部IREGは、キャッシュメモリCMから受ける命令コードを保持する複数の領域を有し、保持している命令コードをデコーダ部DECに順次に出力する。デコーダ部DECは、命令レジスタ部IREGから受ける命令コードをデコードし、デコード結果に基づいて、演算部OPUおよびセレクタS1、S2等の動作を制御する制御信号を生成する。
データレジスタ部DREGは、ストア命令の実行時に演算部OPUから出力されるデータを保持する複数の領域を有する。アドレスレジスタ部AREGは、ロード命令またはストア命令の実行時に演算部OPUから出力されるアドレスを保持する複数の領域を有する。
レジスタファイルREGは、キャッシュメモリCMから読み出されるデータまたは演算器EXから出力されるデータを保持する複数のレジスタを有する。レジスタファイルREGは、デコーダ部DECからの制御信号に基づいて、レジスタファイルREGの複数のレジスタの少なくともいずれかに保持しているデータを演算器EXに出力する。
演算器EXは、デコーダ部DECがデコードした命令コードにしたがって演算を実行し、演算結果をレジスタファイルREG、データレジスタ部DREG、アドレスレジスタ部AREGまたはセレクタS1に出力する。また、演算器EXは、演算結果に基づいてフラグレジスタSF、ZFをセットまたはリセットし、論理演算命令または分岐命令等を実行する場合にフラグレジスタSF、ZFの値を参照する。なお、演算部OPUは、フラグレジスタSF、ZF以外のフラグレジスタを有してもよい。
レジスタ部REGUは、複数のレジスタREGi(iは0、1、2、3、4のいずれか)と、レジスタREGjとを有する。なお、レジスタREGiの記憶領域の数Iは、”5”に限定されず、”1”以上であればよい。但し、図9等で説明するように、レジスタREGiの記憶領域の数Iが大きい程、複数のコアCにおける処理の進行度合いの差を大きくすることができ、CPUの処理効率を向上することができる。レジスタ部REGUは、コアC0−C3の各々が実行する処理が、シングル処理ブロックSIBの入口へ到達したことを示す到達情報を保持する保持部の一例である。
図2では、各レジスタREGiに保持される値は、符号Xi(X0からX4のいずれか)で示される。例えば、各レジスタREGiのビット幅とレジスタREGjのビット幅とは、互いに等しい。
レジスタREGi、REGjは、各コアC0−C3が図5に示す命令コードTEST&IDA(TEST & Increment, Decrement and Assignment)を実行する場合にアクセスされる。レジスタREGiは、図3に示す処理の進行とともに、巡回的に使用され、各レジスタREGiには、図3に示すシングル処理ブロックSIBの入口に到達していないスレッドTHの数である未到達数Xiが格納される。なお、コアC0−C3の数(=4)から未到達数Xiを減じた値は、シングル処理ブロックSIBの入口に到達したスレッドTHの数を示す。すなわち、未到達数Xiは、シングル処理ブロックSIBの入口に処理が到達したコアC0−C3の数を示す到達数情報の一例である。なお、各レジスタREGiには、シングル処理ブロックSIBの入口に到達したスレッドTHの数が格納されてもよい。レジスタ部REGUのレジスタREGiにおいて、未到達数Xiがそれぞれ格納される領域は、到達数領域の一例である。
レジスタREGjには、全てのスレッドTHが通過したシングル処理ブロックSIBの総数である総通過数jが格納される。総通過数jは、全てのコアC0−C3の処理が通過したシングル処理ブロックSIBの数を示す総通過数情報の一例である。レジスタREGjは、総通過数情報を保持する総通過数領域の一例である。レジスタREGi、REGjの使用方法は、図5から図12で説明する。
命令コードTEST&IDAは、加算命令、乗算命令、ロード命令、ストア命令などと同様に、演算器EXがマイクロプログラムを実行することで処理される。なお、命令コードTEST&IDAを実行する演算器EXの動作は、ワイヤードロジックで実現されてもよい。しかしながら、マイクロプログラム方式を採用することで、命令コードTEST&IDAを、ワイヤードロジック方式に比べて容易に追加することができ、ハードウェア機能(命令セットのアーキテクチャ)を容易に変更することができる。
キャッシュメモリCMは、命令キャッシュおよびデータキャッシュとして動作する。なお、キャッシュメモリCMは、コアC毎に設けられてもよく、一次キャッシュおよび二次キャッシュを含んでもよい。メインメモリMMは、SDRAM(Synchronous Dynamic Random Access Memory)またはフラッシュメモリを含むメモリモジュール等であり、CPUが実行するプログラムと、CPUが扱うデータとを記憶する。メインメモリMMは、コアCの数を示すコア数nを保持する記憶領域と、コアC0−C3のそれぞれが図3に示すシングル処理ブロックSIBを通過した数を示す通過数m(m0、m1、m2、m3)を保持する記憶領域とを有する。コア数nおよび通過数mは、キャッシュメモリCMにも保持される。キャッシュメモリCMがコア数nおよび通過数mを保持する場合、各コアは、メインメモリMMにアクセスすることなく、キャッシュメモリCMにアクセスすることで、コア数nおよび通過数mを参照することができ、また、通過数mを書き替えることができる。
図3は、図2に示すCPUが実行する処理の例を示す。図3に示す例では、CPUは、コアC0−C3のそれぞれで複数のスレッドTHを並列に実行し(並列処理ブロックPAB)、コアC0−C3のいずれかでシングルスレッドであるスレッドTHを実行する(シングル処理ブロックSIB)。シングルスレッドは、コアC0−C3のいずれかのみが排他的に実行するスレッドである。なお、図3では、シングル処理ブロックSIBと並列処理ブロックPABとが交互に繰り返されるが、所定数のシングル処理ブロックSIBまたは所定数の並列処理ブロックPABが連続して実行されてもよい。また、図2に示すコアC0−C3は、1つのスレッドTHを実行する機能を有するため、図3に示すスレッドTHは、コアCと表記されてもよい。
シングル処理ブロックSIBは、1つのスレッドが実行する処理ブロックである。シングル処理ブロックSIBを実行するスレッドTHは、図2に示すレジスタREGiに空き領域がない場合を除き、他のスレッドTHによる並列処理ブロックPABの完了を待つことなく、シングル処理ブロックSIBを実行可能である。シングル処理ブロックSIBを実行するスレッドTHは、複数のコアC0−C3のいずれかが実行するスレッドであるシングルスレッドの一例である。
各スレッドTHは、シングル処理ブロックSIBの入口に到達した場合、命令コードTEST&IDAを実行する。命令コードTEST&IDAの”n”と”m”は、オペランド(変数)であり、メインメモリMMまたはキャッシュメモリCMに保持されるコア数nおよび通過数mである。
各スレッドTHは、命令コードTEST&IDAの実行に基づいて設定されるフラグレジスタSF、ZFの値に基づいて、シングル処理ブロックSIBを実行するか、シングル処理ブロックSIBを実行せずに通過するかを判定する。各スレッドTHが実行する判定処理の例は、図4に示す。シングル処理ブロックSIBおよび並列処理ブロックPABの例は、図13から図15に示す。
図4は、図2に示す各コアCが、シングル処理ブロックSIBの入口で実行する処理の例を示す。図4は、ソースプログラムをコンパイルすることで得られるオブジェクトプログラムの内容をフローチャートで示している。すなわち、図4に示す処理は、各コアCの演算部OPUが、メインメモリMMに格納されているオブジェクトプログラムを実行することで実現される。図4に示す処理を実行する各コアCの演算部OPUは、レジスタ部REGUに保持された未到達数Xiおよび総通過数jに基づきシングル処理ブロックSIBの実行を判定する判定部の一例である。
コアCは、シングル処理ブロックSIBの入口へ到達した場合、ステップS202において、コア数nおよび通過数mをメインメモリMMからロードするロード命令を実行する。キャッシュメモリCMがコア数nおよび通過数mを保持している場合、コア数nおよび通過数mは、キャッシュメモリCMから読み出される。
次に、ステップS100において、コアCは、メインメモリMMからロードしたコア数nおよび通過数mを変数として、命令コードTEST&IDAを実行する。命令コードTEST&IDAにより実行される処理の例は、図5に示す。
次に、ステップS204において、コアCは、命令コードTEST&IDAの実行後にフラグレジスタSFの値が”1”の場合、レジスタREGiに空きがあると判断し、処理をステップS208に移行する。コアCは、命令コードTEST&IDAを実行した後のフラグレジスタSFの値が”1”でない場合(すなわち、”0”)、レジスタREGiに空きがないと判断し、処理をステップS206に移行する。
ステップS206において、コアCは、所定時間を待った後、処理をステップS100に戻す。なお、ステップS206において、コアCは、所定時間を待つ間、他の処理を実行してもよい。
ステップS208において、コアCは、命令コードTEST&IDAの実行後にフラグレジスタZFの値が”1”の場合、シングル処理ブロックSIBの入口に最初に到達したと判断し、処理をステップS210に移行する。コアCは、命令コードTEST&IDAの実行後にフラグレジスタZFの値が”1”でない場合(すなわち、”0”)、シングル処理ブロックSIBの入口に他のスレッドが先に到達したと判断し、処理をステップS212に移行する。
ステップS210において、コアCの処理は、シングル処理ブロックSIBへジャンプし、コアCは、シングル処理ブロックSIBを実行する。ステップS212において、コアCの処理は、シングル処理ブロックSIBの出口へ処理をジャンプし、コアCは、シングル処理ブロックSIBを実行することなく、次の処理を開始する。すなわち、シングル処理ブロックSIBの非実行を判定したコアCは、シングル処理ブロックSIBの出口に処理をジャンプする。これにより、シングル処理ブロックSIBが複数のコアCにより実行されることを抑止することができ、CPUが誤動作することを抑止することができる。ステップS210、S212の実行後、処理はステップS214に移行される。
ステップS214において、コアCは、ステップS202でメインメモリMMからロードした通過数mを”1”増加させる。次に、ステップS216において、コアCは、ステップS214で増加させた通過数mをメインメモリMMにストアするストア命令を実行する。キャッシュメモリCMが通過数mを保持している場合、通過数mは、キャッシュメモリCMに保持された後、メインメモリMMに格納される。そして、コアCが実行する処理が終了する。
図5は、図4に示す命令コードTEST&IDAにより実行される処理の例を示す。図5に示す処理は、図2に示す演算器EXが、命令コードTEST&IDAに対応するマイクロプログラムを実行することで実現される。図5に示す命令コードTEST&IDAを実行する演算器EXは、シングル処理ブロックSIBの入口へ処理が到達した場合に、未到達数Xiまたは総通過数jをレジスタ部REGUに格納する制御部の一例である。
まず、ステップS102において、演算器EXは、通過数mと総通過数jとの差がレジスタREGiの数I(図2では、”5”)より小さい場合、使用可能なレジスタREGiがあるため、処理をステップS104に移行する。演算器EXは、通過数mと総通過数jとの差がレジスタREGiの数I以上の場合、使用可能なレジスタREGiがないため、処理をステップS114に移行する。
ステップS104において、演算器EXは、シングル処理ブロックSIBの入口へ処理が到達したことを示すために、フラグレジスタSFを”1”にセットし、処理をステップS106に移行する。ステップS106において、演算器EXは、通過数mをレジスタREGiの数Iで除した余りiを算出し(”m%I”)、算出した余りiを、使用するレジスタREGiの番号iとし、処理をステップS108に移行する。
ステップS108において、演算器EXは、ステップS106で求めたレジスタREGiに格納された未到達数Xiが”0”の場合、最初にシングル処理ブロックSIBの入口へ処理が到達したと判断し、処理をステップS110に移行する。一方、演算器EXは、未到達数Xiが”0”でない場合、他のコアCの処理がシングル処理ブロックSIBの入口へ到達済みであると判断し、処理をステップS116に移行する。
ステップS110において、演算器EXは、コア数n(図2では、”4”)から”1”を引いた値を、未到達数XiとしてレジスタREGiに格納し、処理をステップS112に移行する。ステップS112において、演算器EXは、シングル処理ブロックSIBの入口へ処理が最初に到達したことを示すために、フラグレジスタZFを”1”にセットし、処理を終了する。
他のコアCの処理がシングル処理ブロックSIBの入口へ到達済みの場合、ステップS116において、演算器EXは、未到達数Xiを”1”減らし、処理をステップS118に移行する。ステップS118において、演算器EXは、シングル処理ブロックSIBの入口へ処理が最初に到達していないことを示すために、フラグレジスタZFを”0”にリセットし、処理をステップS120に移行する。
ステップS120において、演算器EXは、未到達数Xiが”0”の場合、シングル処理ブロックSIBの入口へ処理が最後に到達したと判断し、処理をステップS122に移行する。演算器EXは、未到達数Xiが”0”でない場合、シングル処理ブロックSIBの入口へ処理が到達していない他のコアCがあると判断し、処理を終了する。ステップS122において、演算器EXは、全てのコアCの処理がシングル処理ブロックSIBの入口へ到達したため、総通過数jを”1”増加させ、処理を終了する。
一方、使用可能なレジスタREGiがない場合、ステップS114において、演算器EXは、シングル処理ブロックSIBの入口へ処理が到達していないことを擬似的に示すために(実際には到達しているが)、フラグレジスタSFを”0”にセットし、処理を終了する。
このように、ステップS110、S112は、シングル処理ブロックSIBの入口へ処理が最初に到達したコアCが実行する処理である。ステップS116からステップS122は、シングル処理ブロックSIBの入口へ処理が2番目以降に到達したコアCが実行する処理である。さらに、ステップS122は、シングル処理ブロックSIBの入口へ最後に処理が到達したコアCが実行する処理である。ステップS114は、レジスタREGiに空きがない場合にコアCが実行する処理である。
図6から図10は、図2に示すCPUの動作の例を示す。図6から図10では、図3と同様に、シングル処理ブロックSIBと並列処理ブロックPABとが交互に実行される。
フラグレジスタSF、ZFの”*”は、”0”または”1”を示す。矢印が示す破線は、シングル処理ブロックSIB(SIB0−SIB6)を示し、シングル処理ブロックSIBの上または下は、並列処理ブロックPAB(PAB0−PAB6)を示す。シングル処理ブロックSIB0−SIB6に併記したレジスタREGiの番号iは、図5に示すステップS106で算出され、”0”から”4”のいずれかに巡回的に割り当てられる。
各コアCが実行する処理は、図6から図10において、上から下に向けて進行する。各コアCの進行ライン(図の縦方向の点線)上に示す小さい黒丸は、処理中の位置を示す。小さい黒丸をつなぐ折れ線は、図1と同様に任意の時刻を示し、コアCが実行する処理の進行状況の差を分かりやすくするために便宜上付加した。シングル処理ブロックSIBを示す破線上の白丸は、シングル処理ブロックSIBの入口に最初に到達したコアCがシングル処理ブロックSIBを実行したことを示す。
まず、時刻T0において、各コアC0−C3が並列処理ブロックPAB0を開始する。初期状態において、レジスタREGi、REGjおよび通過数m0−m3は、0に初期化されている。
時刻T10において、コアC3が並列処理ブロックPAB0の実行を完了し、シングル処理ブロックSIB0の入口に最初に到達し、命令コードTEST&IDAを実行する(図6(a))。コアC3の処理がシングル処理ブロックSIBの入口に到達する前、通過数m3および総通過数jは、”0”であり、”m3−j(=0)”は、レジスタREGiの数I(”4”)より小さい。このため、図5に示すステップS102において、レジスタREGiに空きがあると判定され、図5に示すステップS104において、フラグレジスタSFは”1”にセットされる(図6(b))。
また、シングル処理ブロックSIB0の入口に処理が到達する前、レジスタREGiの未到達数X0は”0”に初期化されているため、コアC3の処理がシングル処理ブロックSIBの入口へ最初に到達したと判定される。このため、図5に示すステップS110において、未到達数X0が”3”(コア数−1)に設定され、ステップS112において、フラグレジスタZFが”1”にセットされる(図6(c)、(d))。
コアC3は、命令コードTEST&IDAを実行後、フラグレジスタSF、ZFがともに”1”のため、図4に示すステップS210においてシングル処理ブロックSIBに処理をジャンプさせる。また、コアC3は、図4に示すステップS214、S216において、通過数mをインクリメントし、メインメモリMMに格納する(図6(e))。コアC3は、シングル処理ブロックSIB0の実行後、並列処理ブロックPAB1を実行する。
次に、時刻T20において、コアC0が並列処理ブロックPAB0の実行を完了し、シングル処理ブロックSIB0の入口に2番目に到達し、命令コードTEST&IDAを実行する(図6(f))。コアC0は、時刻T10でのコアC3の動作と同様に、フラグレジスタSFを”1”にセットする(図6(g))。時刻T10でレジスタREGiの未到達数X0が”3”に設定されたため、コアC0は、図5に示すステップS116、S118において、未到達数X0を”2”に変更し、フラグレジスタZFを”0”にリセットする(図6(h)、(i))。
コアC0は、命令コードTEST&IDAを実行後、フラグレジスタSFが”1”、フラグレジスタZFが”0”のため、図4に示すステップS212においてシングル処理ブロックSIB0の出口に処理をジャンプさせる。また、コアC0は、図4に示すステップS214、S216において、通過数mをインクリメントし、メインメモリMMに格納する(図6(j))。コアC0は、シングル処理ブロックSIB0の実行後、並列処理ブロックPAB1を実行する。
次に、時刻T30において、コアC2が並列処理ブロックPAB0の実行を完了し、シングル処理ブロックSIB0の入口に3番目に到達し、命令コードTEST&IDAを実行する(図6(k))。コアC2は、時刻T20でのコアC0の動作と同様に、フラグレジスタSFを”1”にセットし、未到達数X0を”1”に変更し、フラグレジスタZFを”0”にリセットする(図6(l)、(m)、(n))。そして、コアC2は、命令コードTEST&IDAを実行後、シングル処理ブロックSIB0の出口に処理をジャンプさせ、通過数mをインクリメントし、メインメモリMMに格納する(図6(o))。コアC2は、シングル処理ブロックSIB0の実行後、並列処理ブロックPAB1を実行する。
次に、時刻T40において、コアC1が並列処理ブロックPAB0の実行を完了し、シングル処理ブロックSIB0の入口に最後に到達し、命令コードTEST&IDAを実行する(図6(p))。コアC1は、時刻T20でのコアC0の動作と同様に、フラグレジスタSFを”1”にセットし、未到達数X0を”0”に変更し、フラグレジスタZFを”0”にリセットする(図6(q)、(r)、(s))。さらに、コアC1は、未到達数X0が”0”になったため、図5に示すステップS122において、総通過数jをインクリメントして”1”にする(図6(t))。そして、コアC1は、命令コードTEST&IDAを実行後、シングル処理ブロックSIB1の出口に処理をジャンプさせ、通過数mをインクリメントし、メインメモリMMに格納する(図6(u))。
次に、図7の時刻T50において、コアC0が並列処理ブロックPAB1の実行を完了し、シングル処理ブロックSIB1の入口に最初に到達し、命令コードTEST&IDAを実行する(図7(a))。時刻T10と同様に、レジスタREGiに空きがあると判定されるため、フラグレジスタSFは”1”にセットされる(図7(b))。
シングル処理ブロックSIB1の入口に処理が到達する前、レジスタREGiの未到達数X1は”0”に初期化されているため、コアC0の処理がシングル処理ブロックSIBの入口に最初に到達したと判定される。このため、コアC0は、時刻T10の動作と同様に、未到達数X0を”3”(コア数−1)に設定し、フラグレジスタZFを”1”にセットする(図7(c)、(d))。そして、コアC1は、命令コードTEST&IDAを実行後、シングル処理ブロックSIBへ処理をジャンプし、通過数mをインクリメントし、メインメモリMMに格納する(図7(e))。
次に、時刻T60において、コアC3が並列処理ブロックPAB1の実行を完了し、シングル処理ブロックSIB1の入口に到達し(図7(f))、コアC3は、時刻T20におけるコアC0と同様に動作する。コアC3は、フラグレジスタSFを”1”にセットし、レジスタREGiの未到達数X0を”2”に変更し、フラグレジスタZFを”0”にリセットする(図7(g)、(h)、(i))。そして、コアC3は、命令コードTEST&IDAを実行後、シングル処理ブロックSIB1の出口に処理をジャンプし、通過数mをインクリメントし、メインメモリMMに格納する(図7(j))。この後、時刻T70において、コアC2は、時刻T30と同様に動作する。
次に、時刻T80において、コアC1の処理がシングル処理ブロックSIB1の入口に到達する前に、コアC2の処理がシングル処理ブロックSIB2の入口に到達する(図7(k))。コアC2は、レジスタREGiの未到達数X2の格納領域を用いて、時刻T10におけるコアC0と同様に動作する。次に、時刻T90において、コアC0の処理がシングル処理ブロックSIB2の入口に到達する(図7(l))。コアC0は、レジスタREGiの未到達数X2の格納領域を用いて、時刻T20と同様に動作する。
次に、図8の時刻T100において、コアC3の処理がシングル処理ブロックSIB2の入口に到達する(図8(a))。コアC3は、レジスタREGiの未到達数X2の格納領域を用いて、時刻T30におけるコアC2と同様に動作する。
次に、時刻T110において、コアC1の処理がシングル処理ブロックSIB1の入口に到達する前に、コアC0の処理がシングル処理ブロックSIB3の入口に到達する(図8(b))。コアC0は、レジスタREGiの未到達数X3の格納領域を用いて、時刻T50と同様に動作する。
次に、時刻T120において、コアC3の処理がシングル処理ブロックSIB3の入口に到達する(図8(c))。コアC3は、レジスタREGiの未到達数X3の格納領域を用いて、時刻T60と同様に動作する。次に、時刻T130において、コアC2の処理がシングル処理ブロックSIB3の入口に到達する(図8(d))。コアC2は、レジスタREGiの未到達数X3の格納領域を用いて、時刻T70と同様に動作する。
次に、時刻T140において、コアC1の処理がシングル処理ブロックSIB1の入口に到達する前に、コアC3の処理がシングル処理ブロックSIB4の入口に到達する(図8(e))。コアC3は、レジスタREGiの未到達数X4の格納領域を用いて、時刻T10と同様に動作する。
次に、図9の時刻T150において、コアC2の処理がシングル処理ブロックSIB4の入口に到達する(図9(a))。コアC2は、レジスタREGiの未到達数X4の格納領域を用いて、時刻T20のコアC0と同様に動作する。
次に、時刻T160において、コアC1の処理がシングル処理ブロックSIB1の入口に到達する前に、コアC2の処理がシングル処理ブロックSIB5の入口に到達する(図9(b))。コアC2の処理がシングル処理ブロックSIB5の入口に到達する前、通過数m2は、”5”であり、総通過数jは、”1”であり、”m2−j(=4)”は、レジスタREGiの数I(”5”)より小さい。このため、図5に示すステップS102において、レジスタREGiに空きがあると判定される。また、図5に示すステップS106において、コアC2は、通過数m2(=5)をレジスタREGiの数I(=5)で除した余り(=0)を算出し、レジスタREGiの未到達数X0の格納領域を使用することを決定する(図9(c))。そして、コアC2は、未到達数X0の格納領域を用いて、時刻T10のコアC3と同様に動作する。
次に、時刻T170において、コアC1の処理がシングル処理ブロックSIB1の入口に到達する前に、コアC2の処理がシングル処理ブロックSIB6の入口に到達する(図9(d))。コアC2の処理がシングル処理ブロックSIB6の入口に到達する前、通過数m2は、”6”であり、総通過数jは、”1”であり、”m2−j(=5)”は、レジスタREGiの数I(”5”)と同じである。このため、コアC2は、図5に示すステップS102において、レジスタREGiに空きがないと判定し、フラグレジスタSFを”0”にリセットし、命令コードTEST&IDAを終了する(図9(e))。
コアC2は、図4のステップS204において、フラグレジスタSFが”0”であることを判定し、ステップS206において、所定時間待つ。すなわち、コアC2は、シングル処理ブロックSIB6へ処理をジャンプさせずに待機し、通過数m2もインクリメントしない。
次に、時刻T181において、コアC1が並列処理ブロックPAB1の実行を完了し、シングル処理ブロックSIB1の入口に到達する(図9(f))。コアC1の処理がシングル処理ブロックSIB1の入口に到達する前、通過数m1は、”1”であり、総通過数jは、”1”であり、”m1−j(=0)”は、レジスタREGiの数I(”5”)より小さい。このため、コアC1は、図5のステップS104において、フラグレジスタSFを”1”にセットする(図9(g))。
また、コアC1の処理がシングル処理ブロックSIB1の入口に到達する前、未到達数X1は”1”である。このため、コアC1は、図5のステップS116、S118において、未到達数X1を”0”に変化し、フラグレジスタZFを”0”にリセットする(図9(h)、(i))。さらに、未到達数X1が”0”になったため、コアC1は、図5のステップS122において、総通過数jをインクリメントして”2”に変更する(図9(j))。
コアC1は、命令コードTEST&IDAを実行後、フラグレジスタSFが”1”、フラグレジスタZFが”0”のため、図4に示すステップS212においてシングル処理ブロックSIB1の出口に処理をジャンプさせる。また、コアC1は、図4に示すステップS214、S216において、通過数mをインクリメントし、メインメモリMMに格納する(図9(k))。なお、コアC2が、所定時間を待つ間に他の演算処理を実行した場合、フラグレジスタSF、ZFの値は不定*(”0”または”1”)になる。
この後、時刻T182において、コアC2は、所定時間を待った後、命令コードTEST&IDAを実行する。なお、時刻T181、T182は、説明を分かりやすくするために分けているが、時刻T181に示す動作と、時刻T182に示す動作とは、連続して実行される。
時刻T182になる前、通過数m2は、”6”であり、総通過数jは、”2”であり、”m2−j(=4)”は、レジスタREGiの数I(”5”)より小さい。このため、コアC2は、フラグレジスタSFを”1”にセットする(図9(l))。また、コアC2は、図5に示すステップS106において、通過数m2(=6)をレジスタREGiの数I(=5)で除した余りi(=1)を算出し、レジスタREGiの未到達数X1の格納領域を使用することを決定する。また、時刻T182になる前、未到達数X1が”0”であるため、コアC2は、図5のステップS110、S112において、未到達数X1が”3”(コア数−1)に設定し、フラグレジスタZFを”1”にセットする(図9(m)、(n))。
コアC2は、命令コードTEST&IDAを実行後、フラグレジスタSF、ZFがともに”1”のため、図4に示すステップS210においてシングル処理ブロックSIB6に処理をジャンプさせる(図9(o))。また、コアC2は、図4に示すステップS214、S216において、通過数m2をインクリメントし、メインメモリMMに格納する(図9(p))。
次に、図10の時刻T190において、コアC1が並列処理ブロックPAB2の実行を完了し、シングル処理ブロックSIB2の入口に到達する(図10(a))。コアC1は、図9の時刻T181の動作と同様に、フラグレジスタSFを”1”にセットし、未到達数X2をデクリメントして”0”に変化し、フラグレジスタZFを”0”にリセットする(図10(b)、(c)、(d))。これにより、レジスタREGiの未到達数X2の格納領域が使用可能になる。さらに、未到達数X1が”0”になったため、図9の時刻T181と同様に、コアC1は、総通過数jをインクリメントし、”3”に変化する(図10(e))。
コアC1は、命令コードTEST&IDAを実行後、フラグレジスタSFが”1”、フラグレジスタZFが”0”のため、シングル処理ブロックSIB2の出口に処理をジャンプさせ、通過数mをインクリメントし、メインメモリMMに格納する(図10(f))。
次に、時刻T200において、コアC1が並列処理ブロックPAB3の実行を完了し、シングル処理ブロックSIB3の入口に到達する(図10(g))。コアC1は、時刻T190の動作と同様に、フラグレジスタSFを”1”にセットし、未到達数X3をデクリメントして”0”に変化し、フラグレジスタZFを”0”にリセットする(図10(h)、(i)、(j))。これにより、レジスタREGiの未到達数X3の格納領域が使用可能になる。さらに、時刻T190の動作と同様に、コアC1は、総通過数jをインクリメントして”4”に変更し、シングル処理ブロックSIB3の出口に処理をジャンプさせ、通過数mをインクリメントする(図10(k)、(l))。
図11から図12は、図2に示すCPUの動作の別の例を示す。図6から図10と同様の動作については、詳細な説明は省略する。図11および図12では、各シングル処理ブロックSIB(SIB0−SIB6)は、全てのコアC0−C3による各並列処理ブロックPAB(PAB0−PAB6)の実行の完了を待って実行される。例えば、図11および図12は、コアC0−C3が並列処理ブロックPABにより演算を並列に実行し、コアC0−C3のいずれかが、並列処理ブロックPABでの演算結果を用いてシングル処理ブロックSIBにより演算する例を示す。
時刻T0、T10の動作は、図6に示す時刻T0、T10の動作と同様である。時刻T10において、並列処理ブロックPAB0の処理を完了し、シングル処理ブロックSIB0の入口に最初に処理が到達したコアC3は、図4に示すステップS210において、シングル処理ブロックSIB0へ処理をジャンプさせる。しかし、他のコアC0−C2が、並列処理ブロックPAB0の処理を完了し、シングル処理ブロックSIB0の入口に処理が到達するまで、シングル処理ブロックSIB0の開始は保留される(図11(a))。
次に、時刻T20において、コアC0の処理がシングル処理ブロックSIBの入口に到達し、時刻T30において、コアC2の処理がシングル処理ブロックSIBの入口に到達する(図11(b)、(c))。コアC0、C1は、図4に示すステップS211において、シングル処理ブロックSIB0の出口へ処理をジャンプさせた後、コアC3によるシングル処理ブロックSIB0の実行が完了するまで、並列処理ブロックPAB1の開始を保留する。
次に、時刻T40において、コアC1の処理がシングル処理ブロックSIBの入口に到達し、総通過数jが”1”に設定される(図11(d)、(e))。コアC3は、全てのコアC0−C3の処理がシングル処理ブロックSIB0の入口に到達した後、シングル処理ブロックSIB0を実行し、シングル処理ブロックSIB0の完了後、並列処理ブロックPAB1を開始する(図11(f))。コアC0−C2は、並列処理ブロックPAB1の処理を開始する。なお、時刻T10−T30では、通過数m3、m0、m2が、”0”から”1”にそれぞれ変更されているが、通過数m3、m0、m2は、時刻T40において、コアC3がシングル処理ブロックSIB0を実行した後に変更されてもよい。
次に、図12の時刻T50において、コアC1の処理がシングル処理ブロックSIB0の入口に最初に到達し、図4に示すステップS210において、コアC1は、シングル処理ブロックSIB0へ処理をジャンプさせる。しかし、図11に示す時刻T10の動作と同様に、他のコアC0、C2、C3の処理がシングル処理ブロックSIB0の入口に到達するまで、シングル処理ブロックSIB0の開始は保留される(図12(a))。
この後、時刻T60、T70、T80において、コアC0、C3、C2の処理がシングル処理ブロックSIB0の入口に順次に到達する(図12(b)、(c)、(d))。シングル処理ブロックSIB0の入口に最後に処理が到達するコアC2は、総通過数jを”2”に設定する(図12(e))。そして、コアC1は、全てのコアC0、C2、C3がシングル処理ブロックSIB0の入口に到達した後、シングル処理ブロックSIB0を実行する(図12(f))。
図13は、図2に示すCPUが実行するプログラムの例を示す。図13に示すプログラムは、マルチスレッドプログラミングのためのAPI(Application Programming Interfece)の1つであるOpenMP(登録商標)規格に基づいて記述されたソースプログラムである。図13に示すプログラムは、C言語等で記述されたソースプログラムをOpenMP規格に対応したコンパイラによりコンパイルすることで生成されるソースプログラムである。
指示文”#pragma omp parallel”は、”{ }”で囲まれるブロックが並列に実行されることを示す。指示文”#pragma omp single”は、”{ }”で囲まれるブロックが1つのスレッドにより実行されることを示す。指示節”(nowait)”は、指示文”#pragma omp single”で指示されるシングル処理ブロックSIBを完了したスレッドが他のスレッドの状況に関係なく次の処理に移行することを示す。指示文”#pragma omp single (nowait)”の記述を含む図13に示すプログラムにより、図6から図10に示す動作が実現される。
一方、指示文”#pragma omp single (nowait)”から指示節”(nowait)”を除いた指示文”#pragma omp single”の出口は、全てのスレッドの処理が完了するまで次の処理を待機する暗黙のバリアを有する。このため、図13に示す指示文”#pragma omp single (nowait)”を指示文”#pragma omp single”に変更した場合、図11から図12に示す動作が実現される。
図14は、図2に示すCPUが実行するプログラムの別の例を示す。図14に示すプログラムは、図13と同様に、OpenMP規格に基づいて記述されたソースプログラムである。
指示文”#pragma omp parallel for”は、次の行の”for文”が並列に実行されることを示す。図14では、並列処理ブロックPABとシングル処理ブロックSIBと並列処理ブロックPABとが、変数COUNTで指示される回数繰り返し実行される。図14に示すプログラムにより、図13と同様に、図6から図10に示す動作が実現される。
図15は、図2に示すCPUが実行するプログラムの別の例を示す。図15に示すプログラムは、図13と同様に、OpenMP規格に基づいて記述されたソースプログラムである。図15に示す2つのプログラムは、互いに同じ処理を実行する。
指示文”#pragma omp sections”は、”{ }”で囲まれるブロックが、指示文”#pragma omp section”毎にスレッドを割り当てて、並列に実行されることを示す。指示文”#pragma omp sections”で指定されるブロックの出口は、全てのスレッドの処理が完了するまで次の処理を待機する暗黙のバリアを有する。このため、指示文”#pragma omp sections”を指示文”#pragma omp single (nowait)”に書き替える場合、指示文”#pragma omp barrier”が、”for文”のブロックの末尾に追加される。指示文”#pragma omp barrier”は、同期を取る場合に使用される。
以上、この実施形態においても、図1に示した実施形態と同様に、CPUは、到達情報である未到達数Xiおよび総通過数jを保持するレジスタ部REGUを有する。このため、メインメモリMMに到達情報を格納する場合に比べて、到達情報にアクセスする時間を短くすることができる。この結果、複数のコアC0−C3が実行するスレッドの処理効率を向上することできる。
さらに、シングル処理ブロックSIBの入口に最後に処理が到達したコアCは、レジスタREGiにおける対応する領域を、新たな未到達数Xiを保持可能な状態に初期化する。これにより、実行が保留されていたシングル処理ブロックSIBの実行が可能になるとともに、初期化された領域を用いて、新たなシングル処理ブロックSIBの実行の可否を制御することができる。すなわち、レジスタREGiにおける未到達数Xiを格納する複数の領域を巡回的に使用して、シングル処理ブロックSIBの実行の可否を制御することができる。
コアC0−C3毎に管理される通過数mは、シングル処理ブロックSIBを通過する毎に増加され、コアC0−C3に共通の総通過数jは、コアC0−C3の処理のいずれかが各シングル処理ブロックSIBの入口に最後に到達する毎に増加される。これにより、通過数mと総通過数jとの差と、レジスタREGiにおける未到達数Xiを格納する領域の数Iとの比較に基づいて、通過数mに対応するシングル処理ブロックSIBを実行するか保留するかを判定することができる。
シングル処理ブロックSIBの入口に2番目以降に処理が到達したコアCは、シングル処理ブロックSIBの非実行を判定し、シングル処理ブロックSIBの出口に処理をジャンプさせることで、複数のコアCがシングル処理ブロックSIBを実行することを抑止することができる。
各コアCは、シングル処理ブロックSIBの入口へ処理が到達した場合に命令コードTEST&IDAをフェッチし、命令TEST&IDAの実行は、マイクロプログラムにより実行される。これにより、ハードウェア機能(命令セットのアーキテクチャ)を容易に変更することができる。
図16は、演算処理装置および演算処理装置の制御方法の別の実施形態を示す。図1から図15で説明した要素と同一または同様の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。
図16に示すCPUは、図2と異なるレジスタ部REGUを有する。レジスタ部REGUは、未到達数X0を格納する1つの格納領域(i=0)を有する。CPUのその他の構成は、図2に示すCPUと同様である。すなわち、図16に示すCPUは、複数のコアC(C0、C1、C2、C3)、キャッシュメモリCMおよび図2と異なるレジスタ部REGUを有する。各コアCは、図2と同様に、演算部OPU、データレジスタ部DREG、アドレスレジスタ部AREG、プログラムカウンタPC、インクリメンタINC、命令レジスタ部IREG、デコーダ部DECおよびセレクタS1、S2を有する。
図16に示すCPUが実行する処理は、図3と同様である。各コアC0−C3がシングル処理ブロックSIBの入口で実行する処理は、図4と同一または同様であり、各コアC0−C3が実行する命令コードTEST&IDAの動作は、図5と同一または同様である。
図17から図19は、図16に示すCPUの動作の例を示す。図6から図10と同一または同様の動作については、詳細な説明は省略する。時刻T0、T10、T20の動作は、図6の時刻T0、T10、T20の動作と同様である。
時刻T30において、コアC1、C2の処理がシングル処理ブロックSIB0の入口に到達する前に、コアC3は、並列処理ブロックPAB1を完了し、シングル処理ブロックSIB1の入口に処理が到達する(図17(a)、(b))。コアC3の処理がシングル処理ブロックSIB1の入口に到達する前、通過数m3は、”1”であり、総通過数jは、”0”であり、”m3−j(=1)”は、レジスタREGiの数I(”1”)と同じである。このため、コアC3は、図5に示すステップS102において、レジスタREGiに空きがないと判定し、フラグレジスタSFを”0”にリセットし、命令コードTEST&IDAを終了する(図17(c))。
コアC3は、図4のステップS204において、フラグレジスタSFが”0”であることを判定し、ステップS206において、所定時間を待つ。すなわち、コアC3は、シングル処理ブロックSIB6へ処理をジャンプさせずに待機し、通過数m3もインクリメントしない。
次に、時刻T40において、コアC1が並列処理ブロックPAB0の実行を完了し、シングル処理ブロックSIB0の入口に処理が到達し、レジスタREGiの未到達数X0は、”1”に変更される(図17(d)、(e))。しかしながら、”m3−j(=1)”は、時刻T30と同様に、レジスタREGiの数I(”1”)と同じであるため、コアC3は、フラグレジスタSFを”0”に再びリセットし、所定時間を待つ(図17(f))。
次に、図18の時刻T51において、コアC2が並列処理ブロックPAB0の実行を完了し、シングル処理ブロックSIB0の入口に処理が到達し、レジスタREGiの未到達数X0は、”0”に変更される(図18(a)、(b))。未到達数X0が、”0”になったため、コアC2は、総通過数jを”1”に設定する(図18(c))。
図4に示すステップS206で所定時間を待ったコアC3は、命令コードTEST&IDA(図5)を実行する。”通過数m3は、”1”であり、”m3−j(=0)”は、レジスタREGiの数I(”1”)より小さいため、コアC3は、フラグレジスタSFを”1”にセットする(図18(d))。コアC3は、通過数m3(=1)をレジスタREGiの数I(=1)で除した余りi(=0)を算出し、レジスタREGiの未到達数X0の格納領域を使用することを決定する。
この後、時刻T52において、コアC3は、未到達数X0が”0”であるため、未到達数X0の格納領域が空いていると判断し、未到達数X0に”3”を設定し、フラグレジスタZFを”1”にセットする(図18(e)、(f))。コアC3は、命令コードTEST&IDAを実行後、フラグレジスタSF、ZFがともに”1”のため、シングル処理ブロックSIB1にジャンプし、通過数m3をインクリメントし、メインメモリMMに格納する(図18(g))。なお、時刻T51、T52は、説明を分かりやすくするために分けているが、時刻T51に示す動作と、時刻T52に示す動作は、連続して実行される。
次に、時刻T60において、コアC0の処理がシングル処理ブロックSIB1の入口に到達し、未到達数X0が”2”に変更され、フラグレジスタZFが”0”にリセットされる(図18(h)、(i))。コアC0は、命令コードTEST&IDAを実行後、フラグレジスタSFが”1”で、フラグレジスタZFが”0”のため、シングル処理ブロックSIB1の出口に処理をジャンプさせ、通過数m0をインクリメントし、メインメモリMMに格納する(図18(j))。
次に、時刻T70において、コアC1、C2の処理がシングル処理ブロックSIB1の入口に到達する前に、コアC0が並列処理ブロックPAB2を完了し、シングル処理ブロックSIB2の入口に処理が到達する(図18(k)、(l))。コアC0は、図17の時刻T30のコアC3と同様に、未到達数X0の格納領域が空くのを待つ。
次に、時刻T80において、コアC1の処理がシングル処理ブロックSIB1の入口に到達し、コアC3の処理がシングル処理ブロックSIB2の入口に到達する(図18(m)、(n))。コアC3は、図17の時刻T30と同様に、未到達数X0の格納領域が空くのを待つ。なお、コアC0が、所定時間を待つ間に他の演算処理を実行した場合、フラグレジスタSF、ZFの値は不定*(”0”または”1”)になる。
次に、図19の時刻T91において、コアC2の処理がシングル処理ブロックSIB1の入口に到達する(図19(a))。コアC2は、未到達数X0を”0”に変更し、総通過数jを”2”に設定する(図19(b)、(c))。所定時間後に命令コードTEST&IDAを実行したコアC0は、”m0−j(=0)”がレジスタREGiの数I(”1”)より小さいため、フラグレジスタSFを”1”にセットする(図19(d))。
次に、時刻T92において、コアC0は、通過数m0(=2)をレジスタREGiの数I(=1)で除した余りi(=0)を算出し、未到達数X0の格納領域を使用することを決定する。そして、コアC0は、未到達数X0に”3”を設定し、フラグレジスタZFを”1”にセットする(図19(e)、(f))。コアC0は、命令コードTEST&IDAを実行後、フラグレジスタSF、ZFがともに”1”のため、シングル処理ブロックSIB1に処理をジャンプさせ、通過数m0をインクリメントし、メインメモリMMに格納する(図19(g)、(h))。
この後、通過数m3が”2”の状態で命令コードTEST&IDAを実行したコアC3は、”m3−j(=0)”がレジスタREGiの数I(”1”)より小さいため、フラグレジスタSFを”1”にセットする(図19(i))。また、コアC3は、未到達数X0を”2”に変更し、フラグレジスタZFを”0”にリセットする(図19(j)、(k))。なお、時刻T91、T92は、説明を分かりやすくするために分けているが、時刻T91に示す動作と、時刻T92に示す動作は、連続して実行される。
コアC3は、命令コードTEST&IDAを実行後、フラグレジスタSFが”1”で、フラグレジスタZFが”0”のため、シングル処理ブロックSIB1の出口に処理をジャンプさせ、通過数m0をインクリメントし、メインメモリMMに格納する(図19(l))。なお、シングル処理ブロックSIB2の入口に処理が到達しているコアC3がコアC0より先に命令コードTEST&IDAを実行した場合、コアC3の処理がシングル処理ブロックSIB1にジャンプし、コアC0の処理がシングル処理ブロックSIB1の出口にジャンプする。すなわち、コアC3は、時刻T91、T92に示すコアC0の動作を実行し、コアC0は、時刻T91、T92に示すコアC3の動作を実行する。
そして、時刻T100において、コアC0、C3は、並列処理ブロックPAB3を実行し、コアC1、C2は、並列処理ブロックPAB2を実行する。
以上、図17から図19に示す実施形態においても、CPUが、到達情報を保持するレジスタ部REGUを有するため、メインメモリMMに到達情報を格納する場合に比べて、到達情報にアクセスする時間を短くすることができる。この結果、複数のコアC0−C3が実行するスレッドの処理効率を向上することできる。
なお、図2から図19に示す実施形態は、複数のコアCをそれぞれに含む複数のCPUにより実現されてもよい。例えば、一方のCPUがコアC0、C1を含み、他方のCPUがコアC2、C3を含む場合、各CPUは、図4から図12および図17から図20と同様に動作する。
また、各コアCは、複数のスレッドを並列に実行してもよい。この場合、図2に示すコアC0が2つのスレッドを並列に実行し、図2に示すコアC1が2つのスレッドを実行する場合、図6から図10において、コアC2、C3の処理を、それぞれコアC0、C1の処理に置き換えることで、動作が実現される。同様に、図17から図19において、コアC2、C3の処理を、それぞれコアC0、C1の処理に置き換えることで、各コアCが複数のスレッドを並列に実行する動作が実現される。
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずである。したがって、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。