(57)【特許請求の範囲】
【請求項１】
複数の演算処理部と、前記複数の演算処理部により共有される保持部とを有する演算処理装置において、
前記複数の演算処理部の各々は、
スレッドを実行する実行部と、
各演算処理部が有する実行部のいずれかのみにより実行されるスレッドであるシングルスレッドに、前記各演算処理部が有する実行部のいずれかの実行による処理が到達した旨を示す到達情報を、前記保持部に保持させる制御部と、
前記保持部に保持された到達情報に基づき、前記シングルスレッドを前記実行部に実行させるかを判定する判定部を有することを特徴とする演算処理装置。
【請求項２】
前記複数の演算処理部のうち第１の演算処理部が有する前記判定部は、前記第１の演算処理部を除く演算処理部のいずれかの実行部により実行される処理が前記シングルスレッドのうち第１のシングルスレッドに到達する前に、前記第１の演算処理部の実行部が実行する処理が前記シングルスレッドのうち前記第１のシングルスレッドより後に実行される第２のシングルスレッドに到達したことを検出し、かつ、前記第２のシングルスレッドに対応する前記到達情報を格納する領域が前記保持部にない場合、前記第２のシングルスレッドの実行を保留させることを判定することを特徴とする請求項１記載の演算処理装置。
【請求項３】
前記保持部は、前記シングルスレッドに処理が到達した実行部の数を示す前記到達情報である到達数情報を、順次に実行される所定数の前記シングルスレッドのそれぞれに対応して保持する複数の到達数領域を有し、
前記複数の演算処理部のうち前記シングルスレッドに最後に処理が到達した実行部を含む演算処理部の前記制御部は、前記複数の到達数領域のうち最後に到達した前記シングルスレッドに対応する到達数領域を新たな到達情報を保持可能な状態に初期化することを特徴とする請求項１または請求項２記載の演算処理装置。
【請求項４】
前記保持部は、全ての前記実行部の処理が通過した前記シングルスレッドの数を示す前記到達情報である総通過数情報を保持する総通過数領域を有し、
前記複数の演算処理部の各々が有する前記判定部は、前記シングルスレッドを通過した数を前記複数の演算処理部毎に示す通過数情報と前記総通過数情報との差が前記到達数領域の数以上の場合、前記通過数情報に対応する前記シングルスレッドの実行を保留させることを判定することを特徴とする請求項３記載の演算処理装置。
【請求項５】
前記複数の演算処理部のうち、前記シングルスレッドに最後に処理が到達した実行部を含む演算処理部の前記制御部は、前記シングルスレッドへの処理の到達に基づいて、前記総通過数領域が保持する前記総通過数情報が示す数を増加させることを特徴とする請求項４記載の演算処理装置。
【請求項６】
前記複数の演算処理部のうち、前記シングルスレッドの非実行を判定した前記判定部を含む演算処理部の前記実行部は、前記シングルスレッドの出口に処理をジャンプすることを特徴とする請求項１ないし請求項５のいずれか１項記載の演算処理装置。
【請求項７】
前記複数の演算処理部の各々は、
プログラムに含まれる命令コードをデコードするデコード部と、
前記デコード部がデコードした命令コードに基づいて動作する演算部を有し、
前記制御部の動作は、前記複数の演算処理部の各々が実行するプログラムに含まれる命令のうち、前記シングルスレッドに処理が到達した場合にフェッチされる命令コードに基づいて動作する前記演算部により実現されることを特徴とする請求項１ないし請求項６のいずれか１項記載の演算処理装置。
【請求項８】
複数の演算処理部と、前記複数の演算処理部により共有される保持部とを有する演算処理装置の制御方法において、
前記複数の演算処理部の各々が有する実行部が、スレッドを実行し、
前記複数の演算処理部の各々が有する制御部が、各演算処理部が有する実行部のいずれかのみにより実行されるスレッドであるシングルスレッドに、前記各演算処理部が有する実行部のいずれかの実行による処理が到達した旨を示す到達情報を、前記保持部に保持させ、
前記複数の演算処理部の各々が有する判定部が、前記保持部に保持された到達情報に基づき、前記シングルスレッドを前記実行部に実行させるかを判定することを特徴とする演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置および演算処理装置の制御方法に関する。
【背景技術】
【０００２】
並列に動作する複数のプロセッサを含む並列コンピュータは、処理の単位であるタスクを複数のスレッドに分割し、分割したスレッドを複数のプロセッサに実行させることで、処理効率を向上させている。また、複数のコアを有するＣＰＵ（Central Processing Unit）等の演算処理装置は、並列コンピュータの１つである。
【０００３】
この種の並列コンピュータにおいて、プログラムの開始から終了まで起動し続けるスレッドに割り当てられる記憶領域に、他のスレッドで使用する変数を格納する手法が提案されている（例えば、特許文献１参照）。これにより、並列に実行される他のスレッドが終了した場合にも、他のスレッドで使用された変数は、プログラムの実行中に失われることなく記憶領域に保持される。
【０００４】
また、スレッドが、メインメモリに割り当てられたフラグに設定される値に基づいて、他のスレッドによる命令コードの実行が完了するまで同期処理を待ち、命令コードの実行が完了した後に同期処理を実行する手法が提案されている（例えば、特許文献２参照）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００２−９９４２６号公報
【特許文献２】特開２０１１−１３４１４５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
複数のスレッドで使用する記憶領域は、複数のスレッドからのアクセスを可能にするために、メインメモリ等の外部記憶装置に割り当てられる。このため、記憶領域のアクセスに掛かるサイクル数は、演算処理装置内に設けられるレジスタ等のアクセスに掛かるサイクル数より多くなり、アクセス効率は低くなる。この結果、複数のスレッドを並列に実行する場合の処理効率は低下するおそれがある。
【０００７】
本件開示の演算処理装置および演算処理装置の制御方法は、演算処理装置が有する複数の演算処理部が実行するスレッドの処理効率を向上することを目的とする。
【課題を解決するための手段】
【０００８】
一つの観点によれば、演算処理装置は、複数の演算処理部と、複数の演算処理部により共有される保持部とを有し、複数の演算処理部の各々は、スレッドを実行する実行部と、各演算処理部が有する実行部のいずれかのみにより実行されるスレッドであるシングルスレッドに、各演算処理部が有する実行部のいずれかの実行による処理が到達した旨を示す到達情報を、保持部に保持させる制御部と、保持部に保持された到達情報に基づき、シングルスレッドを実行部に実行させるかを判定する判定部を有する。
【０００９】
別の観点によれば、複数の演算処理部と、複数の演算処理部により共有される保持部とを有する演算処理装置の制御方法は、複数の演算処理部の各々が有する実行部が、スレッドを実行し、複数の演算処理部の各々が有する制御部が、各演算処理部が有する実行部のいずれかのみにより実行されるスレッドであるシングルスレッドに、各演算処理部が有する実行部のいずれかの実行による処理が到達した旨を示す到達情報を、保持部に保持させ、複数の演算処理部の各々が有する判定部が、保持部に保持された到達情報に基づき、シングルスレッドを実行部に実行させるかを判定する。
【発明の効果】
【００１０】
本件開示の演算処理装置および演算処理装置の制御方法は、演算処理装置が有する複数の演算処理部が実行するスレッドの処理効率を向上することできる。
【図面の簡単な説明】
【００１１】
【図１】演算処理装置および演算処理装置の制御方法の一実施形態を示す図である。
【図２】演算処理装置および演算処理装置の制御方法の別の実施形態を示す図である。
【図３】図２に示すＣＰＵが実行する処理の例を示す図である。
【図４】図２に示す各コアが、シングル処理ブロックの入口で実行する処理の例を示す図である。
【図５】図４に示す命令コードＴＥＳＴ＆ＩＤＡにより実行される処理の例を示す図である。
【図６】図２に示すＣＰＵの動作の例を示す図である。
【図７】図６の動作の続きを示す図である。
【図８】図７の動作の続きを示す図である。
【図９】図８の動作の続きを示す図である。
【図１０】図９の動作の続きを示す図である。
【図１１】図２に示すＣＰＵの動作の別の例を示す図である。
【図１２】図１１の動作の続きを示す図である。
【図１３】図２に示すＣＰＵが実行するプログラムの例を示す図である。
【図１４】図２に示すＣＰＵが実行するプログラムの別の例を示す図である。
【図１５】図２に示すＣＰＵが実行するプログラムの別の例を示す図である。
【図１６】演算処理装置および演算処理装置の制御方法の別の実施形態を示す図である。
【図１７】図１６に示すＣＰＵの動作の例を示す図である。
【図１８】図１７の動作の続きを示す図である。
【図１９】図１８の動作の続きを示す図である。
【発明を実施するための形態】
【００１２】
以下、図面を用いて実施形態を説明する。信号が伝達される信号線は、信号名と同じ符号を使用して説明される。
【００１３】
図１は、演算処理装置および演算処理装置の制御方法の一実施形態を示す。図１に示す演算処理装置は、複数の演算処理部１０、２０および保持部３０を有する。演算処理部１０は、実行部１２、制御部１４および判定部１６を有し、演算処理部２０は、実行部２２、制御部２４および判定部２６を有する。例えば、演算処理装置はＣＰＵであり、演算処理部１０、２０は、ＣＰＵに搭載されるコアである。
【００１４】
実行部１２、２２は、複数のスレッドを並列に実行することができ、あるいは１つのスレッドを単独で実行することができる。保持部３０は、演算処理部１０、２０のそれぞれから共有され、実行部１２、２２の各々が実行する処理がシングルスレッドＳＴＨ（ＳＴＨ０またはＳＴＨ１）に到達したことを示す到達情報を保持する。シングルスレッドＳＴＨは、実行部１２、２２のいずれかのみが排他的に実行するスレッドである。例えば、演算処理部１０の実行部１２がシングルスレッドＳＴＨを実行した場合、他方の演算処理部２０の実行部２２は、シングルスレッドＳＴＨを実行せずにスキップすることになる。図１に示す例では、保持部３０は、１つのシングルスレッドＳＴＨに対応する到達情報を保持する。
【００１５】
制御部１４、２４の各々は、実行部１２、２２の処理がシングルスレッドＳＴＨの入口に到達した場合に、到達情報を保持部３０に格納する。判定部１６、２６の各々は、保持部３０に保持された到達情報に基づき、シングルスレッドを実行部１２、２２に実行させるかを判定する。
【００１６】
図１の下側は、スレッドＰＴＨ０が実行部１２、２２により並列に実行された後、シングルスレッドＳＴＨ０が実行部２２により実行され、さらに、スレッドＰＴＨ１が実行部１２、２２により並列に実行された後、シングルスレッドＳＴＨ１が実行部２２により実行される例を示す。符号Ｔ０、Ｔ１、Ｔ２、Ｔ３、Ｔ４、Ｔ５は、時刻を示しており、実行部２２による処理は、実行部１２による処理より早く進むことが分かる。
【００１７】
時刻Ｔ０、Ｔ１では、実行部１２、２２のいずれの処理もシングルスレッドＳＴＨ０の入口に到達していないため、保持部３０は、「シングルスレッドＳＴＨ０に処理が到達した実行部なし」を示す到達情報を保持する。
【００１８】
時刻Ｔ２において、実行部２２が実行する処理がシングルスレッドＳＴＨ０の入口に到達し、制御部２４は、「シングルスレッドＳＴＨ０に実行部２２の処理が到達」を示す到達情報を保持部３０に格納する。保持部３０は、演算処理装置内に設けられるため、到達情報の格納に掛かる時間は、演算処理装置の外部の記憶装置等に到達情報を格納する時間に比べて短い。シングルスレッドＳＴＨ０の入口に処理が到達した実行部２２を含む演算処理部２０の判定部２６は、シングルスレッドＳＴＨ０に対する到達情報が保持部３０に保持されていることに基づき、シングルスレッドＳＴＨ０を実行部２２に実行させる。次に、時刻Ｔ３において、実行部１２は、スレッドＰＴＨ０を実行し、実行部２２は、スレッドＰＴＨ１を実行する。
【００１９】
時刻Ｔ４において、実行部２２が実行する処理がシングルスレッドＳＴＨ１の入口に到達する。しかし、保持部３０が保持する到達情報は、「シングルスレッドＳＴＨ０に実行部２２の処理が到達」（すなわち、実行部１２の処理は、シングルスレッドＳＴＨ０の入口に未到達）を示している。保持部３０が保持可能な到達情報は、１つのシングルスレッドＳＴＨに対応する情報であるため、演算処理部２０の制御部２４は、「シングルスレッドＳＴＨ１に実行部２２の処理が到達」を示す到達情報を保持部３０に格納しない。シングルスレッドＳＴＨ１に対する到達情報が保持部３０に保持されないため、演算処理部２０の判定部２６は、シングルスレッドＳＴＨ１の実行部２２による実行を保留させることを判定する。
【００２０】
すなわち、判定部２６は、実行部１２が実行する処理がシングルスレッドＳＴＨ０の入口に到達する前に、実行部２２が実行する処理がシングルスレッドＳＴＨ０より後に実行されるシングルスレッドＳＴＨ１の入口に到達したことを検出する。そして、シングルスレッドＳＴＨ１に対応する到達情報を格納する領域が保持部３０にない場合、実行部２２は、シングルスレッドＳＴＨ１の実行を保留する。
【００２１】
次に、時刻Ｔ５において、実行部１２が実行する処理がシングルスレッドＳＴＨ０の入口に到達する。演算処理部１０の判定部１６は、保持部３０が保持する到達情報を参照し、全ての実行部１２、２２の処理がシングルスレッドＳＴＨ０の入口に到達したことを判定する。また、判定部１６は、保持部３０が保持する到達情報に基づき、既に他の演算処理部２０の実行部２２がシングルスレッドＳＴＨ０を実行済みであることを検出し、実行部１２が実行する処理をシングルスレッドＳＴＨ０の入口から出口にジャンプさせる。これにより、実行部１２によるシングルスレッドＳＴＨ０の実行はスキップされる。
【００２２】
到達情報の参照に掛かる時間は、演算処理装置の外部の記憶装置等に保持された到達情報を参照する時間に比べて短い。そして、演算処理部１０の制御部１４は、保持部３０が保持する到達情報を、「シングルスレッドＳＴＨ１に処理が到達した実行部なし」に初期化する。
【００２３】
この後、演算処理部２０の制御部２４は、保持部３０に保持された到達情報を参照し、シングルスレッドＳＴＨ１に対する到達情報が保持されているため、「シングルスレッドＳＴＨ１に実行部２２の処理が到達」を示す到達情報を保持部３０に格納する。そして、演算処理部２０の判定部２６は、シングルスレッドＳＴＨ１に対する到達情報が保持部３０に保持されていることに基づき、シングルスレッドＳＴＨ１を実行部２２に実行させる。
【００２４】
以上、図１に示した実施形態では、演算処理装置が到達情報を保持する保持部３０を有するため、演算処理装置の外部の記憶装置等に到達情報を格納する場合に比べて、到達情報にアクセスする時間を短くすることができる。ここで、アクセス時間は、到達情報を保持部３０に格納する格納時間および到達情報を保持部３０から読み出す読み出し時間である。これにより、演算処理部１０、２０は、シングルスレッドＳＴＨ０（またはＳＴＨ１）への到達を示す到達情報の保持部３０への格納時間を短くすることができ、シングルスレッドＳＴＨ０（またはＳＴＨ１）の実行の可否を判定する時間を短くすることができる。この結果、スレッドＰＴＨ０、ＳＴＨ０、ＰＴＨ１、ＳＴＨ１の処理効率を向上することができる。
【００２５】
演算処理部２０の判定部２６は、「シングルスレッドＳＴＨ１に演算処理部２０の処理が到達」を示す到達情報を保持部３０が保持していない場合、シングルスレッドＳＴＨ１の実行部２２による実行を保留させることを判定する。新たな到達情報を格納する領域が保持部３０にない場合、シングルスレッドＳＴＨ１の実行を保留することで、保持部３０の記憶容量に応じてシングルスレッドＳＴＨの実行の可否を制御することができる。
【００２６】
図２は、演算処理装置および演算処理装置の制御方法の別の実施形態を示す。図２に示すＣＰＵは、複数のコアＣ（Ｃ０、Ｃ１、Ｃ２、Ｃ３）、キャッシュメモリＣＭおよびレジスタ部ＲＥＧＵを有する。コアＣは、互いに同一または同様の構成であるため、図２では、コアＣ０の構成を示し、以下では、コアＣ０の構成が説明される。なお、コアＣの数は、４つに限定されない。ＣＰＵは、演算処理装置の一例であり、コアＣは、演算処理部の一例である。ＣＰＵは、メインメモリＭＭに接続され、ＣＰＵとメインメモリＭＭとにより、情報処理システムＳＹＳが構築される。
【００２７】
コアＣ０は、演算部ＯＰＵ、データレジスタ部ＤＲＥＧ、アドレスレジスタ部ＡＲＥＧ、プログラムカウンタＰＣ、インクリメンタＩＮＣ、命令レジスタ部ＩＲＥＧ、デコーダ部ＤＥＣおよびセレクタＳ１、Ｓ２を有する。演算部ＯＰＵは、レジスタファイルＲＥＧ、演算器ＥＸおよびフラグレジスタＳＦ、ＺＦを有する。演算部ＯＰＵは、スレッドを実行する実行部の一例である。
【００２８】
プログラムカウンタＰＣは、セレクタＳ１から受けるアドレスをインクリメンタＩＮＣおよびセレクタＳ２に出力する。インクリメンタＩＮＣは、プログラムカウンタＰＣから受けるアドレスをインクリメントし、インクリメントしたアドレスをセレクタＳ１に出力する。
【００２９】
セレクタＳ１は、命令コードを順次にフェッチする場合、インクリメンタＩＮＣからのアドレスを選択し、分岐命令またはジャンプ命令等が実行される場合、演算部ＯＰＵからのアドレスを選択する。そして、セレクタＳ１は、選択したアドレスをプログラムカウンタＰＣに出力する。セレクタＳ２は、命令コードをフェッチする場合、プログラムカウンタＰＣから出力されるアドレスを選択し、ロード命令またはストア命令を実行する場合、アドレスレジスタ部ＡＲＥＧから出力されるアドレスを選択する。そして、セレクタＳ２は、選択したアドレスを、アドレスバスＡＤ０を介してキャッシュメモリＣＭに出力する。
【００３０】
コアＣ０が命令をフェッチする場合、アドレスＡＤ０に応じて、キャッシュメモリＣＭから命令コードが読み出され、読み出された命令コードがデータバスＤＩＮを介して命令レジスタ部ＩＲＥＧに格納される。キャッシュメモリＣＭが命令コードを保持していない場合、キャッシュメモリＣＭは、アドレスバスＡＤ１を介してメインメモリＭＭにアドレスを出力し、データバスＤＴを介してメインメモリＭＭから命令コードを受ける。例えば、アドレスＡＤ１は、アドレスＡＤ０の上位アドレスであり、キャッシュメモリＣＭの１キャッシュライン分の命令コード（プログラム）がメインメモリＭＭから読み出される。そして、キャッシュメモリＣＭは、メインメモリＭＭから読み出した命令コードを保持するとともに、保持した命令コードのうち読み出し対象の命令コードを、データバスＤＩＮを介して命令レジスタ部ＩＲＥＧに出力する。
【００３１】
コアＣ０がロード命令を実行する場合、アドレスＡＤ０に応じて、キャッシュメモリＣＭからデータが読み出され、読み出されたデータがデータバスＤＩＮを介してレジスタファイルＲＥＧに格納される。キャッシュメモリＣＭがロード命令の対象のデータを保持していない場合、命令コードの読み出しと同様に、キャッシュメモリＣＭは、メインメモリＭＭから１キャッシュライン分のデータを読み出す。そして、キャッシュメモリＣＭは、メインメモリＭＭから読み出したデータを保持するとともに、保持したデータのうちロード対象のデータを、データバスＤＩＮを介してレジスタファイルＲＥＧに出力する。
【００３２】
コアＣ０がストア命令を実行する場合、アドレスバスＡＤ０に出力されたアドレスに応じて、データレジスタ部ＤＲＥＧからデータバスＤＯＵＴに出力されたデータがキャッシュメモリＣＭに書き込まれる。
【００３３】
命令レジスタ部ＩＲＥＧは、キャッシュメモリＣＭから受ける命令コードを保持する複数の領域を有し、保持している命令コードをデコーダ部ＤＥＣに順次に出力する。デコーダ部ＤＥＣは、命令レジスタ部ＩＲＥＧから受ける命令コードをデコードし、デコード結果に基づいて、演算部ＯＰＵおよびセレクタＳ１、Ｓ２等の動作を制御する制御信号を生成する。
【００３４】
データレジスタ部ＤＲＥＧは、ストア命令の実行時に演算部ＯＰＵから出力されるデータを保持する複数の領域を有する。アドレスレジスタ部ＡＲＥＧは、ロード命令またはストア命令の実行時に演算部ＯＰＵから出力されるアドレスを保持する複数の領域を有する。
【００３５】
レジスタファイルＲＥＧは、キャッシュメモリＣＭから読み出されるデータまたは演算器ＥＸから出力されるデータを保持する複数のレジスタを有する。レジスタファイルＲＥＧは、デコーダ部ＤＥＣからの制御信号に基づいて、レジスタファイルＲＥＧの複数のレジスタの少なくともいずれかに保持しているデータを演算器ＥＸに出力する。
【００３６】
演算器ＥＸは、デコーダ部ＤＥＣがデコードした命令コードにしたがって演算を実行し、演算結果をレジスタファイルＲＥＧ、データレジスタ部ＤＲＥＧ、アドレスレジスタ部ＡＲＥＧまたはセレクタＳ１に出力する。また、演算器ＥＸは、演算結果に基づいてフラグレジスタＳＦ、ＺＦをセットまたはリセットし、論理演算命令または分岐命令等を実行する場合にフラグレジスタＳＦ、ＺＦの値を参照する。なお、演算部ＯＰＵは、フラグレジスタＳＦ、ＺＦ以外のフラグレジスタを有してもよい。
【００３７】
レジスタ部ＲＥＧＵは、複数のレジスタＲＥＧｉ（ｉは０、１、２、３、４のいずれか）と、レジスタＲＥＧｊとを有する。なお、レジスタＲＥＧｉの記憶領域の数Ｉは、”５”に限定されず、”１”以上であればよい。但し、図９等で説明するように、レジスタＲＥＧｉの記憶領域の数Ｉが大きい程、複数のコアＣにおける処理の進行度合いの差を大きくすることができ、ＣＰＵの処理効率を向上することができる。レジスタ部ＲＥＧＵは、コアＣ０−Ｃ３の各々が実行する処理が、シングル処理ブロックＳＩＢの入口へ到達したことを示す到達情報を保持する保持部の一例である。
【００３８】
図２では、各レジスタＲＥＧｉに保持される値は、符号Ｘｉ（Ｘ０からＸ４のいずれか）で示される。例えば、各レジスタＲＥＧｉのビット幅とレジスタＲＥＧｊのビット幅とは、互いに等しい。
【００３９】
レジスタＲＥＧｉ、ＲＥＧｊは、各コアＣ０−Ｃ３が図５に示す命令コードＴＥＳＴ＆ＩＤＡ（TEST & Increment, Decrement and Assignment）を実行する場合にアクセスされる。レジスタＲＥＧｉは、図３に示す処理の進行とともに、巡回的に使用され、各レジスタＲＥＧｉには、図３に示すシングル処理ブロックＳＩＢの入口に到達していないスレッドＴＨの数である未到達数Ｘｉが格納される。なお、コアＣ０−Ｃ３の数（＝４）から未到達数Ｘｉを減じた値は、シングル処理ブロックＳＩＢの入口に到達したスレッドＴＨの数を示す。すなわち、未到達数Ｘｉは、シングル処理ブロックＳＩＢの入口に処理が到達したコアＣ０−Ｃ３の数を示す到達数情報の一例である。なお、各レジスタＲＥＧｉには、シングル処理ブロックＳＩＢの入口に到達したスレッドＴＨの数が格納されてもよい。レジスタ部ＲＥＧＵのレジスタＲＥＧｉにおいて、未到達数Ｘｉがそれぞれ格納される領域は、到達数領域の一例である。
【００４０】
レジスタＲＥＧｊには、全てのスレッドＴＨが通過したシングル処理ブロックＳＩＢの総数である総通過数ｊが格納される。総通過数ｊは、全てのコアＣ０−Ｃ３の処理が通過したシングル処理ブロックＳＩＢの数を示す総通過数情報の一例である。レジスタＲＥＧｊは、総通過数情報を保持する総通過数領域の一例である。レジスタＲＥＧｉ、ＲＥＧｊの使用方法は、図５から図１２で説明する。
【００４１】
命令コードＴＥＳＴ＆ＩＤＡは、加算命令、乗算命令、ロード命令、ストア命令などと同様に、演算器ＥＸがマイクロプログラムを実行することで処理される。なお、命令コードＴＥＳＴ＆ＩＤＡを実行する演算器ＥＸの動作は、ワイヤードロジックで実現されてもよい。しかしながら、マイクロプログラム方式を採用することで、命令コードＴＥＳＴ＆ＩＤＡを、ワイヤードロジック方式に比べて容易に追加することができ、ハードウェア機能（命令セットのアーキテクチャ）を容易に変更することができる。
【００４２】
キャッシュメモリＣＭは、命令キャッシュおよびデータキャッシュとして動作する。なお、キャッシュメモリＣＭは、コアＣ毎に設けられてもよく、一次キャッシュおよび二次キャッシュを含んでもよい。メインメモリＭＭは、ＳＤＲＡＭ（Synchronous Dynamic Random Access Memory）またはフラッシュメモリを含むメモリモジュール等であり、ＣＰＵが実行するプログラムと、ＣＰＵが扱うデータとを記憶する。メインメモリＭＭは、コアＣの数を示すコア数ｎを保持する記憶領域と、コアＣ０−Ｃ３のそれぞれが図３に示すシングル処理ブロックＳＩＢを通過した数を示す通過数ｍ（ｍ０、ｍ１、ｍ２、ｍ３）を保持する記憶領域とを有する。コア数ｎおよび通過数ｍは、キャッシュメモリＣＭにも保持される。キャッシュメモリＣＭがコア数ｎおよび通過数ｍを保持する場合、各コアは、メインメモリＭＭにアクセスすることなく、キャッシュメモリＣＭにアクセスすることで、コア数ｎおよび通過数ｍを参照することができ、また、通過数ｍを書き替えることができる。
【００４３】
図３は、図２に示すＣＰＵが実行する処理の例を示す。図３に示す例では、ＣＰＵは、コアＣ０−Ｃ３のそれぞれで複数のスレッドＴＨを並列に実行し（並列処理ブロックＰＡＢ）、コアＣ０−Ｃ３のいずれかでシングルスレッドであるスレッドＴＨを実行する（シングル処理ブロックＳＩＢ）。シングルスレッドは、コアＣ０−Ｃ３のいずれかのみが排他的に実行するスレッドである。なお、図３では、シングル処理ブロックＳＩＢと並列処理ブロックＰＡＢとが交互に繰り返されるが、所定数のシングル処理ブロックＳＩＢまたは所定数の並列処理ブロックＰＡＢが連続して実行されてもよい。また、図２に示すコアＣ０−Ｃ３は、１つのスレッドＴＨを実行する機能を有するため、図３に示すスレッドＴＨは、コアＣと表記されてもよい。
【００４４】
シングル処理ブロックＳＩＢは、１つのスレッドが実行する処理ブロックである。シングル処理ブロックＳＩＢを実行するスレッドＴＨは、図２に示すレジスタＲＥＧｉに空き領域がない場合を除き、他のスレッドＴＨによる並列処理ブロックＰＡＢの完了を待つことなく、シングル処理ブロックＳＩＢを実行可能である。シングル処理ブロックＳＩＢを実行するスレッドＴＨは、複数のコアＣ０−Ｃ３のいずれかが実行するスレッドであるシングルスレッドの一例である。
【００４５】
各スレッドＴＨは、シングル処理ブロックＳＩＢの入口に到達した場合、命令コードＴＥＳＴ＆ＩＤＡを実行する。命令コードＴＥＳＴ＆ＩＤＡの”ｎ”と”ｍ”は、オペランド（変数）であり、メインメモリＭＭまたはキャッシュメモリＣＭに保持されるコア数ｎおよび通過数ｍである。
【００４６】
各スレッドＴＨは、命令コードＴＥＳＴ＆ＩＤＡの実行に基づいて設定されるフラグレジスタＳＦ、ＺＦの値に基づいて、シングル処理ブロックＳＩＢを実行するか、シングル処理ブロックＳＩＢを実行せずに通過するかを判定する。各スレッドＴＨが実行する判定処理の例は、図４に示す。シングル処理ブロックＳＩＢおよび並列処理ブロックＰＡＢの例は、図１３から図１５に示す。
【００４７】
図４は、図２に示す各コアＣが、シングル処理ブロックＳＩＢの入口で実行する処理の例を示す。図４は、ソースプログラムをコンパイルすることで得られるオブジェクトプログラムの内容をフローチャートで示している。すなわち、図４に示す処理は、各コアＣの演算部ＯＰＵが、メインメモリＭＭに格納されているオブジェクトプログラムを実行することで実現される。図４に示す処理を実行する各コアＣの演算部ＯＰＵは、レジスタ部ＲＥＧＵに保持された未到達数Ｘｉおよび総通過数ｊに基づきシングル処理ブロックＳＩＢの実行を判定する判定部の一例である。
【００４８】
コアＣは、シングル処理ブロックＳＩＢの入口へ到達した場合、ステップＳ２０２において、コア数ｎおよび通過数ｍをメインメモリＭＭからロードするロード命令を実行する。キャッシュメモリＣＭがコア数ｎおよび通過数ｍを保持している場合、コア数ｎおよび通過数ｍは、キャッシュメモリＣＭから読み出される。
【００４９】
次に、ステップＳ１００において、コアＣは、メインメモリＭＭからロードしたコア数ｎおよび通過数ｍを変数として、命令コードＴＥＳＴ＆ＩＤＡを実行する。命令コードＴＥＳＴ＆ＩＤＡにより実行される処理の例は、図５に示す。
【００５０】
次に、ステップＳ２０４において、コアＣは、命令コードＴＥＳＴ＆ＩＤＡの実行後にフラグレジスタＳＦの値が”１”の場合、レジスタＲＥＧｉに空きがあると判断し、処理をステップＳ２０８に移行する。コアＣは、命令コードＴＥＳＴ＆ＩＤＡを実行した後のフラグレジスタＳＦの値が”１”でない場合（すなわち、”０”）、レジスタＲＥＧｉに空きがないと判断し、処理をステップＳ２０６に移行する。
【００５１】
ステップＳ２０６において、コアＣは、所定時間を待った後、処理をステップＳ１００に戻す。なお、ステップＳ２０６において、コアＣは、所定時間を待つ間、他の処理を実行してもよい。
【００５２】
ステップＳ２０８において、コアＣは、命令コードＴＥＳＴ＆ＩＤＡの実行後にフラグレジスタＺＦの値が”１”の場合、シングル処理ブロックＳＩＢの入口に最初に到達したと判断し、処理をステップＳ２１０に移行する。コアＣは、命令コードＴＥＳＴ＆ＩＤＡの実行後にフラグレジスタＺＦの値が”１”でない場合（すなわち、”０”）、シングル処理ブロックＳＩＢの入口に他のスレッドが先に到達したと判断し、処理をステップＳ２１２に移行する。
【００５３】
ステップＳ２１０において、コアＣの処理は、シングル処理ブロックＳＩＢへジャンプし、コアＣは、シングル処理ブロックＳＩＢを実行する。ステップＳ２１２において、コアＣの処理は、シングル処理ブロックＳＩＢの出口へ処理をジャンプし、コアＣは、シングル処理ブロックＳＩＢを実行することなく、次の処理を開始する。すなわち、シングル処理ブロックＳＩＢの非実行を判定したコアＣは、シングル処理ブロックＳＩＢの出口に処理をジャンプする。これにより、シングル処理ブロックＳＩＢが複数のコアＣにより実行されることを抑止することができ、ＣＰＵが誤動作することを抑止することができる。ステップＳ２１０、Ｓ２１２の実行後、処理はステップＳ２１４に移行される。
【００５４】
ステップＳ２１４において、コアＣは、ステップＳ２０２でメインメモリＭＭからロードした通過数ｍを”１”増加させる。次に、ステップＳ２１６において、コアＣは、ステップＳ２１４で増加させた通過数ｍをメインメモリＭＭにストアするストア命令を実行する。キャッシュメモリＣＭが通過数ｍを保持している場合、通過数ｍは、キャッシュメモリＣＭに保持された後、メインメモリＭＭに格納される。そして、コアＣが実行する処理が終了する。
【００５５】
図５は、図４に示す命令コードＴＥＳＴ＆ＩＤＡにより実行される処理の例を示す。図５に示す処理は、図２に示す演算器ＥＸが、命令コードＴＥＳＴ＆ＩＤＡに対応するマイクロプログラムを実行することで実現される。図５に示す命令コードＴＥＳＴ＆ＩＤＡを実行する演算器ＥＸは、シングル処理ブロックＳＩＢの入口へ処理が到達した場合に、未到達数Ｘｉまたは総通過数ｊをレジスタ部ＲＥＧＵに格納する制御部の一例である。
【００５６】
まず、ステップＳ１０２において、演算器ＥＸは、通過数ｍと総通過数ｊとの差がレジスタＲＥＧｉの数Ｉ（図２では、”５”）より小さい場合、使用可能なレジスタＲＥＧｉがあるため、処理をステップＳ１０４に移行する。演算器ＥＸは、通過数ｍと総通過数ｊとの差がレジスタＲＥＧｉの数Ｉ以上の場合、使用可能なレジスタＲＥＧｉがないため、処理をステップＳ１１４に移行する。
【００５７】
ステップＳ１０４において、演算器ＥＸは、シングル処理ブロックＳＩＢの入口へ処理が到達したことを示すために、フラグレジスタＳＦを”１”にセットし、処理をステップＳ１０６に移行する。ステップＳ１０６において、演算器ＥＸは、通過数ｍをレジスタＲＥＧｉの数Ｉで除した余りｉを算出し（”ｍ％Ｉ”）、算出した余りｉを、使用するレジスタＲＥＧｉの番号ｉとし、処理をステップＳ１０８に移行する。
【００５８】
ステップＳ１０８において、演算器ＥＸは、ステップＳ１０６で求めたレジスタＲＥＧｉに格納された未到達数Ｘｉが”０”の場合、最初にシングル処理ブロックＳＩＢの入口へ処理が到達したと判断し、処理をステップＳ１１０に移行する。一方、演算器ＥＸは、未到達数Ｘｉが”０”でない場合、他のコアＣの処理がシングル処理ブロックＳＩＢの入口へ到達済みであると判断し、処理をステップＳ１１６に移行する。
【００５９】
ステップＳ１１０において、演算器ＥＸは、コア数ｎ（図２では、”４”）から”１”を引いた値を、未到達数ＸｉとしてレジスタＲＥＧｉに格納し、処理をステップＳ１１２に移行する。ステップＳ１１２において、演算器ＥＸは、シングル処理ブロックＳＩＢの入口へ処理が最初に到達したことを示すために、フラグレジスタＺＦを”１”にセットし、処理を終了する。
【００６０】
他のコアＣの処理がシングル処理ブロックＳＩＢの入口へ到達済みの場合、ステップＳ１１６において、演算器ＥＸは、未到達数Ｘｉを”１”減らし、処理をステップＳ１１８に移行する。ステップＳ１１８において、演算器ＥＸは、シングル処理ブロックＳＩＢの入口へ処理が最初に到達していないことを示すために、フラグレジスタＺＦを”０”にリセットし、処理をステップＳ１２０に移行する。
【００６１】
ステップＳ１２０において、演算器ＥＸは、未到達数Ｘｉが”０”の場合、シングル処理ブロックＳＩＢの入口へ処理が最後に到達したと判断し、処理をステップＳ１２２に移行する。演算器ＥＸは、未到達数Ｘｉが”０”でない場合、シングル処理ブロックＳＩＢの入口へ処理が到達していない他のコアＣがあると判断し、処理を終了する。ステップＳ１２２において、演算器ＥＸは、全てのコアＣの処理がシングル処理ブロックＳＩＢの入口へ到達したため、総通過数ｊを”１”増加させ、処理を終了する。
【００６２】
一方、使用可能なレジスタＲＥＧｉがない場合、ステップＳ１１４において、演算器ＥＸは、シングル処理ブロックＳＩＢの入口へ処理が到達していないことを擬似的に示すために（実際には到達しているが）、フラグレジスタＳＦを”０”にセットし、処理を終了する。
【００６３】
このように、ステップＳ１１０、Ｓ１１２は、シングル処理ブロックＳＩＢの入口へ処理が最初に到達したコアＣが実行する処理である。ステップＳ１１６からステップＳ１２２は、シングル処理ブロックＳＩＢの入口へ処理が２番目以降に到達したコアＣが実行する処理である。さらに、ステップＳ１２２は、シングル処理ブロックＳＩＢの入口へ最後に処理が到達したコアＣが実行する処理である。ステップＳ１１４は、レジスタＲＥＧｉに空きがない場合にコアＣが実行する処理である。
【００６４】
図６から図１０は、図２に示すＣＰＵの動作の例を示す。図６から図１０では、図３と同様に、シングル処理ブロックＳＩＢと並列処理ブロックＰＡＢとが交互に実行される。
【００６５】
フラグレジスタＳＦ、ＺＦの”＊”は、”０”または”１”を示す。矢印が示す破線は、シングル処理ブロックＳＩＢ（ＳＩＢ０−ＳＩＢ６）を示し、シングル処理ブロックＳＩＢの上または下は、並列処理ブロックＰＡＢ（ＰＡＢ０−ＰＡＢ６）を示す。シングル処理ブロックＳＩＢ０−ＳＩＢ６に併記したレジスタＲＥＧｉの番号ｉは、図５に示すステップＳ１０６で算出され、”０”から”４”のいずれかに巡回的に割り当てられる。
【００６６】
各コアＣが実行する処理は、図６から図１０において、上から下に向けて進行する。各コアＣの進行ライン（図の縦方向の点線）上に示す小さい黒丸は、処理中の位置を示す。小さい黒丸をつなぐ折れ線は、図１と同様に任意の時刻を示し、コアＣが実行する処理の進行状況の差を分かりやすくするために便宜上付加した。シングル処理ブロックＳＩＢを示す破線上の白丸は、シングル処理ブロックＳＩＢの入口に最初に到達したコアＣがシングル処理ブロックＳＩＢを実行したことを示す。
【００６７】
まず、時刻Ｔ０において、各コアＣ０−Ｃ３が並列処理ブロックＰＡＢ０を開始する。初期状態において、レジスタＲＥＧｉ、ＲＥＧｊおよび通過数ｍ０−ｍ３は、０に初期化されている。
【００６８】
時刻Ｔ１０において、コアＣ３が並列処理ブロックＰＡＢ０の実行を完了し、シングル処理ブロックＳＩＢ０の入口に最初に到達し、命令コードＴＥＳＴ＆ＩＤＡを実行する（図６（ａ））。コアＣ３の処理がシングル処理ブロックＳＩＢの入口に到達する前、通過数ｍ３および総通過数ｊは、”０”であり、”ｍ３−ｊ（＝０）”は、レジスタＲＥＧｉの数Ｉ（”４”）より小さい。このため、図５に示すステップＳ１０２において、レジスタＲＥＧｉに空きがあると判定され、図５に示すステップＳ１０４において、フラグレジスタＳＦは”１”にセットされる（図６（ｂ））。
【００６９】
また、シングル処理ブロックＳＩＢ０の入口に処理が到達する前、レジスタＲＥＧｉの未到達数Ｘ０は”０”に初期化されているため、コアＣ３の処理がシングル処理ブロックＳＩＢの入口へ最初に到達したと判定される。このため、図５に示すステップＳ１１０において、未到達数Ｘ０が”３”（コア数−１）に設定され、ステップＳ１１２において、フラグレジスタＺＦが”１”にセットされる（図６（ｃ）、（ｄ））。
【００７０】
コアＣ３は、命令コードＴＥＳＴ＆ＩＤＡを実行後、フラグレジスタＳＦ、ＺＦがともに”１”のため、図４に示すステップＳ２１０においてシングル処理ブロックＳＩＢに処理をジャンプさせる。また、コアＣ３は、図４に示すステップＳ２１４、Ｓ２１６において、通過数ｍをインクリメントし、メインメモリＭＭに格納する（図６（ｅ））。コアＣ３は、シングル処理ブロックＳＩＢ０の実行後、並列処理ブロックＰＡＢ１を実行する。
【００７１】
次に、時刻Ｔ２０において、コアＣ０が並列処理ブロックＰＡＢ０の実行を完了し、シングル処理ブロックＳＩＢ０の入口に２番目に到達し、命令コードＴＥＳＴ＆ＩＤＡを実行する（図６（ｆ））。コアＣ０は、時刻Ｔ１０でのコアＣ３の動作と同様に、フラグレジスタＳＦを”１”にセットする（図６（ｇ））。時刻Ｔ１０でレジスタＲＥＧｉの未到達数Ｘ０が”３”に設定されたため、コアＣ０は、図５に示すステップＳ１１６、Ｓ１１８において、未到達数Ｘ０を”２”に変更し、フラグレジスタＺＦを”０”にリセットする（図６（ｈ）、（ｉ））。
【００７２】
コアＣ０は、命令コードＴＥＳＴ＆ＩＤＡを実行後、フラグレジスタＳＦが”１”、フラグレジスタＺＦが”０”のため、図４に示すステップＳ２１２においてシングル処理ブロックＳＩＢ０の出口に処理をジャンプさせる。また、コアＣ０は、図４に示すステップＳ２１４、Ｓ２１６において、通過数ｍをインクリメントし、メインメモリＭＭに格納する（図６（ｊ））。コアＣ０は、シングル処理ブロックＳＩＢ０の実行後、並列処理ブロックＰＡＢ１を実行する。
【００７３】
次に、時刻Ｔ３０において、コアＣ２が並列処理ブロックＰＡＢ０の実行を完了し、シングル処理ブロックＳＩＢ０の入口に３番目に到達し、命令コードＴＥＳＴ＆ＩＤＡを実行する（図６（ｋ））。コアＣ２は、時刻Ｔ２０でのコアＣ０の動作と同様に、フラグレジスタＳＦを”１”にセットし、未到達数Ｘ０を”１”に変更し、フラグレジスタＺＦを”０”にリセットする（図６（ｌ）、（ｍ）、（ｎ））。そして、コアＣ２は、命令コードＴＥＳＴ＆ＩＤＡを実行後、シングル処理ブロックＳＩＢ０の出口に処理をジャンプさせ、通過数ｍをインクリメントし、メインメモリＭＭに格納する（図６（ｏ））。コアＣ２は、シングル処理ブロックＳＩＢ０の実行後、並列処理ブロックＰＡＢ１を実行する。
【００７４】
次に、時刻Ｔ４０において、コアＣ１が並列処理ブロックＰＡＢ０の実行を完了し、シングル処理ブロックＳＩＢ０の入口に最後に到達し、命令コードＴＥＳＴ＆ＩＤＡを実行する（図６（ｐ））。コアＣ１は、時刻Ｔ２０でのコアＣ０の動作と同様に、フラグレジスタＳＦを”１”にセットし、未到達数Ｘ０を”０”に変更し、フラグレジスタＺＦを”０”にリセットする（図６（ｑ）、（ｒ）、（ｓ））。さらに、コアＣ１は、未到達数Ｘ０が”０”になったため、図５に示すステップＳ１２２において、総通過数ｊをインクリメントして”１”にする（図６（ｔ））。そして、コアＣ１は、命令コードＴＥＳＴ＆ＩＤＡを実行後、シングル処理ブロックＳＩＢ１の出口に処理をジャンプさせ、通過数ｍをインクリメントし、メインメモリＭＭに格納する（図６（ｕ））。
【００７５】
次に、図７の時刻Ｔ５０において、コアＣ０が並列処理ブロックＰＡＢ１の実行を完了し、シングル処理ブロックＳＩＢ１の入口に最初に到達し、命令コードＴＥＳＴ＆ＩＤＡを実行する（図７（ａ））。時刻Ｔ１０と同様に、レジスタＲＥＧｉに空きがあると判定されるため、フラグレジスタＳＦは”１”にセットされる（図７（ｂ））。
【００７６】
シングル処理ブロックＳＩＢ１の入口に処理が到達する前、レジスタＲＥＧｉの未到達数Ｘ１は”０”に初期化されているため、コアＣ０の処理がシングル処理ブロックＳＩＢの入口に最初に到達したと判定される。このため、コアＣ０は、時刻Ｔ１０の動作と同様に、未到達数Ｘ０を”３”（コア数−１）に設定し、フラグレジスタＺＦを”１”にセットする（図７（ｃ）、（ｄ））。そして、コアＣ１は、命令コードＴＥＳＴ＆ＩＤＡを実行後、シングル処理ブロックＳＩＢへ処理をジャンプし、通過数ｍをインクリメントし、メインメモリＭＭに格納する（図７（ｅ））。
【００７７】
次に、時刻Ｔ６０において、コアＣ３が並列処理ブロックＰＡＢ１の実行を完了し、シングル処理ブロックＳＩＢ１の入口に到達し（図７（ｆ））、コアＣ３は、時刻Ｔ２０におけるコアＣ０と同様に動作する。コアＣ３は、フラグレジスタＳＦを”１”にセットし、レジスタＲＥＧｉの未到達数Ｘ０を”２”に変更し、フラグレジスタＺＦを”０”にリセットする（図７（ｇ）、（ｈ）、（ｉ））。そして、コアＣ３は、命令コードＴＥＳＴ＆ＩＤＡを実行後、シングル処理ブロックＳＩＢ１の出口に処理をジャンプし、通過数ｍをインクリメントし、メインメモリＭＭに格納する（図７（ｊ））。この後、時刻Ｔ７０において、コアＣ２は、時刻Ｔ３０と同様に動作する。
【００７８】
次に、時刻Ｔ８０において、コアＣ１の処理がシングル処理ブロックＳＩＢ１の入口に到達する前に、コアＣ２の処理がシングル処理ブロックＳＩＢ２の入口に到達する（図７（ｋ））。コアＣ２は、レジスタＲＥＧｉの未到達数Ｘ２の格納領域を用いて、時刻Ｔ１０におけるコアＣ０と同様に動作する。次に、時刻Ｔ９０において、コアＣ０の処理がシングル処理ブロックＳＩＢ２の入口に到達する（図７（ｌ））。コアＣ０は、レジスタＲＥＧｉの未到達数Ｘ２の格納領域を用いて、時刻Ｔ２０と同様に動作する。
【００７９】
次に、図８の時刻Ｔ１００において、コアＣ３の処理がシングル処理ブロックＳＩＢ２の入口に到達する（図８（ａ））。コアＣ３は、レジスタＲＥＧｉの未到達数Ｘ２の格納領域を用いて、時刻Ｔ３０におけるコアＣ２と同様に動作する。
【００８０】
次に、時刻Ｔ１１０において、コアＣ１の処理がシングル処理ブロックＳＩＢ１の入口に到達する前に、コアＣ０の処理がシングル処理ブロックＳＩＢ３の入口に到達する（図８（ｂ））。コアＣ０は、レジスタＲＥＧｉの未到達数Ｘ３の格納領域を用いて、時刻Ｔ５０と同様に動作する。
【００８１】
次に、時刻Ｔ１２０において、コアＣ３の処理がシングル処理ブロックＳＩＢ３の入口に到達する（図８（ｃ））。コアＣ３は、レジスタＲＥＧｉの未到達数Ｘ３の格納領域を用いて、時刻Ｔ６０と同様に動作する。次に、時刻Ｔ１３０において、コアＣ２の処理がシングル処理ブロックＳＩＢ３の入口に到達する（図８（ｄ））。コアＣ２は、レジスタＲＥＧｉの未到達数Ｘ３の格納領域を用いて、時刻Ｔ７０と同様に動作する。
【００８２】
次に、時刻Ｔ１４０において、コアＣ１の処理がシングル処理ブロックＳＩＢ１の入口に到達する前に、コアＣ３の処理がシングル処理ブロックＳＩＢ４の入口に到達する（図８（ｅ））。コアＣ３は、レジスタＲＥＧｉの未到達数Ｘ４の格納領域を用いて、時刻Ｔ１０と同様に動作する。
【００８３】
次に、図９の時刻Ｔ１５０において、コアＣ２の処理がシングル処理ブロックＳＩＢ４の入口に到達する（図９（ａ））。コアＣ２は、レジスタＲＥＧｉの未到達数Ｘ４の格納領域を用いて、時刻Ｔ２０のコアＣ０と同様に動作する。
【００８４】
次に、時刻Ｔ１６０において、コアＣ１の処理がシングル処理ブロックＳＩＢ１の入口に到達する前に、コアＣ２の処理がシングル処理ブロックＳＩＢ５の入口に到達する（図９（ｂ））。コアＣ２の処理がシングル処理ブロックＳＩＢ５の入口に到達する前、通過数ｍ２は、”５”であり、総通過数ｊは、”１”であり、”ｍ２−ｊ（＝４）”は、レジスタＲＥＧｉの数Ｉ（”５”）より小さい。このため、図５に示すステップＳ１０２において、レジスタＲＥＧｉに空きがあると判定される。また、図５に示すステップＳ１０６において、コアＣ２は、通過数ｍ２（＝５）をレジスタＲＥＧｉの数Ｉ（＝５）で除した余り（＝０）を算出し、レジスタＲＥＧｉの未到達数Ｘ０の格納領域を使用することを決定する（図９（ｃ））。そして、コアＣ２は、未到達数Ｘ０の格納領域を用いて、時刻Ｔ１０のコアＣ３と同様に動作する。
【００８５】
次に、時刻Ｔ１７０において、コアＣ１の処理がシングル処理ブロックＳＩＢ１の入口に到達する前に、コアＣ２の処理がシングル処理ブロックＳＩＢ６の入口に到達する（図９（ｄ））。コアＣ２の処理がシングル処理ブロックＳＩＢ６の入口に到達する前、通過数ｍ２は、”６”であり、総通過数ｊは、”１”であり、”ｍ２−ｊ（＝５）”は、レジスタＲＥＧｉの数Ｉ（”５”）と同じである。このため、コアＣ２は、図５に示すステップＳ１０２において、レジスタＲＥＧｉに空きがないと判定し、フラグレジスタＳＦを”０”にリセットし、命令コードＴＥＳＴ＆ＩＤＡを終了する（図９（ｅ））。
【００８６】
コアＣ２は、図４のステップＳ２０４において、フラグレジスタＳＦが”０”であることを判定し、ステップＳ２０６において、所定時間待つ。すなわち、コアＣ２は、シングル処理ブロックＳＩＢ６へ処理をジャンプさせずに待機し、通過数ｍ２もインクリメントしない。
【００８７】
次に、時刻Ｔ１８１において、コアＣ１が並列処理ブロックＰＡＢ１の実行を完了し、シングル処理ブロックＳＩＢ１の入口に到達する（図９（ｆ））。コアＣ１の処理がシングル処理ブロックＳＩＢ１の入口に到達する前、通過数ｍ１は、”１”であり、総通過数ｊは、”１”であり、”ｍ１−ｊ（＝０）”は、レジスタＲＥＧｉの数Ｉ（”５”）より小さい。このため、コアＣ１は、図５のステップＳ１０４において、フラグレジスタＳＦを”１”にセットする（図９（ｇ））。
【００８８】
また、コアＣ１の処理がシングル処理ブロックＳＩＢ１の入口に到達する前、未到達数Ｘ１は”１”である。このため、コアＣ１は、図５のステップＳ１１６、Ｓ１１８において、未到達数Ｘ１を”０”に変化し、フラグレジスタＺＦを”０”にリセットする（図９（ｈ）、（ｉ））。さらに、未到達数Ｘ１が”０”になったため、コアＣ１は、図５のステップＳ１２２において、総通過数ｊをインクリメントして”２”に変更する（図９（ｊ））。
【００８９】
コアＣ１は、命令コードＴＥＳＴ＆ＩＤＡを実行後、フラグレジスタＳＦが”１”、フラグレジスタＺＦが”０”のため、図４に示すステップＳ２１２においてシングル処理ブロックＳＩＢ１の出口に処理をジャンプさせる。また、コアＣ１は、図４に示すステップＳ２１４、Ｓ２１６において、通過数ｍをインクリメントし、メインメモリＭＭに格納する（図９（ｋ））。なお、コアＣ２が、所定時間を待つ間に他の演算処理を実行した場合、フラグレジスタＳＦ、ＺＦの値は不定＊（”０”または”１”）になる。
【００９０】
この後、時刻Ｔ１８２において、コアＣ２は、所定時間を待った後、命令コードＴＥＳＴ＆ＩＤＡを実行する。なお、時刻Ｔ１８１、Ｔ１８２は、説明を分かりやすくするために分けているが、時刻Ｔ１８１に示す動作と、時刻Ｔ１８２に示す動作とは、連続して実行される。
【００９１】
時刻Ｔ１８２になる前、通過数ｍ２は、”６”であり、総通過数ｊは、”２”であり、”ｍ２−ｊ（＝４）”は、レジスタＲＥＧｉの数Ｉ（”５”）より小さい。このため、コアＣ２は、フラグレジスタＳＦを”１”にセットする（図９（ｌ））。また、コアＣ２は、図５に示すステップＳ１０６において、通過数ｍ２（＝６）をレジスタＲＥＧｉの数Ｉ（＝５）で除した余りｉ（＝１）を算出し、レジスタＲＥＧｉの未到達数Ｘ１の格納領域を使用することを決定する。また、時刻Ｔ１８２になる前、未到達数Ｘ１が”０”であるため、コアＣ２は、図５のステップＳ１１０、Ｓ１１２において、未到達数Ｘ１が”３”（コア数−１）に設定し、フラグレジスタＺＦを”１”にセットする（図９（ｍ）、（ｎ））。
【００９２】
コアＣ２は、命令コードＴＥＳＴ＆ＩＤＡを実行後、フラグレジスタＳＦ、ＺＦがともに”１”のため、図４に示すステップＳ２１０においてシングル処理ブロックＳＩＢ６に処理をジャンプさせる（図９（ｏ））。また、コアＣ２は、図４に示すステップＳ２１４、Ｓ２１６において、通過数ｍ２をインクリメントし、メインメモリＭＭに格納する（図９（ｐ））。
【００９３】
次に、図１０の時刻Ｔ１９０において、コアＣ１が並列処理ブロックＰＡＢ２の実行を完了し、シングル処理ブロックＳＩＢ２の入口に到達する（図１０（ａ））。コアＣ１は、図９の時刻Ｔ１８１の動作と同様に、フラグレジスタＳＦを”１”にセットし、未到達数Ｘ２をデクリメントして”０”に変化し、フラグレジスタＺＦを”０”にリセットする（図１０（ｂ）、（ｃ）、（ｄ））。これにより、レジスタＲＥＧｉの未到達数Ｘ２の格納領域が使用可能になる。さらに、未到達数Ｘ１が”０”になったため、図９の時刻Ｔ１８１と同様に、コアＣ１は、総通過数ｊをインクリメントし、”３”に変化する（図１０（ｅ））。
【００９４】
コアＣ１は、命令コードＴＥＳＴ＆ＩＤＡを実行後、フラグレジスタＳＦが”１”、フラグレジスタＺＦが”０”のため、シングル処理ブロックＳＩＢ２の出口に処理をジャンプさせ、通過数ｍをインクリメントし、メインメモリＭＭに格納する（図１０（ｆ））。
【００９５】
次に、時刻Ｔ２００において、コアＣ１が並列処理ブロックＰＡＢ３の実行を完了し、シングル処理ブロックＳＩＢ３の入口に到達する（図１０（ｇ））。コアＣ１は、時刻Ｔ１９０の動作と同様に、フラグレジスタＳＦを”１”にセットし、未到達数Ｘ３をデクリメントして”０”に変化し、フラグレジスタＺＦを”０”にリセットする（図１０（ｈ）、（ｉ）、（ｊ））。これにより、レジスタＲＥＧｉの未到達数Ｘ３の格納領域が使用可能になる。さらに、時刻Ｔ１９０の動作と同様に、コアＣ１は、総通過数ｊをインクリメントして”４”に変更し、シングル処理ブロックＳＩＢ３の出口に処理をジャンプさせ、通過数ｍをインクリメントする（図１０（ｋ）、（ｌ））。
【００９６】
図１１から図１２は、図２に示すＣＰＵの動作の別の例を示す。図６から図１０と同様の動作については、詳細な説明は省略する。図１１および図１２では、各シングル処理ブロックＳＩＢ（ＳＩＢ０−ＳＩＢ６）は、全てのコアＣ０−Ｃ３による各並列処理ブロックＰＡＢ（ＰＡＢ０−ＰＡＢ６）の実行の完了を待って実行される。例えば、図１１および図１２は、コアＣ０−Ｃ３が並列処理ブロックＰＡＢにより演算を並列に実行し、コアＣ０−Ｃ３のいずれかが、並列処理ブロックＰＡＢでの演算結果を用いてシングル処理ブロックＳＩＢにより演算する例を示す。
【００９７】
時刻Ｔ０、Ｔ１０の動作は、図６に示す時刻Ｔ０、Ｔ１０の動作と同様である。時刻Ｔ１０において、並列処理ブロックＰＡＢ０の処理を完了し、シングル処理ブロックＳＩＢ０の入口に最初に処理が到達したコアＣ３は、図４に示すステップＳ２１０において、シングル処理ブロックＳＩＢ０へ処理をジャンプさせる。しかし、他のコアＣ０−Ｃ２が、並列処理ブロックＰＡＢ０の処理を完了し、シングル処理ブロックＳＩＢ０の入口に処理が到達するまで、シングル処理ブロックＳＩＢ０の開始は保留される（図１１（ａ））。
【００９８】
次に、時刻Ｔ２０において、コアＣ０の処理がシングル処理ブロックＳＩＢの入口に到達し、時刻Ｔ３０において、コアＣ２の処理がシングル処理ブロックＳＩＢの入口に到達する（図１１（ｂ）、（ｃ））。コアＣ０、Ｃ１は、図４に示すステップＳ２１１において、シングル処理ブロックＳＩＢ０の出口へ処理をジャンプさせた後、コアＣ３によるシングル処理ブロックＳＩＢ０の実行が完了するまで、並列処理ブロックＰＡＢ１の開始を保留する。
【００９９】
次に、時刻Ｔ４０において、コアＣ１の処理がシングル処理ブロックＳＩＢの入口に到達し、総通過数ｊが”１”に設定される（図１１（ｄ）、（ｅ））。コアＣ３は、全てのコアＣ０−Ｃ３の処理がシングル処理ブロックＳＩＢ０の入口に到達した後、シングル処理ブロックＳＩＢ０を実行し、シングル処理ブロックＳＩＢ０の完了後、並列処理ブロックＰＡＢ１を開始する（図１１（ｆ））。コアＣ０−Ｃ２は、並列処理ブロックＰＡＢ１の処理を開始する。なお、時刻Ｔ１０−Ｔ３０では、通過数ｍ３、ｍ０、ｍ２が、”０”から”１”にそれぞれ変更されているが、通過数ｍ３、ｍ０、ｍ２は、時刻Ｔ４０において、コアＣ３がシングル処理ブロックＳＩＢ０を実行した後に変更されてもよい。
【０１００】
次に、図１２の時刻Ｔ５０において、コアＣ１の処理がシングル処理ブロックＳＩＢ０の入口に最初に到達し、図４に示すステップＳ２１０において、コアＣ１は、シングル処理ブロックＳＩＢ０へ処理をジャンプさせる。しかし、図１１に示す時刻Ｔ１０の動作と同様に、他のコアＣ０、Ｃ２、Ｃ３の処理がシングル処理ブロックＳＩＢ０の入口に到達するまで、シングル処理ブロックＳＩＢ０の開始は保留される（図１２（ａ））。
【０１０１】
この後、時刻Ｔ６０、Ｔ７０、Ｔ８０において、コアＣ０、Ｃ３、Ｃ２の処理がシングル処理ブロックＳＩＢ０の入口に順次に到達する（図１２（ｂ）、（ｃ）、（ｄ））。シングル処理ブロックＳＩＢ０の入口に最後に処理が到達するコアＣ２は、総通過数ｊを”２”に設定する（図１２（ｅ））。そして、コアＣ１は、全てのコアＣ０、Ｃ２、Ｃ３がシングル処理ブロックＳＩＢ０の入口に到達した後、シングル処理ブロックＳＩＢ０を実行する（図１２（ｆ））。
【０１０２】
図１３は、図２に示すＣＰＵが実行するプログラムの例を示す。図１３に示すプログラムは、マルチスレッドプログラミングのためのＡＰＩ（Application Programming Interfece）の１つであるＯｐｅｎＭＰ（登録商標）規格に基づいて記述されたソースプログラムである。図１３に示すプログラムは、Ｃ言語等で記述されたソースプログラムをＯｐｅｎＭＰ規格に対応したコンパイラによりコンパイルすることで生成されるソースプログラムである。
【０１０３】
指示文”#pragma omp parallel”は、”｛  ｝”で囲まれるブロックが並列に実行されることを示す。指示文”#pragma omp single”は、”｛  ｝”で囲まれるブロックが１つのスレッドにより実行されることを示す。指示節”(nowait)”は、指示文”#pragma omp single”で指示されるシングル処理ブロックＳＩＢを完了したスレッドが他のスレッドの状況に関係なく次の処理に移行することを示す。指示文”#pragma omp single (nowait)”の記述を含む図１３に示すプログラムにより、図６から図１０に示す動作が実現される。
【０１０４】
一方、指示文”#pragma omp single (nowait)”から指示節”(nowait)”を除いた指示文”#pragma omp single”の出口は、全てのスレッドの処理が完了するまで次の処理を待機する暗黙のバリアを有する。このため、図１３に示す指示文”#pragma omp single (nowait)”を指示文”#pragma omp single”に変更した場合、図１１から図１２に示す動作が実現される。
【０１０５】
図１４は、図２に示すＣＰＵが実行するプログラムの別の例を示す。図１４に示すプログラムは、図１３と同様に、ＯｐｅｎＭＰ規格に基づいて記述されたソースプログラムである。
【０１０６】
指示文”#pragma omp parallel for”は、次の行の”for文”が並列に実行されることを示す。図１４では、並列処理ブロックＰＡＢとシングル処理ブロックＳＩＢと並列処理ブロックＰＡＢとが、変数ＣＯＵＮＴで指示される回数繰り返し実行される。図１４に示すプログラムにより、図１３と同様に、図６から図１０に示す動作が実現される。
【０１０７】
図１５は、図２に示すＣＰＵが実行するプログラムの別の例を示す。図１５に示すプログラムは、図１３と同様に、ＯｐｅｎＭＰ規格に基づいて記述されたソースプログラムである。図１５に示す２つのプログラムは、互いに同じ処理を実行する。
【０１０８】
指示文”#pragma omp sections”は、”｛  ｝”で囲まれるブロックが、指示文”#pragma omp section”毎にスレッドを割り当てて、並列に実行されることを示す。指示文”#pragma omp sections”で指定されるブロックの出口は、全てのスレッドの処理が完了するまで次の処理を待機する暗黙のバリアを有する。このため、指示文”#pragma omp sections”を指示文”#pragma omp single (nowait)”に書き替える場合、指示文”#pragma omp barrier”が、”for文”のブロックの末尾に追加される。指示文”#pragma omp barrier”は、同期を取る場合に使用される。
【０１０９】
以上、この実施形態においても、図１に示した実施形態と同様に、ＣＰＵは、到達情報である未到達数Ｘｉおよび総通過数ｊを保持するレジスタ部ＲＥＧＵを有する。このため、メインメモリＭＭに到達情報を格納する場合に比べて、到達情報にアクセスする時間を短くすることができる。この結果、複数のコアＣ０−Ｃ３が実行するスレッドの処理効率を向上することできる。
【０１１０】
さらに、シングル処理ブロックＳＩＢの入口に最後に処理が到達したコアＣは、レジスタＲＥＧｉにおける対応する領域を、新たな未到達数Ｘｉを保持可能な状態に初期化する。これにより、実行が保留されていたシングル処理ブロックＳＩＢの実行が可能になるとともに、初期化された領域を用いて、新たなシングル処理ブロックＳＩＢの実行の可否を制御することができる。すなわち、レジスタＲＥＧｉにおける未到達数Ｘｉを格納する複数の領域を巡回的に使用して、シングル処理ブロックＳＩＢの実行の可否を制御することができる。
【０１１１】
コアＣ０−Ｃ３毎に管理される通過数ｍは、シングル処理ブロックＳＩＢを通過する毎に増加され、コアＣ０−Ｃ３に共通の総通過数ｊは、コアＣ０−Ｃ３の処理のいずれかが各シングル処理ブロックＳＩＢの入口に最後に到達する毎に増加される。これにより、通過数ｍと総通過数ｊとの差と、レジスタＲＥＧｉにおける未到達数Ｘｉを格納する領域の数Ｉとの比較に基づいて、通過数ｍに対応するシングル処理ブロックＳＩＢを実行するか保留するかを判定することができる。
【０１１２】
シングル処理ブロックＳＩＢの入口に２番目以降に処理が到達したコアＣは、シングル処理ブロックＳＩＢの非実行を判定し、シングル処理ブロックＳＩＢの出口に処理をジャンプさせることで、複数のコアＣがシングル処理ブロックＳＩＢを実行することを抑止することができる。
【０１１３】
各コアＣは、シングル処理ブロックＳＩＢの入口へ処理が到達した場合に命令コードＴＥＳＴ＆ＩＤＡをフェッチし、命令ＴＥＳＴ＆ＩＤＡの実行は、マイクロプログラムにより実行される。これにより、ハードウェア機能（命令セットのアーキテクチャ）を容易に変更することができる。
【０１１４】
図１６は、演算処理装置および演算処理装置の制御方法の別の実施形態を示す。図１から図１５で説明した要素と同一または同様の要素については、同一の符号を付し、これ等については、詳細な説明を省略する。
【０１１５】
図１６に示すＣＰＵは、図２と異なるレジスタ部ＲＥＧＵを有する。レジスタ部ＲＥＧＵは、未到達数Ｘ０を格納する１つの格納領域（ｉ＝０）を有する。ＣＰＵのその他の構成は、図２に示すＣＰＵと同様である。すなわち、図１６に示すＣＰＵは、複数のコアＣ（Ｃ０、Ｃ１、Ｃ２、Ｃ３）、キャッシュメモリＣＭおよび図２と異なるレジスタ部ＲＥＧＵを有する。各コアＣは、図２と同様に、演算部ＯＰＵ、データレジスタ部ＤＲＥＧ、アドレスレジスタ部ＡＲＥＧ、プログラムカウンタＰＣ、インクリメンタＩＮＣ、命令レジスタ部ＩＲＥＧ、デコーダ部ＤＥＣおよびセレクタＳ１、Ｓ２を有する。
【０１１６】
図１６に示すＣＰＵが実行する処理は、図３と同様である。各コアＣ０−Ｃ３がシングル処理ブロックＳＩＢの入口で実行する処理は、図４と同一または同様であり、各コアＣ０−Ｃ３が実行する命令コードＴＥＳＴ＆ＩＤＡの動作は、図５と同一または同様である。
【０１１７】
図１７から図１９は、図１６に示すＣＰＵの動作の例を示す。図６から図１０と同一または同様の動作については、詳細な説明は省略する。時刻Ｔ０、Ｔ１０、Ｔ２０の動作は、図６の時刻Ｔ０、Ｔ１０、Ｔ２０の動作と同様である。
【０１１８】
時刻Ｔ３０において、コアＣ１、Ｃ２の処理がシングル処理ブロックＳＩＢ０の入口に到達する前に、コアＣ３は、並列処理ブロックＰＡＢ１を完了し、シングル処理ブロックＳＩＢ１の入口に処理が到達する（図１７（ａ）、（ｂ））。コアＣ３の処理がシングル処理ブロックＳＩＢ１の入口に到達する前、通過数ｍ３は、”１”であり、総通過数ｊは、”０”であり、”ｍ３−ｊ（＝１）”は、レジスタＲＥＧｉの数Ｉ（”１”）と同じである。このため、コアＣ３は、図５に示すステップＳ１０２において、レジスタＲＥＧｉに空きがないと判定し、フラグレジスタＳＦを”０”にリセットし、命令コードＴＥＳＴ＆ＩＤＡを終了する（図１７（ｃ））。
【０１１９】
コアＣ３は、図４のステップＳ２０４において、フラグレジスタＳＦが”０”であることを判定し、ステップＳ２０６において、所定時間を待つ。すなわち、コアＣ３は、シングル処理ブロックＳＩＢ６へ処理をジャンプさせずに待機し、通過数ｍ３もインクリメントしない。
【０１２０】
次に、時刻Ｔ４０において、コアＣ１が並列処理ブロックＰＡＢ０の実行を完了し、シングル処理ブロックＳＩＢ０の入口に処理が到達し、レジスタＲＥＧｉの未到達数Ｘ０は、”１”に変更される（図１７（ｄ）、（ｅ））。しかしながら、”ｍ３−ｊ（＝１）”は、時刻Ｔ３０と同様に、レジスタＲＥＧｉの数Ｉ（”１”）と同じであるため、コアＣ３は、フラグレジスタＳＦを”０”に再びリセットし、所定時間を待つ（図１７（ｆ））。
【０１２１】
次に、図１８の時刻Ｔ５１において、コアＣ２が並列処理ブロックＰＡＢ０の実行を完了し、シングル処理ブロックＳＩＢ０の入口に処理が到達し、レジスタＲＥＧｉの未到達数Ｘ０は、”０”に変更される（図１８（ａ）、（ｂ））。未到達数Ｘ０が、”０”になったため、コアＣ２は、総通過数ｊを”１”に設定する（図１８（ｃ））。
【０１２２】
図４に示すステップＳ２０６で所定時間を待ったコアＣ３は、命令コードＴＥＳＴ＆ＩＤＡ（図５）を実行する。”通過数ｍ３は、”１”であり、”ｍ３−ｊ（＝０）”は、レジスタＲＥＧｉの数Ｉ（”１”）より小さいため、コアＣ３は、フラグレジスタＳＦを”１”にセットする（図１８（ｄ））。コアＣ３は、通過数ｍ３（＝１）をレジスタＲＥＧｉの数Ｉ（＝１）で除した余りｉ（＝０）を算出し、レジスタＲＥＧｉの未到達数Ｘ０の格納領域を使用することを決定する。
【０１２３】
この後、時刻Ｔ５２において、コアＣ３は、未到達数Ｘ０が”０”であるため、未到達数Ｘ０の格納領域が空いていると判断し、未到達数Ｘ０に”３”を設定し、フラグレジスタＺＦを”１”にセットする（図１８（ｅ）、（ｆ））。コアＣ３は、命令コードＴＥＳＴ＆ＩＤＡを実行後、フラグレジスタＳＦ、ＺＦがともに”１”のため、シングル処理ブロックＳＩＢ１にジャンプし、通過数ｍ３をインクリメントし、メインメモリＭＭに格納する（図１８（ｇ））。なお、時刻Ｔ５１、Ｔ５２は、説明を分かりやすくするために分けているが、時刻Ｔ５１に示す動作と、時刻Ｔ５２に示す動作は、連続して実行される。
【０１２４】
次に、時刻Ｔ６０において、コアＣ０の処理がシングル処理ブロックＳＩＢ１の入口に到達し、未到達数Ｘ０が”２”に変更され、フラグレジスタＺＦが”０”にリセットされる（図１８（ｈ）、（ｉ））。コアＣ０は、命令コードＴＥＳＴ＆ＩＤＡを実行後、フラグレジスタＳＦが”１”で、フラグレジスタＺＦが”０”のため、シングル処理ブロックＳＩＢ１の出口に処理をジャンプさせ、通過数ｍ０をインクリメントし、メインメモリＭＭに格納する（図１８（ｊ））。
【０１２５】
次に、時刻Ｔ７０において、コアＣ１、Ｃ２の処理がシングル処理ブロックＳＩＢ１の入口に到達する前に、コアＣ０が並列処理ブロックＰＡＢ２を完了し、シングル処理ブロックＳＩＢ２の入口に処理が到達する（図１８（ｋ）、（ｌ））。コアＣ０は、図１７の時刻Ｔ３０のコアＣ３と同様に、未到達数Ｘ０の格納領域が空くのを待つ。
【０１２６】
次に、時刻Ｔ８０において、コアＣ１の処理がシングル処理ブロックＳＩＢ１の入口に到達し、コアＣ３の処理がシングル処理ブロックＳＩＢ２の入口に到達する（図１８（ｍ）、（ｎ））。コアＣ３は、図１７の時刻Ｔ３０と同様に、未到達数Ｘ０の格納領域が空くのを待つ。なお、コアＣ０が、所定時間を待つ間に他の演算処理を実行した場合、フラグレジスタＳＦ、ＺＦの値は不定＊（”０”または”１”）になる。
【０１２７】
次に、図１９の時刻Ｔ９１において、コアＣ２の処理がシングル処理ブロックＳＩＢ１の入口に到達する（図１９（ａ））。コアＣ２は、未到達数Ｘ０を”０”に変更し、総通過数ｊを”２”に設定する（図１９（ｂ）、（ｃ））。所定時間後に命令コードＴＥＳＴ＆ＩＤＡを実行したコアＣ０は、”ｍ０−ｊ（＝０）”がレジスタＲＥＧｉの数Ｉ（”１”）より小さいため、フラグレジスタＳＦを”１”にセットする（図１９（ｄ））。
【０１２８】
次に、時刻Ｔ９２において、コアＣ０は、通過数ｍ０（＝２）をレジスタＲＥＧｉの数Ｉ（＝１）で除した余りｉ（＝０）を算出し、未到達数Ｘ０の格納領域を使用することを決定する。そして、コアＣ０は、未到達数Ｘ０に”３”を設定し、フラグレジスタＺＦを”１”にセットする（図１９（ｅ）、（ｆ））。コアＣ０は、命令コードＴＥＳＴ＆ＩＤＡを実行後、フラグレジスタＳＦ、ＺＦがともに”１”のため、シングル処理ブロックＳＩＢ１に処理をジャンプさせ、通過数ｍ０をインクリメントし、メインメモリＭＭに格納する（図１９（ｇ）、（ｈ））。
【０１２９】
この後、通過数ｍ３が”２”の状態で命令コードＴＥＳＴ＆ＩＤＡを実行したコアＣ３は、”ｍ３−ｊ（＝０）”がレジスタＲＥＧｉの数Ｉ（”１”）より小さいため、フラグレジスタＳＦを”１”にセットする（図１９（ｉ））。また、コアＣ３は、未到達数Ｘ０を”２”に変更し、フラグレジスタＺＦを”０”にリセットする（図１９（ｊ）、（ｋ））。なお、時刻Ｔ９１、Ｔ９２は、説明を分かりやすくするために分けているが、時刻Ｔ９１に示す動作と、時刻Ｔ９２に示す動作は、連続して実行される。
【０１３０】
コアＣ３は、命令コードＴＥＳＴ＆ＩＤＡを実行後、フラグレジスタＳＦが”１”で、フラグレジスタＺＦが”０”のため、シングル処理ブロックＳＩＢ１の出口に処理をジャンプさせ、通過数ｍ０をインクリメントし、メインメモリＭＭに格納する（図１９（ｌ））。なお、シングル処理ブロックＳＩＢ２の入口に処理が到達しているコアＣ３がコアＣ０より先に命令コードＴＥＳＴ＆ＩＤＡを実行した場合、コアＣ３の処理がシングル処理ブロックＳＩＢ１にジャンプし、コアＣ０の処理がシングル処理ブロックＳＩＢ１の出口にジャンプする。すなわち、コアＣ３は、時刻Ｔ９１、Ｔ９２に示すコアＣ０の動作を実行し、コアＣ０は、時刻Ｔ９１、Ｔ９２に示すコアＣ３の動作を実行する。
【０１３１】
そして、時刻Ｔ１００において、コアＣ０、Ｃ３は、並列処理ブロックＰＡＢ３を実行し、コアＣ１、Ｃ２は、並列処理ブロックＰＡＢ２を実行する。
【０１３２】
以上、図１７から図１９に示す実施形態においても、ＣＰＵが、到達情報を保持するレジスタ部ＲＥＧＵを有するため、メインメモリＭＭに到達情報を格納する場合に比べて、到達情報にアクセスする時間を短くすることができる。この結果、複数のコアＣ０−Ｃ３が実行するスレッドの処理効率を向上することできる。
【０１３３】
なお、図２から図１９に示す実施形態は、複数のコアＣをそれぞれに含む複数のＣＰＵにより実現されてもよい。例えば、一方のＣＰＵがコアＣ０、Ｃ１を含み、他方のＣＰＵがコアＣ２、Ｃ３を含む場合、各ＣＰＵは、図４から図１２および図１７から図２０と同様に動作する。
【０１３４】
また、各コアＣは、複数のスレッドを並列に実行してもよい。この場合、図２に示すコアＣ０が２つのスレッドを並列に実行し、図２に示すコアＣ１が２つのスレッドを実行する場合、図６から図１０において、コアＣ２、Ｃ３の処理を、それぞれコアＣ０、Ｃ１の処理に置き換えることで、動作が実現される。同様に、図１７から図１９において、コアＣ２、Ｃ３の処理を、それぞれコアＣ０、Ｃ１の処理に置き換えることで、各コアＣが複数のスレッドを並列に実行する動作が実現される。
【０１３５】
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずである。したがって、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。
【符号の説明】
【０１３６】
１０…演算処理部；１２…実行部；１４…制御部；１６…判定部；２０…演算処理部；２２…実行部；２４…制御部；２６…判定部；３０…保持部；ＡＤ０、ＡＤ１…アドレスバス；ＡＲＥＧ…アドレスレジスタ部；Ｃ０、Ｃ１、Ｃ２、Ｃ３…コア；ＣＭ…キャッシュメモリ；ＤＥＣ…デコーダ部；ＤＩＮ、ＤＯＵＴ…データバス；ＤＲＥＧ…データレジスタ部；ＤＴ…データバス；ＥＸ…演算器；ＩＮＣ…インクリメンタ；ＩＲＥＧ…命令レジスタ部；ｊ…総通過数；ｍ０、ｍ１、ｍ２、ｍ３…通過数；ＭＴＨ…スレッド；ｎ…コア数；ＯＰＵ…演算部；ＰＡＢ…並列処理ブロック；ＰＣ…プログラムカウンタ；ＲＥＧ…レジスタファイル；ＲＥＧｉ、ＲＥＧｊ…レジスタ；ＲＥＧＵ…レジスタ部；Ｓ１、Ｓ２…セレクタ；ＳＦ…フラグレジスタ；ＳＩＢ…シングル処理ブロック；ＳＴＨ…シングルスレッド；ＳＹＳ…情報処理システム；ＴＨ…スレッド；Ｘｉ…未到達数；ＺＦ…フラグレジスタ
【図１】
0006330569.tif 000002
【図２】
0006330569.tif 000003
【図３】
0006330569.tif 000004
【図４】
0006330569.tif 000005
【図５】
0006330569.tif 000006
【図６】
0006330569.tif 000007
【図７】
0006330569.tif 000008
【図８】
0006330569.tif 000009
【図９】
0006330569.tif 000010
【図１０】
0006330569.tif 000011
【図１１】
0006330569.tif 000012
【図１２】
0006330569.tif 000013
【図１３】
0006330569.tif 000014
【図１４】
0006330569.tif 000015
【図１５】
0006330569.tif 000016
【図１６】
0006330569.tif 000017
【図１７】
0006330569.tif 000018
【図１８】
0006330569.tif 000019
【図１９】
0006330569.tif 000020