(57)【特許請求の範囲】
【請求項１】
複数の第１演算器と第１制御部と第１外部デバイスとを含む第１のシステムと、
複数の第２演算器と第２制御部と第２外部デバイスとを含み、前記第１のシステムで実行された計算と同一の計算を行って計算結果の比較を行うための第２のシステムと、
を有し、
前記第１制御部は、
前記複数の第１演算器のうち１又は複数の第１演算器から前記第１外部デバイスへの第１の出力要求が出力されたことを検出すると、前記１又は複数の第１演算器を含み且つ第１の計算を実行していた第１演算器を停止させ、
前記第１の出力要求で出力される値を含む第１の比較対象データを前記第２制御部に送信し、
前記第１の計算を実行していた第１演算器のうち前記１又は複数の第１演算器以外の第１演算器に、第２の計算を実行させ、
前記第２制御部は、
前記第１制御部から前記第１の比較対象データを受信した場合、前記第１の計算に対応する第３の計算を、前記第１の計算を実行していた第１演算器に対応する第２演算器に実行させ、
前記第１の計算を実行していた第１演算器に対応する第２演算器のうち１又は複数の第２演算器から前記第２外部デバイスへの第２の出力要求が出力されたことを検出すると、前記第２の出力要求で出力される値を含む第２の比較対象データと前記第１の比較対象データとを比較する
情報処理システム。
【請求項２】
前記第１制御部は、
前記第１の計算を実行する第１演算器を特定するための情報を、予め前記第２制御部に送信しておき、
前記第２制御部は、
前記第１の計算を実行していた第１演算器に対応する第２演算器を、前記情報に基づき特定する
請求項１記載の情報処理システム。
【請求項３】
前記第１制御部は、
前記第２の計算を実行する第１演算器を特定するための情報を、前記第２制御部に送信し、
前記第２の計算を実行していた第１演算器のうちある第１演算器から前記第１外部デバイスへの第３の出力要求が出力されたことを検出すると、前記第２の計算を実行していた第１演算器を停止させ、
前記第３の出力要求で出力される値を含む第３の比較対象データを前記第２制御部に送信し、
前記第２の計算を実行していた第１演算器のうち前記ある第１演算器以外の第１演算器に、第５の計算を実行させ、
前記第２制御部は、
前記情報を、前記第１制御部から受信し、
前記第１制御部から前記第３の比較対象データを受信した場合、前記情報に基づき前記第２の計算に対応する第４の計算を実行する第２演算器に特定して前記第４の計算を実行させ、
特定された前記第２演算器のうちある第２演算器から前記第２外部デバイスへの第４の出力要求が出力されたことを検出すると、前記第４の出力要求で出力される値を含む第４の比較対象データと前記第３の比較対象データとを比較する
請求項１記載の情報処理システム。
【請求項４】
前記第２の計算を実行する第１演算器を特定するための情報が、前記１又は複数の第１演算器の識別子を含む
請求項３記載の情報処理システム。
【請求項５】
前記第１のシステムが、
前記複数の第１演算器を含む第１の仮想マシンと、
前記第１制御部を含む第２の仮想マシンと、
前記第１の仮想マシン及び前記第２の仮想マシンの管理を行う第１の管理部と、
を有し、
前記第２のシステムが、
前記複数の第２演算器を含む第３の仮想マシンと、
前記第２制御部を含む第４の仮想マシンと、
前記第３の仮想マシン及び前記第４の仮想マシンの管理を行う第２の管理部と、
を有する
請求項１乃至４のいずれか１つ記載の情報処理システム。
【請求項６】
前記第１制御部は、
前記第１の出力要求で出力する値を保持しておき、
前記第２制御部は、
比較結果を前記第１制御部に送信し、
前記第１制御部は、
前記第２制御部から受信した前記比較結果が前記第１の比較対象データと前記第２の比較対象データとが一致することを表す場合には、保持している前記値を前記第１外部デバイスを出力する
請求項１乃至５のいずれか１つ記載の情報処理システム。
【請求項７】
前記第１のシステムは、
前記複数の第１演算器に共有される第１メモリと、
前記第１メモリに反映する前のデータを保持する第１バッファと、
を有し、
前記１又は複数の第１演算器は、
前記第１の出力要求で出力される値を前記第１メモリに書き込み、
前記第１の計算を実行していた第１演算器のうち前記１又は複数の第１演算器以外の第１演算器は、
前記第２の計算におけるデータの書き込みを、前記第１バッファに対して行い、
前記第２制御部は、
比較結果を前記第１制御部に送信し、
前記第１制御部は、
前記比較結果を前記第２制御部から受信し、
前記第２制御部から受信した前記比較結果が前記第１の比較対象データと前記第２の比較対象データとが一致することを表す場合には、前記第１メモリに書き込まれた前記値を前記第１外部デバイスに出力し、
前記第１バッファに対して行われた書き込みの競合の有無の判定を前記複数の第１演算器に実行させ、当該競合無しと判定された場合には前記第１バッファに対する書き込み結果を前記第１メモリに反映させる
請求項１記載の情報処理システム。
【請求項８】
前記第１制御部は、
前記第２の計算を実行する第１演算器を特定するための情報を、前記第２制御部に送信し、
前記第２の計算を実行している第１演算器が前記第１バッファへ書き込んだデータを、前記第２制御部に送信し、
前記第２の計算を実行していた第１演算器のうちある第１演算器から前記第１外部デバイスへの第３の出力要求が出力されたことを検出すると、前記第２の計算を実行していた第１演算器を停止させ、
前記第３の出力要求で出力される値を含む第３の比較対象データを前記第２制御部に送信し、
前記第２制御部は、
前記情報及び前記第１バッファへ書き込んだデータを、前記第１制御部から受信し、
前記第１制御部から前記第３の比較対象データを受信した場合、前記情報に基づき前記第２の計算に対応する第４の計算を実行する第２演算器に特定して前記第４の計算を実行させ、
特定された前記第２演算器のうちある第２演算器から前記第２外部デバイスへの第４の出力要求が出力されたことを検出すると、前記第４の出力要求で出力される値を含む第４の比較対象データと前記第３の比較対象データとを比較し、
当該比較の結果が、前記第３の比較対象データと前記第４の比較対象データとが一致することを表す場合には、前記ある第２演算器に、前記第４の出力要求で出力される値を前記第２外部デバイスへ出力させ、
前記第１バッファへ書き込んだデータを用いて、書き込みの競合の有無の判定を前記第２演算器に実行させる
請求項７記載の情報処理システム。
【請求項９】
複数の第１演算器と第１制御部と第１外部デバイスとを含む第１のシステムと、複数の第２演算器と第２制御部と第２外部デバイスとを含み、前記第１のシステムで実行された計算と同一の計算を行って計算結果の比較を行うための第２のシステムとを有するシステムのうち前記第１制御部は、
前記複数の第１演算器のうち１又は複数の第１演算器から前記第１外部デバイスへの第１の出力要求が出力されたことを検出すると、前記１又は複数の第１演算器を含み且つ第１の計算を実行していた第１演算器を停止させ、
前記第１の出力要求で出力される値を含む第１の比較対象データを前記第２制御部に送信し、
前記第１の計算を実行していた第１演算器のうち前記１又は複数の第１演算器以外の第１演算器に、第２の計算を実行させ、
前記第２制御部は、
前記第１制御部から前記第１の比較対象データを受信した場合、前記第１の計算に対応する第３の計算を、前記第１の計算を実行していた第１演算器に対応する第２演算器に実行させ、
前記第１の計算を実行していた第１演算器に対応する第２演算器のうち１又は複数の第２演算器から前記第２外部デバイスへの第２の出力要求が出力されたことを検出すると、前記第２の出力要求で出力される値を含む第２の比較対象データと前記第１の比較対象データとを比較する
情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、フォールトトレラントコンピュータにおける同期技術に関する。
【背景技術】
【０００２】
フォールトトレラントコンピュータにおける同期の実現方法として、ロックステップという同期方式が存在する。ロックステップでは同一の「初期状態及びＣＰＵ（Central Processing Unit）の実行命令」を計算機に与えた場合、演算の結果が同一となる計算機の決定性を利用し、同一の初期状態から同じ命令を実行させることによって２つの系で状態を一致させている。このロックステップの一種であるインストラクションロックステップはＣＰＵの実行命令単位でＣＰＵのコア及びメモリの状態を２つの系で一致させる方式である。
【０００３】
対称型マルチプロセッシング（ＳＭＰ：Symmetric Multiprocessing）の場合、２つの系で非同期に行った演算の結果が同一となるためには、「初期状態及びＣＰＵの実行命令」の他に、演算の情報として共有メモリへのアクセス順序の情報が用いられる。そのため、ＳＭＰに対応しているインストラクションロックステップ方式では、同期を行う際に、２つの計算機に先行系と遅延系の役割を持たせ、先行系では共有メモリへのアクセス順序及びアクセス内容を記録し、それらを遅延系へ転送して計算の再現を行う方式を採用する。すなわち、先行系の計算結果が確定してから遅延系で計算再現を行うことになるので、遅延系では先行系の計算結果が転送されるまでの遅延時間が発生する。
【０００４】
簡単に処理の流れを説明すると、先行系で計算を開始し、先行系は計算結果として、計算の過程において発生した共有メモリへのアクセスのデータ、発生した出力要求のデータ、及びコアのレジスタ値を、遅延系へ転送する。ここで、先行系の計算は停止される。
【０００５】
遅延系では先行系から計算結果を受け取ると、遅延系で計算の再現を行う。そして、遅延系では、計算再現の結果を、先行系から受信した計算結果と比較し、先行系に比較結果を通知する。先行系では、遅延系から比較結果を受信すると、その比較結果が計算結果が一致しているということを表している場合には、出力要求に従って外部デバイスへの出力を実行する。そして、先行系の計算が再開される。
【０００６】
しかしながら、従来では、ＣＰＵに多くのコアが含まれているケースを考慮しておらず、上で述べたような流れで処理を行うと、出力を行わなかった先行系におけるコアも、遅延系における比較結果を受信するまで計算を停止することになる。これでは、計算資源の有効活用が図れない。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００４−４６５９９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
従って、本発明の目的は、一側面として、フォールトトレラントコンピュータにおいて同期を行う場合においても計算資源の有効利用を図るための技術を提供することである。
【課題を解決するための手段】
【０００９】
本発明に係る情報処理システムは、複数の第１演算器と第１制御部と第１外部デバイスとを含む第１のシステムと、複数の第２演算器と第２制御部と第２外部デバイスとを含み、第１のシステムで実行された計算と同一の計算を行って計算結果の比較を行うための第２のシステムとを有する。そして、第１制御部は、（Ａ）複数の第１演算器のうち１又は複数の第１演算器から第１外部デバイスへの第１の出力要求が出力されたことを検出すると、上記１又は複数の第１演算器を含み且つ第１の計算を実行していた第１演算器を停止させ、（Ｂ）第１の出力要求で出力される値を含む第１の比較対象データを第２制御部に送信し、（Ｃ）第１の計算を実行していた第１演算器のうち上記１又は複数の第１演算器以外の第１演算器に、第２の計算を実行させる。また、第２制御部は、（Ｄ）第１制御部から第１の比較対象データを受信した場合、第１の計算に対応する第３の計算を、第１の計算を実行していた第１演算器に対応する第２演算器に実行させ、（Ｅ）第１の計算を実行していた第１演算器に対応する第２演算器のうち１又は複数の第２演算器から第２外部デバイスへの第２の出力要求が出力されたことを検出すると、第２の出力要求で出力される値を含む第２の比較対象データと第１の比較対象データとを比較する。
【発明の効果】
【００１０】
一側面としては、フォールトトレラントコンピュータにおいて同期を行う場合においても計算資源の有効利用を図ることができるようになる。
【図面の簡単な説明】
【００１１】
【図１】図１は、第１の実施の形態に係るシステムの概要を示す図である。
【図２】図２は、先行系計算機の制御部の機能ブロック構成例を示す図である。
【図３】図３は、グループ対応表の一例を示す図である。
【図４】図４は、遅延系計算機の制御部の機能ブロック構成例を示す図である。
【図５】図５は、第１の実施の形態における処理の概要を示すシーケンス図である。
【図６】図６は、グループ対応表の一例を示す図である。
【図７】図７は、第１の実施の形態における処理の概要を示すシーケンス図である。
【図８】図８は、第１の実施の形態におけるコアの使用状態の時間変化を表す図である。
【図９】図９は、従来技術におけるコアの使用状態の時間変化を表す図である。
【図１０】図１０は、先行系計算機により実行される処理の処理フローを示す図である。
【図１１】図１１は、初期化処理の処理フローを示す図である。
【図１２】図１２は、計算指示処理の処理フローを示す図である。
【図１３】図１３は、確認処理の処理フローを示す図である。
【図１４】図１４は、登録処理の処理フローを示す図である。
【図１５】図１５は、グループ対応表の一例を示す図である。
【図１６】図１６は、遅延系計算機により実行される処理の処理フローを示す図である。
【図１７】図１７は、計算再現処理の処理フローを示す図である。
【図１８】図１８は、取得処理の処理フローを示す図である。
【図１９】図１９は、比較処理の処理フローを示す図である。
【図２０】図２０は、先行系計算機により実行される処理の処理フローを示す図である。
【図２１】図２１は、削除処理の処理フローを示す図である。
【図２２】図２２は、第２の実施の形態に係るシステムの概要を示す図である。
【図２３】図２３は、第２の実施の形態に係るシステムの構成例を示す図である。
【図２４】図２４は、第３の実施の形態に係るシステムの構成例を示す図である。
【図２５】図２５は、世代管理テーブルの一例を示す図である。
【図２６】図２６は、ＬＬキャッシュに格納されるデータの一例を示す図である。
【図２７】図２７は、第３の実施の形態におけるグループ対応表の一例を示す図である。
【図２８】図２８は、第３の実施の形態における先行系計算機の制御部の機能ブロック図である。
【図２９】図２９は、第３の実施の形態における遅延系計算機の制御部の機能ブロック図である。
【図３０】図３０は、第３の実施の形態における先行系計算機によって実行される処理の処理フローを示す図である。
【図３１】図３１は、仮計算の処理フローを示す図である。
【図３２】図３２は、メモリへのアクセスの記録及び転送処理の処理フローを示す図である。
【図３３】図３３は、第３の実施の形態における先行系計算機によって実行される処理の処理フローを示す図である。
【図３４】図３４は、状態取得処理の処理フローを示す図である。
【図３５】図３５は、グループ対応表の更新処理の処理フローを示す図である。
【図３６】図３６は、非出力コアの稼働処理の処理フローを示す図である。
【図３７】図３７は、モード切替処理の処理フローを示す図である。
【図３８】図３８は、バッファの世代更新処理の処理フローを示す図である。
【図３９】図３９は、第３の実施の形態における先行系計算機によって実行される処理の処理フローを示す図である。
【図４０】図４０は、第３の実施の形態における先行系計算機によって実行される処理の処理フローを示す図である。
【図４１】図４１は、仮計算のコミットの処理フローを示す図である。
【図４２Ａ】図４２Ａは、仮計算のコミットについて説明するための図である。
【図４２Ｂ】図４２Ｂは、仮計算のコミットについて説明するための図である。
【図４３】図４３は、第３の実施の形態における遅延系計算機によって実行される処理の処理フローを示す図である。
【図４４】図４４は、計算再現の処理フローを示す図である。
【図４５】図４５は、計算再現の処理フローを示す図である。
【図４６】図４６は、仮計算再現の処理フローを示す図である。
【図４７】図４７は、仮計算再現の処理フローを示す図である。
【図４８】図４８は、区間のコミットの処理フローを示す図である。
【図４９】図４９は、第３の実施の形態における遅延系計算機によって実行される処理の処理フローを示す図である。
【図５０】図５０は、メモリ状態の更新処理の処理フローを示す図である。
【図５１】図５１は、第３の実施の形態における同期処理の一例を示す図である。
【発明を実施するための形態】
【００１２】
［実施の形態１］
図１に、本実施の形態に係る情報処理システムの概要を示す。本情報処理システムにおいては、先行系計算機１００と、遅延系計算機２００とが、系間通信路１９０を介して接続されている。
【００１３】
先行系計算機１００は、演算部１１０と、同期制御部１２０と、系間通信路１９０で通信を行う通信部１３０と、外部デバイス１４０とを有する。演算部１１０は、複数のコア１１１（図１では１１１ａ乃至１１１ｄ）と、コア１１１によって共有されるメモリ１１４と、メモリ制御部１１２と、アクセス抽出部１１３とを有する。
【００１４】
メモリ制御部１１２は、メモリ１１４へのアクセスを制御する。また、アクセス抽出部１１３は、メモリ１１４へのアクセスを抽出して同期制御部１２０へ通知する。
【００１５】
また、同期制御部１２０は、アクセス履歴格納部１２１と、出力値格納部１２３と、制御部１２２とを有する。アクセス履歴格納部１２１は、アクセス抽出部１１３からのデータを格納する。出力値格納部１２３は、演算部１１０のコア１１１が発行した出力要求で出力される値を格納する。また、制御部１２２は、インストラクションロックステップに係る同期を行うための種々の処理を、通信部１３０及び系間通信路１９０を介して遅延系計算機２００における同期制御部２２０と連携しつつ実行する。
【００１６】
外部デバイス１４０は、ストレージ１４１、Ｉ／Ｏ装置１４２などのデバイスを含む。外部デバイス１４０を介して他の計算機に接続される場合もある。
【００１７】
遅延系計算機２００は、演算部２１０と、同期制御部２２０と、系間通信路１９０で通信を行う通信部２３０と、外部デバイス２４０とを有する。演算部２１０は、複数のコア２１１（図１では２１１ａ乃至２１１ｄ）と、コア２１１によって共有されるメモリ２１４と、メモリ制御部２１２と、アクセス抽出部２１３とを有する。
【００１８】
メモリ制御部２１２は、メモリ２１４へのアクセスを制御する。また、アクセス抽出部２１３は、メモリ２１４へのアクセスを抽出して同期制御部２２０へ通知する。
【００１９】
また、同期制御部２２０は、アクセス履歴格納部２２１と、出力値格納部２２３と、制御部２２２とを有する。アクセス履歴格納部２２１は、アクセス抽出部２１３からのデータを格納する。出力値格納部２２３は、演算部２１０のコア２１１が発行した出力要求で出力される値を格納する。また、制御部２２２は、インストラクションロックステップに係る同期を行うための種々の処理を、通信部２３０及び系間通信路１９０を介して先行系計算機１００における同期制御部１２０と連携しつつ実行する。
【００２０】
外部デバイス２４０は、ストレージ２４１、Ｉ／Ｏ装置２４２などのデバイスを含む。外部デバイス２４０を介して他の計算機に接続される場合もある。
【００２１】
図２に、先行系計算機１００における制御部１２２の機能構成例を示す。制御部１２２は、グループ対応表１２２１と、グループ管理部１２２２と、コア実行制御部１２２３とを有する。グループ対応表１２２１は、コア１１１の各々について、出力要求を出力したコアであるか否か、計算を実行可能なコアであるか否かを管理するためのデータを保持する。このグループ対応表１２２１は、後から順番に参照できるようにするため、更新時における同期確認点の番号（例えば実行シーケンス番号）と共に保持される。
【００２２】
グループ対応表１２２１は、例えば図３に示すようなフォーマットを有する。図３の例では、コア１１１のコアＩＤと、各コアの所属グループ（出力要求を発行するコアが属する出力グループ又は計算を実行可能なコアが所属する演算グループ）とを格納するようになっている。
【００２３】
グループ管理部１２２２は、グループ対応表１２２１の更新管理などを実行する。コア実行制御部１２２３は、グループ対応表１２２１に従って各コアの稼働及び停止を制御する。
【００２４】
図４に、遅延系計算機２００における制御部２２２の機能構成例を示す。制御部２２２は、グループ対応表２２２１と、コア実行制御部２２２２と、比較部２２２３とを有する。
【００２５】
グループ対応表２２２１は、先行系計算機１００における制御部１２２から送られてくる。コア実行制御部２２２２は、グループ対応表２２２１に従って各コアの稼働及び停止を制御する。比較部２２２３は、先行系計算機１００における計算結果と遅延系計算機２００における計算結果との比較検証のための処理を行う。
【００２６】
次に、図５乃至図９を用いて、図１に示したシステムの処理の流れを概説する。まず、先行系計算機１００における同期制御部１２０の制御部１２２は、先行系計算機１００の演算部１１０からレジスタ値、メモリのデータＭ及びキャッシュのデータＣを取得して、遅延系計算機２００の同期制御部２２０に転送する（ステップ（１））。遅延系計算機２００における同期制御部２２０の制御部２２２は、レジスタ値、メモリのデータＭ及びキャッシュのデータＣを受信する。
【００２７】
また、先行系計算機１００における同期制御部１２０の制御部１２２は、初期化要求を遅延系計算機２００の同期制御部２２０に発行する（ステップ（２））。遅延系計算機２００における同期制御部２２０の制御部２２２は、初期化要求を受信すると、遅延系計算機２００における演算部２１０に対して、メモリのデータＭ及びキャッシュのデータＣを用いてコア２１１を初期化するための初期化命令を発行する（ステップ（３））。これによって、先行系計算機１００の演算部１１０と同じ初期状態が遅延系計算機２００の演算部２１０に実現される。
【００２８】
その後、先行系計算機１００における同期制御部１２０の制御部１２２（コア実行制御部１２２３）は、計算実行命令を演算部１１０に発行する（ステップ（４））。これに対して、演算部１１０のコア１１１は、計算を開始する。なお、初期的には全てのコア１１１は、演算グループに属する。
【００２９】
計算中に、演算部１１０のいずれかのコア１１１が、メモリ１１４に対するアクセスを行うと、アクセス抽出部１１３により検出され、アクセス抽出部１１３は、同期制御部１２０の制御部１２２に対してメモリ１１４へのアクセスＳ１を通知する（ステップ（５））。
【００３０】
同期制御部１２０の制御部１２２は、メモリ１１４へのアクセスＳ１が通知されると、当該アクセスＳ１のデータを、遅延系計算機２００における同期制御部２２０の制御部２２２に転送する（ステップ（６））。遅延系計算機２００における同期制御部２２０の制御部２２２は、共有メモリへのアクセスＳ１のデータを受信すると、アクセス履歴格納部２２１に格納する。共有メモリへのアクセスＳ１のデータは、先行系計算機１００における同期制御部１２０のアクセス履歴格納部１２１にも格納される。
【００３１】
その後、先行系計算機１００の演算部１１０のコア１１１（少なくとも１つ）が出力要求を発行する（ステップ（７））。そうすると、先行系計算機１００における同期制御部１２０の制御部１２２は、当該出力要求を受信して、出力要求による出力予定値Ｏ１を出力値格納部１２３に格納する。
【００３２】
これに応じて、制御部１２２（コア実行制御部１２２３）は、先行系計算機１００の演算部１１０のコア１１１に対して計算停止命令を発行する（ステップ（８））。これにて先行系計算機１００の演算部１１０のコア１１１は、計算を停止する。さらに、制御部１２２は、演算部１１０のコア１１１（例えば計算を行っていたコアのみ）に対して、レジスタ値の取得命令を発行する（ステップ（９））。演算部１１０のコア１１１は、レジスタ値の取得命令に応じて、レジスタ値Ｒ１を、同期制御部１２０の制御部１２２へ出力する（ステップ（１０））。
【００３３】
ここで、先行系計算機１００における同期制御部１２０の制御部１２２（グループ管理部１２２２）は、この時点における実行シーケンス番号と共に、出力要求を発行したコアが出力グループに属することを表すデータを、先行系計算機１００のグループ対応表１２２１に登録する（ステップ（１１））。このような登録を行うと共に、制御部１２２（グループ管理部１２２２）は、変更後のグループ対応表１２２１を、遅延系計算機２００の同期制御部２２０に転送する（ステップ（１２））。遅延系計算機２００における同期制御部２２０の制御部２２２は、グループ対応表２２２１に登録する。
【００３４】
初期的には、図６に示すようなグループ対応表１２２１であるものとする。そして、出力要求をコア１及び２（コア１１１ａ及び１１１ｂ）が出力したとすると、図３に示すようなグループ対応表１２２１が登録されることになる。
【００３５】
さらに、先行系計算機１００における同期制御部１２０の制御部１２２は、出力予定値Ｏ１を、遅延系計算機２００の同期制御部２２０に転送し（ステップ（１３））、さらにレジスタ値Ｒ１をも、遅延系計算機２００の同期制御部２２０に転送する（ステップ（１４））。
【００３６】
図７における処理に移行して、先行系計算機１００における同期制御部１２０の制御部１２２は、グループ対応表１２２１を参照して、最新のグループ対応表１２２１から、演算グループに属するコアを特定する（ステップ（１５））。
【００３７】
そうすると、先行系計算機１００における同期制御部１２０の制御部１２２（コア実行制御部１２２３）は、特定されたコアに対して、計算実行命令を発行する（ステップ（１６））。先行系計算機１００の演算部１１０は、計算実行命令で指示されたコアにおいて計算Ｘを実行する。本実施の形態では、出力要求を発行したコアは待機状態となるが、それ以外のコアについては演算グループに属しており、出力要求を発行したコアと一緒に待機することなく、次の計算を実行することになる。このように計算資源の有効活用が図られる。
【００３８】
なお、計算Ｘを実行中に、先行系計算機１００における演算部１１０のコア１１１がメモリ１１４にアクセスすることがある。このアクセスはアクセス抽出部１１３により検出され、アクセス抽出部１１３は、同期制御部１２０の制御部１２２に対してメモリ１１４へのアクセスＳ２を通知する（ステップ（１７））。
【００３９】
同期制御部１２０の制御部１２２は、メモリ１１４へのアクセスＳ２が通知されると、当該アクセスＳ２のデータを、遅延系計算機２００における同期制御部２２０の制御部２２２に転送する（ステップ（１８））。遅延系計算機２００における同期制御部２２０の制御部２２２は、共有メモリへのアクセスＳ２のデータを受信すると、アクセス履歴格納部２２１に格納する。共有メモリへのアクセスＳ２のデータは、先行系計算機１００における同期制御部１２０のアクセス履歴格納部１２１にも格納される。
【００４０】
一方、先行系計算機１００から出力予定値Ｏ１及びレジスタ値Ｒ１を受信すると、遅延系計算機２００における同期制御部２２０の制御部２２２（コア実行制御部２２２２）は、グループ対応表２２２１を参照して、まだ未参照のグループ対応表のうち最も古いグループ対応表から、演算グループに属するコアを特定する（ステップ（１９））。この例では図６に示すように、４つのコアが演算グループに属している。
【００４１】
そうすると、同期制御部２２０の制御部２２２は、ステップ（１）で受信したレジスタ値ＲとアクセスＳ１とを用いて演算グループに属するコアで計算再現を行うように計算再現命令を、演算部２１０に対して発行する（ステップ（２０））。これに応じて、演算部２１０において演算グループに属するコアは、先行系計算機１００において実行された計算を実行する。そうすると、先行系計算機１００のように、共有メモリへのアクセスが発生するが、ここでは先行系計算機１００から受信したアクセスＳ１のデータにアクセスさせる。また、計算再現中に、遅延系計算機２００の演算部２１０のコア２１１（少なくとも１つ）が出力要求を発行する（ステップ（２１））。そうすると、遅延系計算機２００における同期制御部２２０の制御部２２２は、当該出力要求を受信して、出力要求による出力予定値Ｏ２を出力値格納部２２３に格納する。
【００４２】
そうすると、制御部２２２（コア実行制御部２２２２）は、遅延系計算機２００の演算部２１０のコア２１１に対して計算再現停止命令を発行する（ステップ（２２））。これにて遅延系計算機２００の演算部２１０のコア２１１は、計算再現を停止する。さらに、制御部２２２は、演算部２１０のコア２１１（例えば計算を行っていたコアのみ）に対して、レジスタ値の取得命令を発行する（ステップ（２３））。演算部２１０のコア２１１は、レジスタ値の取得命令に応じて、レジスタ値Ｒ２を、同期制御部２２０の制御部２２２へ出力する（ステップ（２４））。
【００４３】
そうすると、遅延系計算機２００における同期制御部２２０の制御部２２２（比較部２２２３）は、グループ対応表２２２１を参照して、実行していた計算再現のためのグループ対応表から、演算グループに属するコアを再確認する（ステップ（２５））。なお、レジスタ値の取得の前に本ステップを実行しても良い。
【００４４】
そして、制御部２２２（比較部２２２３）は、出力予定値Ｏ１及びＯ２と、レジスタ値Ｒ１とレジスタ値Ｒ２とを比較する（ステップ（２６））。比較するレジスタ値は、演算グループに属するコアのレジスタ値のみである。
【００４５】
その後、遅延系計算機２００における同期制御部２２０の制御部２２２は、比較結果を、先行系計算機１００の同期制御部１２０へ転送する（ステップ（２７））。先行系計算機１００における同期制御部１２０の制御部１２２は、遅延系計算機２００から、比較結果を受信する。
【００４６】
なお、比較結果が、Ｏ１＝Ｏ２であり且つＲ１＝Ｒ２であることを表していれば、遅延系計算機２００における同期制御部２２０は、出力予定値Ｏ２を、外部デバイス２４０に出力する。
【００４７】
先行系計算機１００における同期制御部１２０の制御部１２２は、遅延系計算機２００から比較結果を受信すると、計算停止命令を、演算部２１０に対して発行する（ステップ（２８））。また、制御部１２２は、比較結果を確認して、Ｏ１＝Ｏ２であり且つＲ１＝Ｒ２である場合には、出力値格納部１２３に格納されている出力予定値Ｏ１を、外部デバイス１４０に対して出力する（ステップ（２９））。
【００４８】
さらに、先行系計算機１００における同期制御部１２０の制御部１２２（グループ管理部１２２２）は、比較結果が得られた計算について出力要求を出力したコアを特定して、この時点における実行シーケンス番号と共に、特定されたコアが演算グループに属することを表すデータ（すなわち出力グループの削除）を、先行系計算機１００のグループ対応表１２２１に登録する（ステップ（３０））。このような登録を行うと共に、制御部１２２（グループ管理部１２２２）は、変更後のグループ対応表１２２１を、遅延系計算機２００の同期制御部２２０に転送する（ステップ（３１））。遅延系計算機２００における同期制御部２２０の制御部２２２は、グループ対応表２２２１に登録する。
【００４９】
このような処理を実行することで、計算Ｘの部分で、全コアが待機状態に陥ることを回避できるので、計算資源の有効活用が図られ、計算効率が向上する。
【００５０】
図８に、コアの使用状態の時間変化を模式的に示す。コアは図１と同様に４つ存在する例を示しているが、出力要求を発行するのはコア１及び２（コア１１１ａ及び１１１ｂ）であるものとする。また、上から下に時間が流れるものとする。先行系計算機１００で最初の計算１を実行していると、コア１及び２が出力要求を点Ａで発すると、遅延系計算機２００では、コア１乃至４で計算再現１が実行される。点Ａでは、図３に示すようなグループ対応表１２２１が登録される。
【００５１】
一方、先行系計算機１００では、点Ａの後直ぐに、出力要求を発行したコア１及び２以外のコア３及び４が計算２を実行する。そのうち、遅延系計算機２００では、計算再現１が終了して点Ｂで比較結果が先行系計算機１００に出力される。ここで比較結果がレジスタ値及び出力予定値の一致を表している場合には、先行系計算機１００及び遅延系計算機２００において出力が行われる。点Ｂでは、図６に示すようなグループ対応表１２２１が登録される。
【００５２】
さらに、出力が実行されると、先行系計算機１００では、コア１乃至４は計算３を実行する。また、遅延系計算機２００においては、点Ａにおけるグループ対応表２２２１に基づき、コア３及び４によって計算再現２を実行する。
【００５３】
その後、先行系計算機１００では、計算１と同じように、点Ｃで、コア１及び２が出力要求を発行したものとする。点Ｃでは、点Ａと同様のグループ対応表１２２１（図３）が登録される。そうすると、先行系計算機１００では、図３のようなグループ対応表１２２１に基づき、コア３及び４が、計算４を実行する。
【００５４】
一方、遅延系計算機２００では、計算再現２が終了すると、計算３に対応する計算再現３を、点Ｂにおけるグループ対応表２２２１に基づき、コア１乃至４が実行する。そうすると、計算再現３による比較結果を遅延系計算機２００から先行系計算機１００へ送信し、比較結果がレジスタ値及び出力予定値の一致を表している場合には、先行系計算機１００及び遅延系計算機２００が出力を実行する。
【００５５】
一方、従来のように全てのコアで計算を実行するようにすると、図９に示すように、コア１乃至４の待ち受け時間Ｙ及びＺが生じてしまう。出力要求を発行しなかったコアも停止してしまうので、効率が悪くなることが分かる。
【００５６】
これに対して、図８では計算２及び計算４は、一部のコアではあるが、待ち受けを行うことなく実行でき、効率が向上していることが分かる。
【００５７】
図８の例では、４つのコアのうち２つのコアで出力要求を発行する例を示しているが、コア数が増加した場合、出力要求を発するコアの比率が同一又は増加するとは考えられず、コア総数に対する出力要求を発するコアの数の比率は低下すると考えられる。そうなると、より多くのコアを含むＣＰＵが採用されれば、より本実施の形態の効果が増加することになる。
【００５８】
次に、先行系計算機１００の同期制御部１２０による具体的な処理について、図１０乃至図２１を用いて説明する。
【００５９】
まず、同期制御部１２０は、初期化処理を実行する（図１０：ステップＳ１）。初期化処理については、図１１を用いて説明する。
【００６０】
まず、同期制御部１２０の制御部１２２は、演算部１１０のレジスタ値を読み出す（図１１：ステップＳ３１）。また、制御部１２２は、演算部１１０のメモリ１１４のデータを読み出す（ステップＳ３３）。さらに、制御部１２２は、演算部１１０のキャッシュのデータを読み出す（ステップＳ３５）。
【００６１】
そして、制御部１２２は、レジスタ値、メモリデータ及びキャッシュデータを、遅延系計算機２００の同期制御部２２０に転送する（ステップＳ３７）。さらに、制御部１２２は、遅延系計算機２００の同期制御部２２０に対して、遅延系計算機２００の演算部２１０の初期化要求を送信する（ステップＳ３９）。そして、処理は呼び出し元の処理に戻る。
【００６２】
このようにして遅延系計算機２００の演算部２１０の状態を、先行系計算機１００の演算部１１０の状態に一致させるものである。
【００６３】
図１０の処理の説明に戻って、制御部１２２は、比較結果を遅延系計算機２００から受信したか否かを判断する（ステップＳ３）。比較結果を遅延系計算機２００から受信した場合には、処理は端子Ａを介して図２０の処理に移行する。
【００６４】
一方、比較結果を遅延系計算機２００から受信したわけではない場合には、制御部１２２は、計算指示処理を実行する（ステップＳ５）。計算指示処理については、図１２を用いて説明する。
【００６５】
制御部１２２のコア実行制御部１２２３は、最新のグループ対応表１２２１を参照して、演算グループに属するコアを特定する（図１２：ステップＳ４１）。
【００６６】
そして、制御部１２２のコア実行制御部１２２３は、特定されたコアのみでの計算を実行するように計算実行命令を、演算部１１０に対して発行する（ステップＳ４３）。
【００６７】
このようにすれば、出力要求を発行したコアについては比較結果を遅延系計算機２００から受信するまで待機するが、それ以外のコアについては計算を行うようになる。
【００６８】
図１０の処理の説明に戻って、制御部１２２は、演算部１１０のアクセス抽出部１１３からメモリ１１４へのアクセスのデータを受信すると、メモリ１１４へのアクセスのデータを、遅延系計算機２００へ転送する（ステップＳ７）。なお、アクセスのデータについては、アクセス履歴格納部１２１に格納される。
【００６９】
また、制御部１２２は、同期確認点通知を演算部１１０から受信したか否かを判断する（ステップＳ９）。演算部１１０は、例えばｉｆ分岐の実行回数を計数しており、実行回数が所定回数に達する度に、同期確認点通知を発行するものとする。
【００７０】
同期確認点通知を受信した場合には、制御部１２２は、確認処理を実行する（ステップＳ１９）。確認処理については図１３を用いて説明する。
【００７１】
まず、制御部１２２のコア実行制御部１２２３は、演算部１１０に対して計算停止命令を発行する（図１３：ステップＳ５１）。これで演算部１１０のコア１１１は、計算を停止する。
【００７２】
そして、制御部１２２は、演算部１１０にレジスタ値の取得命令を発行する（ステップＳ５３）。そうすると、演算部１１０は、レジスタ値を制御部１２２に出力する。
【００７３】
その後、制御部１２２は、演算部１１０からレジスタ値を受信する（ステップＳ５５）。そして処理は呼び出し元の処理に戻る。
【００７４】
図１０の処理の説明に戻って、制御部１２２は、取得したレジスタ値を、遅延系計算機２００の同期制御部２２０へ転送する（ステップＳ２１）。その後、処理は端子Ｂを介してステップＳ３の処理に戻る。
【００７５】
一方、同期確認点通知を受信していない場合には、制御部１２２は、演算部１１０から出力要求を受信したか否かを判断する（ステップＳ１１）。出力要求を受信していない場合には、処理はステップＳ７に戻る。
【００７６】
一方、出力要求を受信した場合には、制御部１２２は、確認処理を実行する（ステップＳ１３）。確認処理は図１３で述べた処理である。そして、制御部１２２は、登録処理を実行する（ステップＳ１５）。登録処理については、図１４を用いて説明する。
【００７７】
まず、制御部１２２のグループ管理部１２２２は、演算部１１０の全コアのＩＤを取得する（図１４：ステップＳ６１）。また、グループ管理部１２２２は、外部デバイス１４０への出力要求を取得する（ステップＳ６３）。なお、制御部１２２は、出力要求によって出力する出力予定値及び出力要求を出力したコアのＩＤについては、出力値格納部１２３に格納する。
【００７８】
さらに、グループ管理部１２２２は、グループ対応表１２２１を参照して、各コアの所属グループをチェックする（ステップＳ６５）。
【００７９】
そして、グループ管理部１２２２は、出力要求に含まれるコアＩＤの所属グループを出力グループとして、出力要求発行時の実行シーケンス番号を関連付けてグループ対応表１２２１を更新する（ステップＳ６７）。
【００８０】
例えば図６に示したグループ対応表１２２１を、図３に示したグループ対応表１２２１に更新する。なお、既に出力グループが存在する場合には、例えば図１５に示すようなグループ対応表１２２１に更新される場合もある。すなわち、コア１及びコア２が含まれる第１の出力グループ（出力１）と、コア３が含まれる第２の出力グループ（出力２）とが登録されている。
【００８１】
また、グループ管理部１２２２は、遅延系計算機２００の同期制御部２２０に対して、グループ対応表１２２１の更新を通知する（ステップＳ６９）。これに応じて、グループ対応表２２２１が更新される。
【００８２】
このようにすれば、次の計算に用いることができるコアを特定できるようになる。
【００８３】
図１０の処理の説明に戻って、制御部１２２は、出力要求の出力予定値を、遅延系計算機２００の同期制御部２２０に転送する（ステップＳ１７）。遅延系計算機２００の同期制御部２２０は、例えば出力値格納部２２３に、受信した出力予定値を格納する。その後処理はステップＳ２１に移行する。
【００８４】
端子Ａ以降の処理については、遅延系計算機２００における計算再現が完了した後に行われるので、先に遅延系計算機２００における同期制御部２２０の処理について図１６乃至図１９を用いて説明する。
【００８５】
まず、同期制御部２２０の制御部２２２は、初期化要求を先行系計算機１００から受信したか否かを判断する（図１６：ステップＳ７１）。初期化要求を受信した場合には、先行系計算機１００の同期制御部１２０から受信したレジスタ値、メモリデータ及びキャッシュデータのうち、メモリデータ及びキャッシュデータで、演算部２１０の初期化を実行する（ステップＳ７３）。そして処理は端子Ｃを介してステップＳ７１に戻る。
【００８６】
一方、初期化要求を受信したわけではない場合には、同期制御部２２０の制御部２２２は、先行系計算機１００の同期制御部１２０から、共有メモリアクセスのデータを受信し（ステップＳ７５）、アクセス履歴格納部２２１に格納する。
【００８７】
さらに、同期制御部２２０の制御部２２２は、先行系計算機１００の同期制御部１２０から、レジスタ値を受信する（ステップＳ７７）。なお、ステップＳ７７で受信したレジスタ値は、後に計算結果に含まれるレジスタ値との比較対象となる。
【００８８】
そして、制御部２２２は、演算グループによる計算再現処理を実行する（ステップＳ７９）。計算再現処理については、図１７を用いて説明する。
【００８９】
制御部２２２のコア実行制御部２２２２は、次に実行する区間のグループ対応表２２２１を参照して、演算グループに属するコアを特定する（図１７：ステップＳ９１）。未使用のグループ対応表のうち最も古い（実行シーケンス番号が最も小さい）グループ対応表を用いる。
【００９０】
そして、制御部２２２のコア実行制御部２２２２は、特定されたコアについて、共有メモリアクセスのデータ、開始時のレジスタ値及び終了時のレジスタ値が揃っているか否かを確認する（ステップＳ９３）。図５の例では、レジスタ値Ｒ及びＲ１と、共有メモリへのアクセスデータＳ１とが揃っているか否かを判断する。揃っていない場合には、待機する。
【００９１】
開始時及び終了時のレジスタ値並びに共有メモリアクセスのデータが揃っていれば、制御部２２２のコア実行制御部２２２２は、演算部２１０に対して、演算グループに属するコアによるレジスタ値及び共有メモリアクセスのデータに基づく計算再現の実行命令を発行する（ステップＳ９５）。なお、演算部２１０のコア２１１からメモリ２１４へのアクセスをアクセス抽出部２１３が検出すると、先行系計算機１００から受信した共有メモリアクセスのデータをアクセス元のコア２１１に出力する。
【００９２】
そして、演算部２１０で出力要求が発生した場合には（ステップＳ９７：Ｙｅｓルート）、制御部２２２は、出力要求を演算部２１０から受信する（ステップＳ９９）。出力要求で出力される出力予定値及び出力元コアのＩＤを保持しておく。そして処理はステップＳ１０３に移行する。
【００９３】
一方、演算部２１０で出力要求が発生しない場合には（ステップＳ９７：Ｎｏルート）、制御部２２２は、演算部２１０から同期確認点通知を受信することになる（ステップＳ１０１）。例えば、ｉｆ分岐を所定回数実行したことが通知される。
【００９４】
その後、制御部２２２のコア実行制御部２２２２は、計算再現の停止命令を、演算部２１０に対して発行する（ステップＳ１０３）。
【００９５】
このようにして遅延系計算機２００において計算再現が実行されるようになる。
【００９６】
図１６の処理の説明に戻って、制御部２２２は、計算再現処理の処理結果の取得処理を実行する（ステップＳ８１）。本取得処理については、図１８を用いて説明する。
【００９７】
まず、制御部２２２は、演算部２１０に対してレジスタ値の取得命令を発行する（図１８：ステップＳ１１１）。これに対して、演算部２１０は、レジスタ値を読み出して、制御部２２２に出力する。
【００９８】
よって、制御部２２２は、演算部２１０からレジスタ値を取得する（ステップＳ１１３）。そして処理は図１６の処理に戻る。
【００９９】
図１６の処理の説明に戻って、制御部２２２は、計算結果の比較処理を実行する（ステップＳ８３）。計算結果の比較処理については、図１９を用いて説明する。
【０１００】
まず、制御部２２２の比較部２２２３は、計算再現を行った区間のグループ対応表２２２１を参照して、演算グループのコアを特定する（ステップＳ１２１）。
【０１０１】
また、制御部２２２の比較部２２２３は、特定されたコアについて、取得されたレジスタ値と、先行系計算機１００から受信したレジスタ値とを比較する（ステップＳ１２３）。
【０１０２】
そして、演算部２１０から出力要求を受信した場合には（ステップＳ１２５：Ｙｅｓルート）、制御部２２２の比較部２２２３は、計算再現によって得られた出力予定値と、先行系計算機１００から受信した出力予定値とを比較する（ステップＳ１２７）。そして処理はステップＳ１２９に移行する。
【０１０３】
一方、演算部２１０から出力要求を受信しなかった場合にも（ステップＳ１２５：Ｎｏルート）、処理はステップＳ１２９に移行する。
【０１０４】
そして、制御部２２２の比較部２２２３は、比較結果を先行系計算機１００の同期制御部１２０に送信する（ステップＳ１２９）。ステップＳ１２３における比較結果と、出力要求があった場合にはステップＳ１２７における比較結果とが、先行系計算機１００に対して送信される。そして、処理は呼び出し元の処理に戻る。
【０１０５】
図１６の処理の説明に戻って、演算部２１０は、出力要求を受信している場合には、比較結果がレジスタ値及び出力予定値の一致を表していれば、出力を実行する（ステップＳ８５）。
【０１０６】
このような処理を行えば、適切に計算再現を遅延系計算機２００で行うことができるようになる。
【０１０７】
ここで先行系計算機１００の同期制御部１２０の処理の説明（図２０及び図２１）に戻って、同期制御部１２０の制御部１２２は、遅延系計算機２００の同期制御部２２０から比較結果を受信すると、当該比較結果が、一致を表しているか否かを判断する（ステップＳ１３１）。レジスタ値の一致、出力予定値の一致が各々判断される。
【０１０８】
一部でも不一致があった場合には、制御部２２２は、予め定められた例外処理を実行する（ステップＳ１３３）。例外処理は、従来と同じであり、ここでは詳細な説明は省略する。そして処理は終了する。
【０１０９】
一方、比較結果が、すべて一致を表していた場合には、制御部１２２は、比較結果に関連する出力要求が存在していたか否かを判断する（ステップＳ１３５）。比較結果に関連する出力要求が存在していない場合には、処理はステップＳ１３９に移行する。
【０１１０】
一方、比較結果に関連する出力要求が存在する場合には、制御部１２２は、出力値格納部１２３に格納されている出力値を読み出して、外部デバイス１４０に対して出力する（ステップＳ１３７）。
【０１１１】
そして、制御部１２２は、削除処理を実行する（ステップＳ１３９）。この処理が終了すると、端子Ｂを介して処理は図１０のステップＳ３に戻る。削除処理については、図２１を用いて説明する。
【０１１２】
まず、制御部１２２のグループ管理部１２２２は、例えば出力値格納部１２３から、出力要求を発行したコアのＩＤを取得する（図２１：ステップＳ１４１）。
【０１１３】
制御部１２２のグループ管理部１２２２は、出力要求に係る区間のグループ対応表を参照して、各コアの所属グループをチェックする（ステップＳ１４３）。
【０１１４】
制御部１２２のグループ管理部１２２２は、出力要求を発行したコアが所属するグループを演算グループとして、この時点における実行シーケンス番号に関連付けてグループ対応表１２２１を更新する（ステップＳ１４５）。
【０１１５】
さらに、制御部１２２は、遅延系計算機２００の同期制御部２２０に対して、グループ対応表１２２１の更新を通知する（ステップＳ１４７）。遅延系計算機２００における同期制御部２２０の制御部２２２は、グループ対応表の更新通知を受信すると、グループ対応表２２２１を更新する。
【０１１６】
以上のような処理を実行すると、上で述べたように、コアの利用効率が向上することで、計算効率が向上することになる。
【０１１７】
［実施の形態２］
本実施の形態では、第１の実施の形態で述べた処理を実行する機能を、主にソフトウエアで実装する例を示す。
【０１１８】
具体的には、本実施の形態ではハイパーバイザ上に起動した演算用の仮想マシンに対して第１の実施の形態で述べた技術を適用する。
【０１１９】
本実施の形態では、図２２に示すように、２つの物理サーバが系間通信路を介して接続されている。そして、各物理サーバは、仮想化支援機構とメモリ制御部と、複数のコア（図２２では４つのコア）とを有するＣＰＵと、メモリと、チップセットと、外部デバイスと、通信部とを有している。そして、各物理サーバでは、仮想マシンの起動及び制御などを行うためのハイパーバイザが実行される。
【０１２０】
そして、２台の物理サーバ上に仮想マシンを各々生成し、仮想マシンレベルでの同期を行う。同期対象となる仮想マシンには仮想コアが複数割り当てられ、ＳＭＰを行う。ＳＭＰでは複数のコアがアクセス可能なメモリ領域である共有メモリを用い、複数のコアで協調して計算を行う。
【０１２１】
本実施の形態では、例えば図２３に示すような構成を有する物理サーバを２つ構築する。例えば、物理サーバはインテル社のｘ８６系ＣＰＵを含む計算機であり、各物理サーバでは、例えばXenServerという仮想化ソフトウエアであるハイパーバイザが実行され、当該ハイパーバイザ上に生成される管理仮想マシンdom0上で、制御ソフトウエアが実行される。制御ソフトウエアは、同期を行うための仮想マシンの起動、管理及び制御を行うためのソフトウエアである。
【０１２２】
制御ソフトウエアは、演算用仮想マシンと制御用仮想マシンを各物理サーバに生成する。演算用仮想マシンは、複数の仮想コアを含み、本実施の形態に係る処理を行うドライバと一般的なＯＳ（Operating System）とが実行される。
【０１２３】
また、各物理サーバには、外部デバイスの一種として仮想ディスクが用意される。
【０１２４】
演算用仮想マシンと制御用仮想マシンとは、互いに通信を行うための内部通信路で仮想的に結線されている。また、２つの物理サーバは、当該２つの物理サーバ間を直接結線している系間通信路を用いて互いに通信を行うことで同期を実現する。演算用仮想マシンは第１の実施の形態に係る演算部に対応し、制御用仮想マシンは第１の実施の形態に係る同期制御部に対応する。
【０１２５】
このような構成においては、物理サーバのＣＰＵが有する仮想化支援機構（例えば、Intel Virtualization Technology）を利用することで、メモリ、キャッシュ、レジスタ、入出力の制御、及び命令実行の監視を行う。
【０１２６】
また、命令実行の監視では、例えばインテル社のｘ８６系ＣＰＵにおいてパフォーマンスカウンタの一種であるｉｆ分岐の実行回数をカウントするためのカウンタを利用する。すなわち、一定回数ｉｆ分岐を実行する毎に、ハイパーバイザの機能を利用して仮想マシンの仮想クロックを一時停止／再開することで、計算実行／停止を実現する。また、このカウンタを利用し、実行シーケンス番号として処理が発生したタイミングを管理する。
【０１２７】
計算再現については、上記のような計算実行／停止に加えて、ＣＰＵの仮想化支援機構を用いて共有メモリへのアクセスを検知すると、ハイパーバイザの機能を用いて一時停止を行い、仮想化支援機構によってアクセス先のメモリの値を書き換えた後で、演算用仮想マシンの再開を行うことで実現する。
【０１２８】
演算用仮想マシンのＯＳとしては、例えばWindows（登録商標）が用いられる。また、演算用仮想マシンの入出力及び動作を制御するために、本実施の形態に係るドライバがインストールされる。そして、このドライバは、演算用仮想マシンで発生した入出力を仮想的な結線を通じて制御用仮想マシンに、外部デバイスへの出力要求として通知する。
【０１２９】
制御用仮想マシンのＯＳとしては、例えばLinux（登録商標）がインストールされており、仮想的な結線を通じて演算用仮想マシンのドライバから入手した情報を基に、演算用仮想マシンに対して制御を行う。グループ対応表は制御用仮想マシンで管理する。出力要求が発生した場合、制御用仮想マシンでグループ対応表を生成及び更新し、演算用仮想マシンにおいて演算に使用される仮想コアを制御する。グループ対応表については、出力要求が発生した際の実行シーケンス番号と、出力要求を実行した仮想コアのＩＤ、該当する出力を実行した際の実行シーケンス番号を一つのセットとして取り扱う。同期制御部である制御用仮想マシンによって許可が下りた出力処理は、管理仮想マシン（dom0）によって実行される。
【０１３０】
［実施の形態３］
図２４に、本実施の形態に係る情報処理システムの構成例を示す。本実施の形態では、先行系計算機３００と遅延系計算機４００とが、例えばイーサネット（登録商標）などのネットワークにて接続されている。
【０１３１】
先行系計算機３００は、ＣＰＵ３１０及び３２０と、チップセット３５０と、メモリ３３０及び３４０と、外部デバイス３７０と、通信部３６０とを有する。
【０１３２】
ＣＰＵ３１０は、コア３１１ａ及び３１１ｂと、リングバス３１２と、ＬＬ（Last Level）キャッシュ３１３と、メモリコントローラ３１４とを有する。リングバス３１２に、コア３１１ａ及び３１１ｂと、ＬＬキャッシュ３１３と、メモリコントローラ３１４とが接続されている。メモリコントローラ３１４には、共有メモリであるメモリ３３０が接続されている。
【０１３３】
ＣＰＵ３２０も、コア３２１ａ及び３２１ｂと、リングバス３２２と、ＬＬキャッシュ３２３と、メモリコントローラ３２４とを有する。リングバス３２２に、コア３２１ａ及び３２１ｂと、ＬＬキャッシュ３２３と、メモリコントローラ３２４とが接続されている。メモリコントローラ３２４には、共有メモリであるメモリ３４０が接続されている。
【０１３４】
ＣＰＵ３１０とＣＰＵ３２０とは、ＱＰＩ（QuickPath Interconnect）バス３８０とで接続されており、チップセット３５０もこのＱＰＩに接続されている。
【０１３５】
チップセット３５０は、共有メモリであるメモリ３３０及び３４０へのアクセスを抽出するアクセス抽出部３５１と、アクセス履歴格納部３５２と、本実施の形態における主要な処理を実行する制御部３５３と、従来のチップセットの機能を有するデバイス制御部３５４とを有する。
【０１３６】
アクセス抽出部３５１及び制御部３５３は、ＱＰＩバス３８０を介して、コア３１１ａ及び３１１ｂ並びに３２１ａ及び３２１ｂによるメモリトランザクションを受信する。デバイス制御部３５４は、例えばＰＣＩｅ（Peripheral Component Interconnect Express）を介して外部デバイス３７０及び通信部３６０に接続される。制御部３５３は、デバイス制御部３５４を介して外部デバイス３７０及び通信部３６０へ出力を行う。なお、アクセス抽出部３５１、アクセス履歴格納部３５２及び制御部３５３は、ＦＰＧＡ（Field-Programmable Gate Array）で実装される。本実施の形態では、第１の実施の形態における出力値格納部１２３が設けられていない。
【０１３７】
本実施の形態では、ＬＬキャッシュ３１３及び３２３をバッファとして利用する。各コアは、ｉｆ命令を実行する度、共有メモリへのアクセス要求を行う度に、ＱＰＩバス３８０へ信号を出力する。本実施の形態におけるＣＰＵ３１０及び３２０と、ＱＰＩバス３８０と、アクセス抽出部３５１とが、第１の実施の形態における演算部に対応する。また、本実施の形態におけるアクセス抽出部３５１以外のチップセット３５０の部分及び通信部３６０は、第１の実施の形態における同期制御部に対応する。
【０１３８】
また、制御部３５３及びアクセス抽出部３５１は、ＱＰＩバス３８０経由でリングバス３１２を監視することで、発生した命令の監視を行う。これによってメモリ３３０及び３４０へのアクセスを監視し、ｉｆ命令の実行回数の計数を行う。また、出力割り込みが発生した際に出力の内容を制御部３５３へ通知するように、割り込みベクタテーブルを修正することで、制御部３５３は出力要求（出力命令とも呼ぶ）の発生を取得する。本実施の形態では、ＣＰＵ３１０及び３２０によるＩＯ（Input Output）空間への書き込みは、チップセット３５０に出力値格納部が設けられていないため、メモリ３３０及び３４０に対して行われ、計算再現などが行われた後に、改めて制御部３５３を介して行われる。
【０１３９】
また、制御部３５３は、各コア３１１ａ及び３１１ｂ並びに３２１ａ及び３２１ｂで実行されたｉｆ命令の実行回数を計数し、一定回数のｉｆ命令が実行される毎に，同期確認点を生成する。また、この計数を基に、制御部３５３は、各コアがどのタイミングで処理を行ったかを表す実行シーケンス番号を所持する。
【０１４０】
遅延系計算機４００は、先行系計算機３００と同様の構成を有している。すなわち、遅延系計算機４００は、ＣＰＵ４１０及び４２０と、チップセット４５０と、メモリ４３０及び４４０と、外部デバイス４７０と、通信部４６０とを有する。
【０１４１】
ＣＰＵ４１０は、コア４１１ａ及び４１１ｂと、リングバス４１２と、ＬＬ（Last Level）キャッシュ４１３、メモリコントローラ４１４を有する。リングバス４１２に、コア４１１ａ及び４１１ｂと、ＬＬキャッシュ４１３と、メモリコントローラ４１４とが接続されている。メモリコントローラ４１４には、共有メモリであるメモリ４３０が接続されている。
【０１４２】
ＣＰＵ４２０も、コア４２１ａ及び４２１ｂと、リングバス４２２と、ＬＬキャッシュ４２３と、メモリコントローラ４２４とを有する。リングバス４２２に、コア４２１ａ及び４２１ｂと、ＬＬキャッシュ４２３と、メモリコントローラ４２４とが接続されている。メモリコントローラ４２４には、共有メモリであるメモリ４４０が接続されている。
【０１４３】
チップセット４５０は、共有メモリであるメモリ４３０及び４４０へのアクセスを抽出するアクセス抽出部４５１と、アクセス履歴格納部４５２と、本実施の形態における主要な処理を実行する制御部４５３と、従来のチップセットの機能を有するデバイス制御部４５４とを有する。
【０１４４】
アクセス抽出部４５１及び制御部４５３は、ＱＰＩバス４８０を介して、コア４１１ａ及び４１１ｂ並びに４２１ａ及び４２１ｂによるメモリトランザクションを受信する。デバイス制御部４５４は、例えばＰＣＩｅ（Peripheral Component Interconnect Express）を介して外部デバイス４７０及び通信部４６０に接続される。制御部４５３は、デバイス制御部４５４を介して外部デバイス４７０及び通信部４６０へ出力を行う。なお、アクセス抽出部４５１、アクセス履歴格納部４５２及び制御部４５３は、ＦＰＧＡ（Field-Programmable Gate Array）で実装される。本実施の形態では、第１の実施の形態における出力値格納部２２３が設けられていない。
【０１４５】
各コアは、ｉｆ命令を実行する度、共有メモリへのアクセス要求を行う度に、ＱＰＩバス４８０へ信号を出力する。本実施の形態におけるＣＰＵ４１０及び４２０と、ＱＰＩバス４８０と、アクセス抽出部４５１とが、第１の実施の形態における演算部に対応する。また、本実施の形態におけるアクセス抽出部４５１以外のチップセット４５０の部分及び通信部４６０は、第１の実施の形態における同期制御部に対応する。また、制御部４５３及びアクセス抽出部４５１は、ＱＰＩバス４８０経由でリングバス４１２を監視することで、発生した命令の監視を行う。
【０１４６】
上で述べたように、本実施の形態では、メモリ３３０及び３４０に、出力要求において出力される値が格納されることになるので、実際に出力処理が行われるまでに、メモリ３３０及び３４０に格納されている出力予定値が書き換わってしまうことを回避する仕組みが採用される。
【０１４７】
このため、本実施の形態では、出力要求が発生した後実際に出力が完了するまでの間において、演算グループのコアが仮計算を実行する出力モードが設けられている。
【０１４８】
仮計算が通常モードにおける計算と異なる点は、共有メモリであるメモリ３３０及び３４０へのアクセスである。出力予定値が書き換わることを回避するため、共有メモリへの書き込みを共有メモリに対して直接実行せず、バッファであるＬＬキャッシュ３１３又は３２３を間接参照させることで、メモリ３３０及び３４０の整合性を保つ。ここで、一時的にメモリ３３０及び３４０以外の領域に保存するため、ＬＬキャッシュ３１３又は３２３において、メモリ３３０又は３４０のアドレスと値とを保持する。
【０１４９】
仮計算では、以下のようなメモリ関連処理を行う。
（ａ）メモリ３３０及び３４０へアクセスが発生した場合、メモリ３３０及び３４０の値ではなく、対応するアドレスを有する、ＬＬキャッシュ３１３又は３２３における値を参照する。
（ｂ）対応するアドレスの値がＬＬキャッシュ３１３及び３２３に存在しない状態で読み込みが発生した場合には、メモリ３３０又は３４０における値を直接参照する。
（ｃ）対応するアドレスの値がＬＬキャッシュ３１３及び３２３に存在しない状態で書き込みが発生した場合には、メモリ３３０又は３４０へと書き込みを実行せず、代わりに対応するアドレスを新規にＬＬキャッシュ３１３又は３２３に生成し、そこに書き込みを行う。
（ｄ）ＬＬキャッシュ３１３及び３２３には世代が存在し、世代毎に異なるメモリ状態を保持できる。世代が更新されない間は、メモリ３３０又は３４０へのアクセスは、ＬＬキャッシュ３１３又は３２３の同一アドレスへのアクセスとなる。
（ｅ）ＬＬキャッシュ３１３及び３２３の情報については、世代を指定してコミットを行うことで、ＬＬキャッシュ３１３及び３２３における指定した世代の情報が、メモリ３３０又は３４０へと反映される。
【０１５０】
遅延系計算機４００では、仮計算に対応して仮計算再現が実行される。また、遅延系計算機４００では、通常モードにおける計算に対応して計算再現が実行される。
【０１５１】
このため、例えばＣＰＵ３１０及び３２０におけるＬＬキャッシュ３１３及び３２３は、図２５に示すように、世代管理テーブルを格納する。図２５の例では、世代の識別情報と、世代更新時における実行シーケンス番号とを含む。世代は、後に述べるように、同期確認点、出力要求を検出した際及び実際に出力を行う際に更新される。
【０１５２】
また、ＬＬキャッシュ３１３又は３２３は、例えば図２６に示すように、データを保持する。図２６の例では、各バッファアドレスについて、値と、メモリ３３０又は３４０における対応アドレスと、世代とが格納されるようになっている。
【０１５３】
また、制御部３５３から、実行シーケンス番号が指定された、仮計算のコミットが指示されると、対応する世代のデータをＬＬキャッシュ３１３又は３２３からメモリ３３０又は３４０に書き込む。図２５及び図２６の例で、実行シーケンス番号００１５００−００３０００のコミットが指示されると、世代「２」でコミットされることになるので、アドレスＡの「２」及びアドレスＢの「３」を、メモリ３３０又は３４０に書き込むことになる。
【０１５４】
さらに、本実施の形態では、制御部３５３及び４５３は、図２７に示すようなグループ対応表を管理する。本実施の形態では、出力要求時の実行シーケンス番号と、出力要求を行ったコアのグループのＩＤ（グループＩＤ）と、このグループに所属するコアのＩＤ（コアＩＤ）と、出力時の実行シーケンス番号とが登録されるようになっている。図２７の例では、１行目は既に出力を実際に実行しているが、２行目については、出力要求が検出されたところで、出力要求時の実行シーケンス番号と、グループＩＤと、コアＩＤとが登録された状態を示している。
【０１５５】
なお、先行系計算機３００における制御部３５３は、図２８に示すように、グループ対応表３５３１と、グループ管理部３５３２と、コア実行制御部３５３３と、出力モード処理部３５３４とを有する。グループ管理部３５３２及びコア実行制御部３５３３は、第１の実施の形態におけるグループ管理部及びコア実行制御部と同様の機能を有する。出力モード処理部３５３４は、出力モード及び仮計算に関連する処理を実行する。
【０１５６】
また、遅延系計算機４００における制御部４５３は、図２９に示すように、グループ対応表４５３１と、コア実行制御部４５３２と、比較部４５３３と、出力モード処理部４５３４とを有する。コア実行制御部４５３２及び比較部４５３３は、第１の実施の形態におけるコア実行制御部及び比較部と同様の機能を有する。出力モード処理部４５３４は、出力モード及び仮計算再現に関連する処理を実行する。
【０１５７】
次に、本実施の形態に係る処理内容について、図３０乃至図５０を用いて説明する。
【０１５８】
まず、先行系計算機３００におけるＣＰＵ３１０及び３２０並びに制御部３５３は、初期化のための処理を実行する（図３０：ステップＳ２０１）。本処理は、第１の実施の形態における初期化処理と同様であり、メモリのデータ、キャッシュのデータ及びレジスタ値を、先行系計算機３００から遅延系計算機４００へコピーし、先行系計算機３００のグループ対応表３５３１を遅延系計算機４００にコピーする。なお、初期的にはグループ対応表３５３１には出力グループが存在しないので、空のグループ対応表が遅延系計算機４００にコピーされる。
【０１５９】
また、現在の処理が通常モードであれば（ステップＳ２０３：Ｙｅｓルート）、先行系計算機３００におけるＣＰＵ３１０及び３２０は、通常計算を実行する（ステップＳ２０７）。通常計算については、従来と同じであるからこれ以上述べない。なお、初期的には通常計算が実行されることになる。
【０１６０】
一方、現在の処理が出力モードであれば（ステップＳ２０３：Ｎｏルート）、先行系計算機３００におけるＣＰＵ３１０及び３２０は、仮計算を実行する（ステップＳ２０５）。仮計算は、演算グループに属するコアのみで実行され、メモリ３３０又は３４０への直接的な書き込みを行わない計算である。この仮計算については図３１を用いて説明する。
【０１６１】
ＣＰＵ３１０及び３２０のコア（コア３１１ａ及び３１１ｂ並びに３２１ａ及び３２１ｂの少なくともいずれか）は、所定の計算を実行する（図３１：ステップＳ２３１）。
【０１６２】
この計算中に、メモリ３３０又は３４０からの読み込みが発生した場合には（ステップＳ２３３：Ｙｅｓルート）、ＣＰＵ３１０及び３２０のコアは、ＬＬキャッシュ３１３又は３２３において対応アドレスを有する現世代のバッファが存在するか判断する（ステップＳ２４３）。ＬＬキャッシュ３１３又は３２３において対応アドレスを有する現世代のバッファが存在しない場合には、ＣＰＵ３１０及び３２０のコアは、メモリ３３０又は３４０から値を読み込む（ステップＳ２４７）。一方、ＬＬキャッシュ３１３又は３２３において対応アドレスを有する現世代のバッファが存在する場合には、ＣＰＵ３１０及び３２０のコアは、現世代のバッファの値をＬＬキャッシュ３１３又は３２３から読み込む（ステップＳ２４５）。
【０１６３】
一方、計算中に、メモリ３３０又は３４０からの読み込みが発生しておらず（ステップＳ２３３：Ｎｏルート）、メモリ３３０又は３４０への書き込みが発生した場合には（ステップＳ２３５：Ｙｅｓルート）、ＣＰＵ３１０及び３２０のコアは、ＬＬキャッシュ３１３又は３２３において対応アドレスを有する現世代のバッファが存在するか判断する（ステップＳ２３７）。メモリ３３０又は３４０への書き込みが発生していない場合には（ステップＳ２３５：Ｎｏルート）、処理は呼び出し元の処理に戻る。
【０１６４】
ＬＬキャッシュ３１３又は３２３において対応アドレスを有する現世代のバッファが存在しない場合には、ＣＰＵ３１０及び３２０のコアは、ＬＬキャッシュ３１３又は３２３において、今回の書き込みのためのバッファ領域を生成する（ステップＳ２３９）。そして処理はステップＳ２４１に移行する。
【０１６５】
ＬＬキャッシュ３１３又は３２３において対応アドレスを有する現世代のバッファが存在する場合には、ＣＰＵ３１０及び３２０のコアは、ＬＬキャッシュ３１３又は３２３において、現世代のバッファに対して書き込みを行う（ステップＳ２４１）。
【０１６６】
このような処理が繰り返され、ＣＰＵ３１０及び３２０のコアによるＩＯ空間への出力に相当する、メモリ３３０又は３４０に対する書き込みの結果が不用意に更新されることが回避される。
【０１６７】
図３０の処理の説明に戻って、アクセス抽出部３５１がＱＰＩバス３８０を介してメモリ３３０又は３４０へのアクセスを検出すると（ステップＳ２０９：Ｙｅｓルート）、アクセス抽出部３５１は、メモリ３３０又は３４０へのアクセスを、制御部３５３へ通知する（ステップＳ２１１）。アクセスを行ったコアのＩＤとアクセス内容とを通知する。
【０１６８】
制御部３５３は、アクセス抽出部３５１から、メモリ３３０又は３４０へのアクセス通知を受信する（ステップＳ２１３）。これに応じて、制御部３５３は、メモリへのアクセスの記録及び転送処理を実行する（ステップＳ２１５）。この処理については、図３２を用いて説明する。
【０１６９】
制御部３５３は、メモリへのアクセスのデータに実行シーケンス番号を付与してジャーナルファイルを生成し、アクセス履歴格納部３５２に格納する（図３２：ステップＳ２５１）。
【０１７０】
そして、制御部３５３は、生成したジャーナルファイルを、遅延系計算機４００に対して送信する（ステップＳ２５３）。そして、処理は呼び出し元の処理に戻る。
【０１７１】
図３０の処理の説明に戻って、制御部３５３は、メモリへのアクセス通知の受信後に、受信完了を、アクセス抽出部３５１に対して通知する（ステップＳ２１７）。これに対して、アクセス抽出部３５１は、制御部３５３から受信完了通知を受信する（ステップＳ２１９）。
【０１７２】
ステップＳ２１９の後に又はメモリ３３０又は３４０へのアクセスが検出されていない場合（ステップＳ２０９：Ｎｏルート）であって、出力命令が発生していない場合には（ステップＳ２２１：Ｎｏルート）、処理は端子Ｆを介して図３９の処理に移行する。
【０１７３】
一方、出力命令が発生した場合には（ステップＳ２２１：Ｙｅｓルート）、ＬＬキャッシュ３１３又は３２３若しくはメモリ３３０又は３４０への書き込みがなされるので、ＱＰＩバス３８０を介して、出力命令のデータ（出力内容及び出力命令を発行したコアのＩＤ）は、制御部３５３に出力される（ステップＳ２２３）。制御部３５３は、ＣＰＵ３１０及び３２０による出力命令のデータをＱＰＩバス３８０を介して受信する（ステップＳ２２５）。そして処理は端子Ｅを介して図３３の処理に移行する。
【０１７４】
図３３の処理の説明に移行して、端子Ｅの後に、制御部３５３は、状態取得処理を実行する（ステップＳ２６１）。状態取得処理については、図３４を用いて説明する。
【０１７５】
まず、制御部３５３のコア実行制御部３５３３は、コアの停止命令をＣＰＵ３１０及び３２０に対して発行する（図３４：ステップＳ２８１）。ＣＰＵ３１０及び３２０のコアは、制御部３５３からのコアの停止命令に応じてコアを停止させ（ステップＳ２８３）、コアの停止を制御部３５３に対して通知する（ステップＳ２８５）。
【０１７６】
制御部３５３のコア実行制御部３５３３は、コアの停止通知をＣＰＵ３１０及び３２０から受信する（ステップＳ２８７）。そうすると、制御部３５３は、レジスタ値と、変更があったメモリのアドレス及び値（メモリ状態と呼ぶ）との取得命令を、ＣＰＵ３１０及び３２０のコアに対して発行する（ステップＳ２８９）。ＣＰＵ３１０及び３２０のコアは、取得命令に応じて、レジスタ値及びメモリ状態を読み出して、制御部３５３に対して出力する（ステップＳ２９１）。
【０１７７】
制御部３５３は、ＣＰＵ３１０及び３２０からレジスタ値及びメモリ状態のデータを受信し、現時点における実行シーケンス番号を付与する（ステップＳ２９３）。そして処理は図３３の処理に戻る。
【０１７８】
図３３の処理の説明に戻って、制御部３５３のグループ管理部３５３２は、グループ対応表の更新処理を実行する（ステップＳ２６３）。グループ対応表の更新処理については、図３５を用いて説明する。
【０１７９】
まず、出力命令検出時であれば（ステップＳ３０１：Ｙｅｓルート）、制御部３５３のグループ管理部３５３２は、グループＩＤとして一意なＩＤを生成する（ステップＳ３０３）。例えば、シリアルに番号を発行するようにしても良い。そして、グループ管理部３５３２は、出力命令が発生した時の実行シーケンス番号、生成したグループＩＤ及び出力命令を発行したコアのＩＤを含む出力グループのデータを、グループ対応表３５３１に登録するという更新を実行する（ステップＳ３０５）。
【０１８０】
さらに、グループ管理部３５３２は、更新後のグループ対応表のデータを、遅延系計算機４００に送信する（ステップＳ３０９）。
【０１８１】
これに対して、遅延系計算機４００の制御部４５３は、更新後のグループ対応表のデータを受信し（ステップＳ３１１）、受信したグループ対応表のデータによって遅延系計算機４００におけるグループ対応表４５３１を更新する（ステップＳ３１３）。
【０１８２】
一方、出力命令検出時でなければ（ステップＳ３０１：Ｎｏルート）、出力命令による出力処理の実行時であるから、グループ管理部３５３２は、出力処理が行われた時の実行シーケンス番号を、当該出力に係るグループに対して設定するという更新を実行する（ステップＳ３０７）。そして処理はステップＳ３０９に移行する。
【０１８３】
このようにして、遅延系計算機４００のグループ対応表が、先行系計算機３００のグループ対応表と同期するようになる。
【０１８４】
図３３の処理の説明に戻って、制御部３５３は、非出力コアの稼働処理を実行する（ステップＳ２６５）。非出力コアの稼働処理については、図３６を用いて説明する。
【０１８５】
制御部３５３のコア実行制御部３５３３は、グループ対応表３５３１から、出力命令実行予定のコアを特定する（図３６：ステップＳ３２１）。図２７に示すように、本実施の形態に係るグループ対応表３５３１には、出力命令を発行したコアのＩＤのみが登録されているので、出力が完了していないグループに属するコアのＩＤを特定する。
【０１８６】
そして、制御部３５３のコア実行制御部３５３３は、特定されたコア以外のコアを含む演算グループのコアを特定する（ステップＳ３２３）。その後、制御部３５３のコア実行制御部３５３３は、演算グループ（コアＩＤを含む）に対する稼働命令を、ＣＰＵ３１０及び３２０に出力する（ステップＳ３２５）。
【０１８７】
これに対して、ＣＰＵ３１０及び３２０は、演算グループに対する稼働命令を受信する（ステップＳ３２７）。そうすると、ＣＰＵ３１０及び３２０は、演算グループのうち停止しているコアを稼働させる（ステップＳ３２９）。このようにして、次の仮計算を実行するコアを稼働状態にする。そして、処理は呼び出し元の処理に戻る。
【０１８８】
図３３の処理の説明に戻り、制御部３５３は、現在のモードが出力モードであるか否かを判断する（ステップＳ２６７）。初期的には標準モードである。現在のモードが標準モードである場合には、制御部３５３は、出力モードへのモード切替処理を実行する（ステップＳ２６９）。モード切替処理については、図３７を用いて説明する。
【０１８９】
制御部３５３は、特定のモード（例えば出力モード）へのモード切替を、ＣＰＵ３１０及び３２０に対して通知する（ステップＳ３３１）。これに対してＣＰＵ３１０及び３２０は、特定のモードへのモード切替通知を受信する（ステップＳ３３３）。
【０１９０】
そうすると、ＣＰＵ３１０及び３２０は、特定のモードへのモード切替を実行する（ステップＳ３３５）。ＣＰＵ３１０及び３２０は、以降、特定のモードに応じた処理を実行するようになる。そして、処理は呼び出し元の処理に戻る。
【０１９１】
図３３の処理の説明に戻って、現在のモードが出力モードである場合、制御部３５３は、バッファの世代更新処理を実行する（ステップＳ２７１）。バッファの世代更新処理については、図３８を用いて説明する。
【０１９２】
まず、制御部３５３は、現在の実行シーケンス番号を含む世代更新命令をＣＰＵ３１０及び３２０に対して発行する（ステップＳ３４１）。これに対して、ＣＰＵ３１０及び３２０は、現在の実行シーケンス番号を含む世代更新命令を受信する（ステップＳ３４３）。
【０１９３】
そうすると、ＣＰＵ３１０及び３２０は、受信した実行シーケンス番号を更新時の実行シーケンス番号（現世代の終了時における実行シーケンス番号）として世代管理テーブル（図２５）に記録して、新たな世代を生成する（ステップＳ３４５）。そして、ＣＰＵ３１０及び３２０は、世代更新通知を、制御部３５３に出力する（ステップＳ３４７）。
【０１９４】
制御部３５３は、ＣＰＵ３１０及び３２０から世代更新通知を受信する（ステップＳ３４９）。そして、処理は呼び出し元の処理に戻る。
【０１９５】
このように、ＣＰＵ３１０及び３２０のＬＬキャッシュ３１３及び３２３におけるデータ管理が変化する。
【０１９６】
図３３の処理の説明に戻って、制御部３５３は、実行シーケンス番号と、各コアのレジスタ値と、メモリ状態と出力内容を、遅延系計算機４００へ送信する（ステップＳ２７３）。
【０１９７】
出力命令を検出した際の処理は一旦終了して、処理は端子Ｄを介して図３０のステップＳ２０３の処理に戻る。
【０１９８】
一方、図３０のステップＳ２２１で出力命令が発生していない場合には、端子Ｆを介して図３９の処理が行われる。すなわち、制御部３５３は、ｉｆ命令の実行回数を計数している（ステップＳ３５１）。
【０１９９】
そして、制御部３５３は、ｉｆ命令の実行回数が所定回数に達するという同期確認の条件を満たしたか否かを判断する（ステップＳ３５３）。同期確認の条件を満たしていない場合には、処理は端子Ｄを介して図３０のステップＳ２０３に戻る。
【０２００】
一方、同期確認の条件を満たした場合には、制御部３５３は、状態取得処理を実行する（ステップＳ３５５）。この処理は図３４で示した処理と同じである。
【０２０１】
その後、制御部３５３は、非出力コアの稼働処理を実行する（ステップＳ３５７）。この処理は図３６で示した処理と同じである。
【０２０２】
そして、現在が出力モードであれば、制御部３５３は、バッファの世代更新処理を実行する（ステップＳ３６１）。この処理は図３８で示した処理である。一方、現在が出力モードでなければ、処理はステップＳ３６３に移行する。
【０２０３】
そして、制御部３５３は、実行シーケンス番号、各コアのレジスタ値及びメモリ状態を、遅延系計算機４００へ送信する（ステップＳ３６３）。そして処理は端子Ｄを介して図３０のステップＳ２０３に戻る。
【０２０４】
このように、出力命令が発行されていない場合でも、同期確認点についてのデータが遅延系計算機４００へ送信される。
【０２０５】
次に、遅延系計算機４００から計算再現又は仮計算再現についての計算結果の比較結果を受信した後において実行される処理について、図４０及び図４１を用いて説明する。
【０２０６】
先行系計算機３００の制御部３５３は、出力命令発行時又は同期確認点における実行シーケンス番号を含む比較結果を遅延系計算機４００から受信する（ステップＳ４０１）。なお、比較結果が、レジスタ値又は出力値について不一致が検出されたことを示している場合には、異常終了するので、本実施の形態では説明を省略する。すなわち、以下の処理では、比較結果が、レジスタ値及び出力値が一致したということを示している場合を説明する。
【０２０７】
そうすると、制御部３５３は、比較結果における実行シーケンス番号とグループ対応表３５３１とから、出力命令が発生している区間であるか否かを判断する（ステップＳ４０３）。グループ対応表３５３１には出力命令が発生した時点における実行シーケンス番号が登録されているので、比較結果における実行シーケンス番号と一致する実行シーケンス番号がグループ対応表３５３１に登録されているか否かで判断される。出力命令が発行されていない区間である場合には、処理は端子Ｄを介して図３０のステップＳ２０３に戻る。
【０２０８】
一方、出力命令が発生している区間である場合には、制御部３５３は、メモリ３３０又は３４０に格納されている出力予定値等のデータに基づき、外部デバイス３７０に対して出力処理を実行する（ステップＳ４０５）。
【０２０９】
さらに、制御部３５３は、グループ対応表の更新処理を実行する（ステップＳ４０７）。この更新処理は図３５の処理と同様である。
【０２１０】
また、制御部３５３は、状態取得処理を実行する（ステップＳ４０８）。状態取得処理は、図３４の処理と同様である。
【０２１１】
また、制御部３５３は、非出力コアの稼働処理を実行する（ステップＳ４０９）。非出力コアの稼働処理は、図３６の処理と同様である。
【０２１２】
そして、制御部３５３は、仮計算のコミットを実行する（ステップＳ４１１）。この仮計算のコミットについては、図４１を用いて説明する。
【０２１３】
まず、制御部３５３の出力モード処理部３５３４は、グループ対応表３５３１から、コミットする区間を特定する（ステップＳ４２１）。このステップの直前に行った外部デバイス３７０への出力処理についての出力命令発行時から次の出力命令発行時までの区間（開始及び終了時の実行シーケンス番号）を特定する。そして、制御部３５３の出力モード処理部３５３４は、ＣＰＵ３１０及び３２０に対して、コミットする区間を通知する（ステップＳ４２３）。
【０２１４】
これに対して、ＣＰＵ３１０及び３２０は、制御部３５３から、コミットする区間の通知を受信する（ステップＳ４２５）。そうすると、ＣＰＵ３１０及び３２０は、通知された区間内の世代を、世代管理テーブルから特定する（ステップＳ４２７）。
【０２１５】
そうすると、ＣＰＵ３１０及び３２０は、通知された区間内の世代のうち、未処理の世代を特定する（ステップＳ４２９）。そして、ＣＰＵ３１０及び３２０は、特定された世代において競合が発生しているか否かを判断する（ステップＳ４３１）。複数のトランザクションで同一メモリアドレスへの書き込みを含むアクセスが発生し、デッドロックの可能性がある場合等で、競合発生と判断される。
【０２１６】
競合ありの場合には、ＣＰＵ３１０及び３２０は、この区間については仮計算をアボートすることになる（ステップＳ４３３）。そのため、処理はステップＳ４３９に移行する。
【０２１７】
一方、競合無しの場合には、ＣＰＵ３１０及び３２０は、特定された世代についてバッファ（ＬＬキャッシュ３１３又は３２３）に保存されている変更データをメモリ３３０又は３４０に対して反映させる（ステップＳ４３５）。
【０２１８】
また、ＣＰＵ３１０及び３２０は、通知された区間内の世代のうち未処理の世代が存在するか否かを判断する（ステップＳ４３７）。未処理の世代が存在する場合には、処理はステップＳ４２９に戻る。
【０２１９】
一方、未処理の世代が存在しない場合には、ＣＰＵ３１０及び３２０は、処理結果を制御部３５３に通知する（ステップＳ４３９）。制御部３５３の出力モード処理部３５３４は、処理結果の通知を受信する（ステップＳ４４１）。そして、処理は呼び出し元の処理に戻る。
【０２２０】
なお、遅延系計算機４００においてもこの処理は実行されるが、アボートが発生した場合には、処理は異常終了となる。また、アボートがあった場合には、コミットする区間で実行される仮計算をやり直すことになるので、この仮計算開始時におけるメモリ状態及びレジスタ値で、先行系計算機３００及び遅延系計算機４００を初期化する処理から再開する。以下では、コミットが成功したケースについて説明する。
【０２２１】
図４０の処理の説明に戻って、制御部３５３は、バッファの世代更新処理を実行する（ステップＳ４１３）。この処理は、図３８の処理と同様である。
【０２２２】
さらに、制御部３５３は、コミット結果を遅延系計算機４００に送信する（ステップＳ４１５）。コミット結果には、ステップＳ４０８における実行シーケンス番号と、コミットした区間の実行シーケンス番号と、コア毎のレジスタ値及びメモリ状態のデータを含む。
【０２２３】
そして、制御部３５３は、グループ対応表３５３１から、未実行の出力命令があるか否かを判断する（ステップＳ４１７）。未実行の出力命令が存在する場合には、出力モードを維持するので、処理は端子Ｄを介して図３０のステップＳ２０３に戻る。一方、未実行の出力命令が存在しない場合には、制御部３５３は、通常モードへのモード切替処理を実行する（ステップＳ４１９）。この処理は、図３７の処理と同様である。そして、処理は端子Ｄを介して図３０のステップＳ２０３に戻る。
【０２２４】
このようにして、出力処理に応じて、バッファとして用いられているＬＬキャッシュ３１３及び３２３におけるデータで、メモリ３３０及び３４０の更新を行うと共に、世代の更新が行われるようになる。
【０２２５】
ここで、図４２Ａ及び図４２Ｂを用いて仮計算のコミットに関連するデータ遷移について説明しておく。図４２Ａの右側に示すように、コア１乃至４が通常モードで計算を実行すると、コア１及び２が出力命令１を発行する（点Ａ）。ここまでは、メモリ３３０及び３４０への書き込みが行われると共に、出力命令によって出力される値もメモリ３３０又は３４０に書き込まれる。
【０２２６】
そして、コア３及び４が仮計算を実行し、その後コア３が出力命令２を発行する（点Ｂ）。さらに、コア４が仮計算を実行し、その後、遅延系計算機４００から比較結果（点Ａまでの計算再現の結果）が得られる（点Ｃ）。そうすると、出力命令１についての出力処理を行って、その後出力命令２までのコミットを図４１に従って実行することになる。なお、図４２Ａにおいて黒の横棒は、同期確認点を表すものとする。
【０２２７】
このような例において、グループ対応表３５３１には、点Ａにおいて、点Ａの実行シーケンス番号と第１の出力グループ（コア１及び２）とが登録される。また、この時点において、バッファとして用いられるＬＬキャッシュ３１３及び３２３に対する記録が開始される。その後の同期確認点では、世代更新が行われる。そして、点Ｂにおいて、グループ対応表３５３１には、点Ｂの実行シーケンス番号と第２の出力グループ（コア３）とが追加で登録される。
【０２２８】
さらに、出力命令が実行される出力点１（点Ｃ）では、グループ対応表３５３１には、第１の出力グループに関連して、出力処理時における実行シーケンス番号として点Ｃの実行シーケンス番号が登録される。
【０２２９】
出力命令２までのコミットでは、点Ａ−Ｂの区間についてコミットを行う。この様子を図４２Ｂを用いて説明する。この図では上から下へ時間が経過するものとする。また、バッファ（ＬＬキャッシュ３１３及び３２３）及びメモリ３３０及び３４０では、アドレス０乃至３が存在しているものとする。さらに、バッファの各行は世代を表す。
【０２３０】
点Ａまではバッファは用いられず、メモリ３３０及び３４０に書き込まれる。点Ａからは、メモリ３３０及び３４０を更新せずに、バッファに記録を行うことになる。第１の世代では、バッファ「３」に「Ｘ」が書き込まれ、第２の世代では、バッファ「３」に「Ｙ」が書き込まれ、第３の世代では、バッファ「２」に「Ｙ」が書き込まれ、バッファ「３」には「Ｚ」が書き込まれる。点Ａから点Ｂまでの間には、第１乃至第３の世代が含まれるが、その後点Ｃまでは第４乃至第６の世代が存在する。
【０２３１】
コミットを実行する際には、点Ａから点Ｂまでの区間をコミットするので、第３の世代までを、メモリ３３０及び３４０の対応するアドレスに書き込むことになる。図４２Ｂの例では、メモリ「２」に「Ｙ」が書き込まれ、メモリ「３」に「Ｚ」が書き込まれる。メモリ「０」及び「１」については変更はない。
【０２３２】
このようにして、コミットされたデータのみがバッファからメモリに反映されることになる。
【０２３３】
次に、上で述べたような処理においてデータを受信する側の遅延系計算機４００における処理内容について図４３乃至図５０を用いて説明する。
【０２３４】
まず、遅延系計算機４００の制御部４５３は、先行系計算機３００からのデータの受信待ちとなる（ステップＳ５０１）。その後、制御部４５３は、先行系計算機３００からデータを受信することになる（ステップＳ５０３）。（Ａ）実行シーケンス番号、各コアのレジスタ値及びメモリ状態を受信する場合、（Ｂ）実行シーケンス番号、各コアのレジスタ値、メモリ状態及び出力内容を受信する場合、（Ｃ）実行シーケンス番号を含むジャーナルファイルを受信する場合、（Ｄ）実行シーケンス番号、コミット区間を表す実行シーケンス番号、コア毎のレジスタ値及びメモリ状態を受信する場合がある。出力内容は、出力命令が発行された場合に含まれる。ジャーナルファイルは、その都度送信される。（Ａ）実行シーケンス番号、各コアのレジスタ値及びメモリ状態を受信する場合は、世代更新が行われた場合に送られてくる。
【０２３５】
次に、制御部４５３は、受信データに含まれる実行シーケンス番号から特定される区間が通常モードであるか否かをグループ対応表４５３１から判断する（ステップＳ５０５）。グループ対応表４５３１において、出力処理時の実行シーケンス番号がどの出力グループについても登録されている状態であれば、通常モードとして判断される。
【０２３６】
通常モードであれば、制御部４５３は、通常モードへのモード切替処理を実行する（ステップＳ５０７）。この処理は、図３７の処理と同様である。
【０２３７】
また、制御部４５３は、計算再現実行の条件を満たしているか否かを判断する（ステップＳ５０９）。具体的には、再現する区間より前の区間における計算再現が完了しており、以下のデータが揃っていることが条件となる。
１．区間内のジャーナルファイル
２．区間開始時のコア毎のレジスタ値及びメモリ状態のデータ
３．区間終了時のコア毎のレジスタ値及びメモリ状態のデータ
４．出力命令が存在する場合には出力内容
【０２３８】
区間は、特定の実行シーケンス番号から他の特定の実行シーケンス番号までで規定され、同期が完了した区間の最後の実行シーケンス番号から、同期未完了で次に同期を行うべきタイミングの実行シーケンス番号までで規定される。なお、第１の実施の形態における例でも示したように、出力命令発行時の間、比較完了時の間又は出力命令発行時と比較完了時との間を想定すれば分かりやすい。
【０２３９】
計算再現実行の条件が満たされている場合には、制御部４５３等は、計算再現を実行する（ステップＳ５１１）。計算再現については、図４４を用いて説明する。なお、このステップの後には処理は端子Ｇを介して図４９の処理に移行する。
【０２４０】
制御部４５３は、レジスタを、区間開始時の値で初期化する初期化命令を、ＣＰＵ４１０及び４２０に対して発行する（図４４：ステップＳ５３１）。ＣＰＵ４１０及び４２０は、初期化命令に応じて、区間開始時の値でレジスタを更新する（ステップＳ５３３）。また、ＣＰＵ４１０及び４２０は、更新完了通知を、制御部４５３へ返信する（ステップＳ５３５）。これに対して、制御部４５３は、更新完了通知を受信する（ステップＳ５３７）。
【０２４１】
制御部４５３のコア実行制御部４５３２は、コアの稼働命令を発行する（ステップＳ５３９）。通常モードであるから、全コアを稼働させるものである。ＣＰＵ４１０及び４２０は、稼働命令に応じて、コアを稼働させる（ステップＳ５４１）。そして、ＣＰＵ４１０及び４２０は、コアによって所定の計算を実行する（ステップＳ５４３）。
【０２４２】
計算において、メモリ４３０又は４４０からの読み込みが発生した場合には（ステップＳ５４５：Ｙｅｓルート）、アクセス抽出部４５１は、メモリ４３０又は４４０へのアクセスを検出して、メモリ４３０又は４４０へのアクセス通知を制御部４５３に出力する（ステップＳ５４７）。これに対して、制御部４５３は、アクセス通知の受信に応じて、読み込み予定値を、現在の実行シーケンス番号を基に特定され且つアクセス履歴格納部４５２に格納されているジャーナルファイルのデータで書き換えを行う（ステップＳ５４９）。
【０２４３】
そうすると、ＣＰＵ４１０及び４２０は、メモリからの読み込みを実際に実行する（ステップＳ５５１）。その後処理は端子Ｊを介して図４５の処理に移行する。メモリの読み込みが検出されない場合（ステップＳ５４５：Ｎｏルート）も処理は端子Ｊを介して図４５の処理に移行する。
【０２４４】
図４５の処理の説明に移行して、外部デバイス４７０への出力命令が発生した場合には（ステップＳ５５３：Ｙｅｓルート）、ＱＰＩバス４８０を介して、出力内容が制御部４５３へ出力される（ステップＳ５５５）。制御部４５３は、ＣＰＵ４１０及び４２０から出力内容を受信する（ステップＳ５５７）。そして呼び出し元の処理に戻る。
【０２４５】
なお、外部デバイス４７０への出力命令が発生しておらず（ステップＳ５５３：Ｎｏルート）、区間分の計算が終了していない場合には（ステップＳ５５９：Ｎｏルート）、処理は端子Ｋを介して図４４のステップＳ５４３に戻る。一方、区間分の計算が終了すると（ステップＳ５５９：Ｙｅｓルート）、処理は呼び出し元の処理に戻る。このようにして計算再現が実行される。
【０２４６】
図４３の処理の説明に戻って、ステップＳ５０５で現在出力モードであると判断されると（ステップＳ５０５：Ｎｏルート）、制御部４５３は、出力モードへのモード切替処理を実行する（ステップＳ５１３）。この処理は図３７の処理と同様である。
【０２４７】
その後、制御部４５３は、対象区間の仮計算再現が完了しているか判断する（ステップＳ５１５）。対象区間の仮計算再現が完了していなければ、処理はステップＳ５２１に移行する。一方、対象区間の仮計算再現が完了していれば、制御部４５３の出力モード処理部４５３４は、区間終了時のメモリ状態を受信したか否かを判断する（ステップＳ５１７）。区間終了時のメモリ状態が得られていない場合には、処理はステップＳ５０１に戻る。一方、区間終了時のメモリ状態を受信した場合には、制御部４５３等は、区間のコミットを実行する（ステップＳ５１９）。この処理については図４８を用いて説明する。そして、処理は端子Ｇを介して図４９の処理に移行する。
【０２４８】
また、対象区間の仮計算再現が完了していない場合には、制御部４５３は、仮計算再現実行の条件を満たしているか否かを判断する（ステップＳ５２１）。具体的には、再現する区間より前の区間における計算再現又は仮計算再現及びコミットが完了しており、以下のデータが揃っていることが条件となる。
１．区間内のジャーナルファイル
２．区間開始時における演算グループに属するコア毎のレジスタ値
３．区間終了時における演算グループに属するコア毎のレジスタ値
４．出力命令が存在する場合には出力内容
【０２４９】
仮計算再現実行の条件が満たされていない場合には、処理はステップＳ５０１に戻る。一方、仮計算再現実行の条件が満たされた場合には、制御部４５３などは、仮計算再現を実行する（ステップＳ５２３）。仮計算再現については、図４６及び図４７を用いて説明する。
【０２５０】
制御部４５３の出力モード処理部４５３４は、グループ対応表４５３１を参照して、対象区間における演算グループに属するコアを特定する（図４６：ステップＳ５６１）。出力グループに属していないコアが演算グループに属するコアである。
【０２５１】
そして、制御部４５３の出力モード処理部４５３４は、特定されたコアのレジスタを、区間開始時の値で初期化する初期化命令を、ＣＰＵ４１０及び４２０に対して発行する（ステップＳ５６３）。ＣＰＵ４１０及び４２０は、初期化命令に応じて、区間開始時の値で、特定されたコアのレジスタを更新する（ステップＳ５６５）。また、ＣＰＵ４１０及び４２０は、更新完了通知を、制御部４５３へ返信する（ステップＳ５６７）。これに対して、制御部４５３は、更新完了通知を受信する（ステップＳ５６９）。
【０２５２】
制御部４５３の出力モード処理部４５３４は、演算グループに属するコアの稼働命令を発行する（ステップＳ５７１）。そうすると、ＣＰＵ４１０及び４２０は、稼働命令に応じて、演算グループに属するコアを稼働させる（ステップＳ５７３）。そして、ＣＰＵ４１０及び４２０は、演算グループに属するコアによって所定の計算を実行する（ステップＳ５７５）。
【０２５３】
計算において、メモリ４３０又は４４０からの読み込みが発生した場合には（ステップＳ５７７：Ｙｅｓルート）、アクセス抽出部４５１は、読み込みを検出して、メモリ４３０又は４４０へのアクセス通知を制御部４５３に出力する（ステップＳ５７９）。これに対して、制御部４５３は、アクセス通知の受信に応じて、読み込み予定値を、現在の実行シーケンス番号に基づき且つアクセス履歴格納部４５２に格納されているジャーナルファイルのデータで書き換えを行う（ステップＳ５８１）。
【０２５４】
そうすると、ＣＰＵ４１０及び４２０は、メモリからの読み込みを実際に実行する（ステップＳ５８３）。その後処理は端子Ｌを介して図４７の処理に移行する。メモリの読み込みが検出されない場合（ステップＳ５７７：Ｎｏルート）も処理は端子Ｌを介して図４７の処理に移行する。
【０２５５】
図４７の処理の説明に移行して、メモリ４３０又は４４０への書き込みが発生した場合には（ステップＳ５８５：Ｙｅｓルート）、アクセス抽出部４５１は、書き込みを検出すると、ＣＰＵ４１０及び４２０に、書き込みの取り消しを実行させる（ステップＳ５８７）。そして処理はステップＳ５８９に移行する。メモリ４３０又は４４０への書き込みが発生していない場合（ステップＳ５８５：Ｎｏルート）にも、処理はステップＳ５８９に移行する。
【０２５６】
さらに、外部デバイス４７０への出力命令が発生した場合には（ステップＳ５８９：Ｙｅｓルート）、ＱＰＩバス４８０を介して、出力内容が制御部４５３へ出力される（ステップＳ５９１）。制御部４５３の出力モード処理部４５３４は、ＣＰＵ４１０及び４２０から出力内容を受信する（ステップＳ５９３）。そして呼び出し元の処理に戻る。
【０２５７】
なお、外部デバイス４７０への出力命令が発生しておらず（ステップＳ５８９：Ｎｏルート）、区間分の計算が終了していない場合には（ステップＳ５９５：Ｎｏルート）、処理は端子Ｍを介して図４６のステップＳ５７５に戻る。一方、区間分の計算が終了すると（ステップＳ５９５：Ｙｅｓルート）、処理は呼び出し元の処理に戻る。
【０２５８】
このようにして仮計算再現が実行される。なお、遅延系計算機４００では、先行系計算機３００とは異なり、仮計算再現、コミット及び出力処理が連続して行われた後に、他の計算再現又は仮計算再現が開始されるので、ＬＬキャッシュ４１３及び４２３をバッファとして用いてメモリ４３０及び４４０への書き込みを制御することはない。
【０２５９】
図４３の処理の説明に戻って、制御部４５３の出力モード処理部４５３４は、区間終了時のメモリ状態を受信したか否かを判断する（ステップＳ５２５）。区間終了時のメモリ状態が得られていない場合には、処理はステップＳ５０１に戻る。
【０２６０】
一方、区間終了時のメモリ状態を受信した場合には、制御部４５３などは、区間のコミットを実行する（ステップＳ５２７）。ここで区間のコミットについて、図４８を用いて説明する。なお、ステップＳ５２７の後に処理は端子Ｇを介して図４９の処理に移行する。
【０２６１】
まず、制御部４５３の出力モード処理部４５３４は、グループ対応表４５３１から、コミットする区間を特定する（ステップＳ６５１）。このステップの直前に行った外部デバイス４７０への出力処理についての出力命令発行時から次の出力命令発行時までの区間（開始及び終了時の実行シーケンス番号）を特定する。そして、制御部４５３の出力モード処理部４５３４は、特定された区間内に含まれるジャーナルファイルを特定し、ＣＰＵ４１０及び４２０に対して、コミットする区間及び当該区間に含まれるジャーナルファイルを通知する（ステップＳ６５３）。なお、上でも述べたように世代更新が行われると先行系計算機３００から通知されるデータがあって、世代も特定されるので、通知するジャーナルファイルには世代の情報を付加する。
【０２６２】
これに対して、ＣＰＵ４１０及び４２０は、制御部４５３から、コミットする区間及び当該区間のジャーナルファイルを受信する（ステップＳ６５５）。そうすると、ＣＰＵ４１０及び４２０は、通知された区間内の世代を、受信データから特定する（ステップＳ６５７）。
【０２６３】
また、ＣＰＵ４１０及び４２０は、通知された区間内の世代のうち、未処理の世代を特定する（ステップＳ６５９）。そして、ＣＰＵ４１０及び４２０は、特定された世代において競合が発生しているか否かを判断する（ステップＳ６６１）。この際、ＬＬキャッシュ４１３及び４２３のデータではなく、特定された世代における最新のジャーナルファイルを用いて競合の有無を判断する。すなわち、複数のトランザクションで同一メモリアドレスへの書き込みを含むアクセスが発生し、デッドロックの可能性がある場合等で、競合発生と判断される。
【０２６４】
競合ありの場合には、ＣＰＵ４１０及び４２０は、この区間については仮計算再現をアボートすることになる（ステップＳ６６３）。そのため、処理はステップＳ６６９に移行する。
【０２６５】
一方、競合無しの場合には、ＣＰＵ４１０及び４２０は、ジャーナルファイルの内容をメモリ４３０又は４４０に対して反映させる（ステップＳ６６５）。
【０２６６】
また、ＣＰＵ４１０及び４２０は、通知された区間内の世代のうち未処理の世代が存在するか否かを判断する（ステップＳ６６７）。未処理の世代が存在する場合には、処理はステップＳ６５９に戻る。
【０２６７】
一方、未処理の世代が存在しない場合には、ＣＰＵ４１０及び４２０は、処理結果を制御部４５３に通知する（ステップＳ６６９）。制御部４５３の出力モード処理部４５３４は、処理結果の通知を受信する（ステップＳ６７１）。そして、処理は呼び出し元の処理に戻る。
【０２６８】
図４９の処理の説明に移行して、制御部４５３等は、メモリ状態の更新処理を実行する（図４９：ステップＳ６０１）。この処理については図５０を用いて説明する。
【０２６９】
まず、制御部４５３は、区間終了時における実行シーケンス番号におけるメモリ状態で、メモリ４３０及び４４０の上書きをＣＰＵ４１０及び４２０に指示する（ステップＳ６２１）。これに対して、ＣＰＵ４１０及び４２０は、指示に応じてメモリ状態の上書きを実行する（ステップＳ６２３）。先行系計算機３００とメモリについての同期を図るためである。そして、処理は呼び出し元の処理に戻る。
【０２７０】
そして、制御部４５３は、状態取得処理を実行する（ステップＳ６０３）。状態取得処理については、図３４の処理と同様である。
【０２７１】
さらに、制御部４５３は、計算結果（レジスタ値及び出力命令が発生していた場合には出力内容。但し、出力モードであれば演算グループのコアのみ）についての比較処理を実行する（ステップＳ６０５）。レジスタ値が一致するか、出力予定値が一致するか判断する。
【０２７２】
計算結果が不一致を表している場合には（ステップＳ６０７：Ｎｏルート）、制御部４５３は、予め定められた異常対処処理を実行する（ステップＳ６０９）。そして処理は終了する。
【０２７３】
計算結果が一致を表している場合には（ステップＳ６０７：Ｙｅｓルート）、制御部４５３は、出力命令が発生していたか判断し（ステップＳ６１１）、発生していた場合には、外部デバイス４７０に対する出力処理を実行する（ステップＳ６１３）。一方、出力命令が発生していない場合には、処理はステップＳ６１５に移行する。
【０２７４】
制御部４５３は、ステップＳ６０５の比較結果を、先行系計算機３００に送信する（ステップＳ６１５）。そして、処理は端子Ｈを介してステップＳ５０１に戻る。
【０２７５】
このような処理を実行することで、遅延系計算機４００において先行系計算機３００の計算内容について比較検証を行いつつ、計算を効率的に進行させることができるようになる。
【０２７６】
先行系計算機３００及び遅延系計算機４００で行われる同期処理の一例を図５１に示す。図５１では、上から下に時間が流れるものとする。
【０２７７】
図５１の例において、先行系計算機３００については、「出力命令２までをコミット」までは、図４２Ａを用いて説明したものと同様である。なお、「出力命令２までをコミット」の後には、コミット区間及びレジスタ値を、先行系計算機３００から遅延系計算機４００に送信する。
【０２７８】
また、先行系計算機３００では、「出力命令２までをコミット」を実行しても、出力命令２についての出力処理は行われていないので、出力モードのままである。但し、コア１及び２については出力命令１の出力を行ったので、コア１、２及び４によって仮計算を実行する。
【０２７９】
一方、遅延系計算機４００では、計算再現を行ったところで、レジスタ値及び出力予定値の比較を行い、点Ａについての比較結果を、先行系計算機３００に送信する。比較結果が一致を表している場合には、その後出力命令１についての出力処理が実行される。そして、先行系計算機３００のコア３及び４で実行された仮計算について仮計算再現が実行される。仮計算再現については、上でも述べたようにメモリ状態以外が揃った時点で実行される。
【０２８０】
遅延系計算機４００において、点Ｂまでの仮計算に対応する仮計算再現が完了し、先行系計算機３００でコミットがなされ且つメモリ状態が取得されると、出力命令２までのコミットを実行する。コミットが完了すると、レジスタ値及び出力予定値の比較を行い、比較結果を遅延系計算機４００から先行系計算機３００へ送信する。比較結果がレジスタ値及び出力予定値の一致を表している場合には、出力命令２についての出力処理を実行する。
【０２８１】
先行系計算機３００においても、比較結果を受信し、当該比較結果が一致を表している場合には、出力命令２についての出力処理を実行する。なお、グループ対応表３５３１は更新され、第２の出力グループの出力処理時の実行シーケンス番号（点Ｄ）が登録される。さらに、先行系計算機３００においても、出力点１までをコミットする。そうすると、コミット区間及びレジスタ値を、先行系計算機３００から遅延系計算機４００に送信する。その後、出力点２までの仮計算のコミットも実行する。コミット毎に、コミット区間及びレジスタ値を、先行系計算機３００から遅延系計算機４００に送信する。
【０２８２】
その後、未実行の出力処理が無くなるので、先行系計算機３００は通常モードに戻り、計算をコア１乃至４で実行する。
【０２８３】
前の仮計算再現がコミットされると、遅延系計算機４００では、コア４のみで実行する仮計算の仮計算再現を実行する。この仮計算再現が完了すると、この仮計算再現のコミット（出力点１までのコミット）を行う。そうすると、遅延系計算機４００においても、コア１、２及び４によって実行された仮計算について仮計算再現を実行する。この仮計算再現が完了すると、この仮計算再現のコミット（出力点２までのコミット）を実行する。コミットが完了すると、通常モードに戻って、計算再現を実行する。
【０２８４】
このように、様々な仮計算が、先行系計算機３００において可能な限り待ち時間が無くなるように実行され、対応する仮計算再現についても遅延系計算機４００においても順次行われるようになる。
【０２８５】
以上本発明の実施の形態について説明したが、本発明はこれに限定されるものではない。例えば、処理フローについては、処理結果が変わらない限り、処理の順番を入れ替えたり、複数のステップを並列実行することもある。
【０２８６】
機能ブロック図についても一例であって、プログラムモジュール構成とは一致しない場合もある。
【０２８７】
以上述べた本実施の形態をまとめると、以下のようになる。
【０２８８】
本実施の形態に係る情報処理システムは、複数の第１演算器と第１制御部と第１外部デバイスとを含む第１のシステムと、複数の第２演算器と第２制御部と第２外部デバイスとを含み、第１のシステムで実行された計算と同一の計算を行って計算結果の比較を行うための第２のシステムとを有する。そして、第１制御部は、（Ａ）複数の第１演算器のうち１又は複数の第１演算器から第１外部デバイスへの第１の出力要求が出力されたことを検出すると、上記１又は複数の第１演算器を含み且つ第１の計算を実行していた第１演算器を停止させ、（Ｂ）第１の出力要求で出力される値を含む第１の比較対象データを第２制御部に送信し、（Ｃ）第１の計算を実行していた第１演算器のうち上記１又は複数の第１演算器以外の第１演算器に、第２の計算を実行させる。また、第２制御部は、（Ｄ）第１制御部から第１の比較対象データを受信した場合、第１の計算に対応する第３の計算を、第１の計算を実行していた第１演算器に対応する第２演算器に実行させ、（Ｅ）第１の計算を実行していた第１演算器に対応する第２演算器のうち１又は複数の第２演算器から第２外部デバイスへの第２の出力要求が出力されたことを検出すると、第２の出力要求で出力される値を含む第２の比較対象データと第１の比較対象データとを比較する。
【０２８９】
このようにすれば第２の計算が速やかに実行されるようになり、システムにおける演算器の有効利用が図られるようになる。
【０２９０】
なお、上で述べた第１制御部は、第１の計算を実行する第１演算器を特定するための情報を、予め第２制御部に送信しておくようにしても良い。この場合、第２制御部は、第１の計算を実行していた第１演算器に対応する第２演算器を、上記情報に基づき特定するようにしても良い。このようにすれば、第１の計算と同様の計算が、第２演算器で実行されるようになる。
【０２９１】
より具体的には、上で述べた第１制御部は、（Ｆ）第２の計算を実行する第１演算器を特定するための情報を、第２制御部に送信し、（Ｇ）第２の計算を実行していた第１演算器のうちある第１演算器から第１外部デバイスへの第３の出力要求が出力されたことを検出すると、第２の計算を実行していた第１演算器を停止させ、（Ｈ）第３の出力要求で出力される値を含む第３の比較対象データを第２制御部に送信し、（Ｉ）第２の計算を実行していた第１演算器のうち上記ある第１演算器以外の第１演算器に、第５の計算を実行させるようにしても良い。また、上で述べた第２制御部は、（Ｊ）上記情報を、第１制御部から受信し、（Ｋ）第１制御部から第３の比較対象データを受信した場合、上記情報に基づき第２の計算に対応する第４の計算を実行する第２演算器に特定して第４の計算を実行させ、（Ｌ）特定された第２演算器のうちある第２演算器から第２外部デバイスへの第４の出力要求が出力されたことを検出すると、第４の出力要求で出力される値を含む第４の比較対象データと第３の比較対象データとを比較するようにしても良い。
【０２９２】
このように第１のシステムと同様の構成で第２のシステムにおいて計算再現が行われるようになる。
【０２９３】
なお、第２の計算を実行する第１演算器を特定するための情報が、上記１又は複数の第１演算器の識別子を含むようにしても良い。逆に、出力要求を出力した第１演算器の識別子を含むようにしても良い。
【０２９４】
さらに、上で述べた第１のシステムが、複数の第１演算器を含む第１の仮想マシンと、第１制御部を含む第２の仮想マシンと、第１の仮想マシン及び第２の仮想マシンの管理を行う第１の管理部とを有するようにしても良い。この場合、上で述べた第２のシステムが、複数の第２演算器を含む第３の仮想マシンと、第２制御部を含む第４の仮想マシンと、第３の仮想マシン及び第４の仮想マシンの管理を行う第２の管理部とを有するようにしても良い。実装形態は様々に変更可能である。
【０２９５】
さらに、上で述べた第１制御部は、第１の出力要求で出力する値を保持しておくようにしても良い。この場合、上で述べた第２制御部は、比較結果を第１制御部に送信するようにしても良い。そして、さらに第１制御部は、第２制御部から受信した比較結果が第１の比較対象データと第２の比較対象データとが一致することを表す場合には、保持している上記値を第１外部デバイスを出力するようにしても良い。第１制御部に、出力する値を保持できる場合には、このような処理が行われる。
【０２９６】
一方、上で述べた第１のシステムは、複数の第１演算器に共有される第１メモリと、第１メモリに反映する前のデータを保持する第１バッファとを有する場合がある。この場合、上記１又は複数の第１演算器は、第１の出力要求で出力される値を第１メモリに書き込み、第１の計算を実行していた第１演算器のうち上記１又は複数の第１演算器以外の第１演算器は、第２の計算におけるデータの書き込みを、第１バッファに対して行うようにしても良い。そして、上で述べた第２制御部は、比較結果を第１制御部に送信すると、上で述べた第１制御部は、比較結果を第２制御部から受信し、第２制御部から受信した比較結果が第１の比較対象データと第２の比較対象データとが一致することを表す場合には、第１メモリに書き込まれた上記値を第１外部デバイスに出力し、第１バッファに対して行われた書き込みの競合の有無の判定を複数の第１演算器に実行させ、当該競合無しと判定された場合には第１バッファに対する書き込み結果を第１メモリに反映させるようにしても良い。
【０２９７】
第１制御部に、出力する値を保持しない場合には、このような構成を採用することで、同様の作用効果を得ることができるようになる。
【０２９８】
なお、上で述べた第１制御部は、第２の計算を実行する第１演算器を特定するための情報を、第２制御部に送信し、第２の計算を実行している第１演算器が第１バッファへ書き込んだデータを、第２制御部に送信し、第２の計算を実行していた第１演算器のうちある第１演算器から第１外部デバイスへの第３の出力要求が出力されたことを検出すると、第２の計算を実行していた第１演算器を停止させ、第３の出力要求で出力される値を含む第３の比較対象データを第２制御部に送信するようにしてもよい。この場合、上で述べた第２制御部は、上記情報及び第１バッファへ書き込んだデータを、第１制御部から受信し、第１制御部から第３の比較対象データを受信した場合、上記情報に基づき第２の計算に対応する第４の計算を実行する第２演算器に特定して第４の計算を実行させ、特定された第２演算器のうちある第２演算器から第２外部デバイスへの第４の出力要求が出力されたことを検出すると、第４の出力要求で出力される値を含む第４の比較対象データと第３の比較対象データとを比較し、当該比較の結果が、第３の比較対象データと第４の比較対象データとが一致することを表す場合には、上記ある第２演算器に、第４の出力要求で出力される値を第２外部デバイスへ出力させ、第１バッファへ書き込んだデータを用いて、書き込みの競合の有無の判定を第２演算器に実行させるようにしても良い。
【０２９９】
なお、上で述べたような処理をプロセッサに実施させるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブル・ディスク、ＣＤ−ＲＯＭなどの光ディスク、光磁気ディスク、半導体メモリ（例えばＲＯＭ）、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。なお、処理途中のデータについては、ＲＡＭ等の記憶装置に一時保管される。
【０３００】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０３０１】
（付記１）
複数の第１演算器と第１制御部と第１外部デバイスとを含む第１のシステムと、
複数の第２演算器と第２制御部と第２外部デバイスとを含み、前記第１のシステムで実行された計算と同一の計算を行って計算結果の比較を行うための第２のシステムと、
を有し、
前記第１制御部は、
前記複数の第１演算器のうち１又は複数の第１演算器から前記第１外部デバイスへの第１の出力要求が出力されたことを検出すると、前記１又は複数の第１演算器を含み且つ第１の計算を実行していた第１演算器を停止させ、
前記第１の出力要求で出力される値を含む第１の比較対象データを前記第２制御部に送信し、
前記第１の計算を実行していた第１演算器のうち前記１又は複数の第１演算器以外の第１演算器に、第２の計算を実行させ、
前記第２制御部は、
前記第１制御部から前記第１の比較対象データを受信した場合、前記第１の計算に対応する第３の計算を、前記第１の計算を実行していた第１演算器に対応する第２演算器に実行させ、
前記第１の計算を実行していた第１演算器に対応する第２演算器のうち１又は複数の第２演算器から前記第２外部デバイスへの第２の出力要求が出力されたことを検出すると、前記第２の出力要求で出力される値を含む第２の比較対象データと前記第１の比較対象データとを比較する
情報処理システム。
【０３０２】
（付記２）
前記第１制御部は、
前記第１の計算を実行する第１演算器を特定するための情報を、予め前記第２制御部に送信しておき、
前記第２制御部は、
前記第１の計算を実行していた第１演算器に対応する第２演算器を、前記情報に基づき特定する
付記１記載の情報処理システム。
【０３０３】
（付記３）
前記第１制御部は、
前記第２の計算を実行する第１演算器を特定するための情報を、前記第２制御部に送信し、
前記第２の計算を実行していた第１演算器のうちある第１演算器から前記第１外部デバイスへの第３の出力要求が出力されたことを検出すると、前記第２の計算を実行していた第１演算器を停止させ、
前記第３の出力要求で出力される値を含む第３の比較対象データを前記第２制御部に送信し、
前記第２の計算を実行していた第１演算器のうち前記ある第１演算器以外の第１演算器に、第５の計算を実行させ、
前記第２制御部は、
前記情報を、前記第１制御部から受信し、
前記第１制御部から前記第３の比較対象データを受信した場合、前記情報に基づき前記第２の計算に対応する第４の計算を実行する第２演算器に特定して前記第４の計算を実行させ、
特定された前記第２演算器のうちある第２演算器から前記第２外部デバイスへの第４の出力要求が出力されたことを検出すると、前記第４の出力要求で出力される値を含む第４の比較対象データと前記第３の比較対象データとを比較する
付記１記載の情報処理システム。
【０３０４】
（付記４）
前記第２の計算を実行する第１演算器を特定するための情報が、前記１又は複数の第１演算器の識別子を含む
付記３記載の情報処理システム。
【０３０５】
（付記５）
前記第１のシステムが、
前記複数の第１演算器を含む第１の仮想マシンと、
前記第１制御部を含む第２の仮想マシンと、
前記第１の仮想マシン及び前記第２の仮想マシンの管理を行う第１の管理部と、
を有し、
前記第２のシステムが、
前記複数の第２演算器を含む第３の仮想マシンと、
前記第２制御部を含む第４の仮想マシンと、
前記第３の仮想マシン及び前記第４の仮想マシンの管理を行う第２の管理部と、
を有する
付記１乃至４のいずれか１つ記載の情報処理システム。
【０３０６】
（付記６）
前記第１制御部は、
前記第１の出力要求で出力する値を保持しておき、
前記第２制御部は、
比較結果を前記第１制御部に送信し、
前記第１制御部は、
前記第２制御部から受信した前記比較結果が前記第１の比較対象データと前記第２の比較対象データとが一致することを表す場合には、保持している前記値を前記第１外部デバイスを出力する
付記１乃至５のいずれか１つ記載の情報処理システム。
【０３０７】
（付記７）
前記第１のシステムは、
前記複数の第１演算器に共有される第１メモリと、
前記第１メモリに反映する前のデータを保持する第１バッファと、
を有し、
前記１又は複数の第１演算器は、
前記第１の出力要求で出力される値を前記第１メモリに書き込み、
前記第１の計算を実行していた第１演算器のうち前記１又は複数の第１演算器以外の第１演算器は、
前記第２の計算におけるデータの書き込みを、前記第１バッファに対して行い、
前記第２制御部は、
比較結果を前記第１制御部に送信し、
前記第１制御部は、
前記比較結果を前記第２制御部から受信し、
前記第２制御部から受信した前記比較結果が前記第１の比較対象データと前記第２の比較対象データとが一致することを表す場合には、前記第１メモリに書き込まれた前記値を前記第１外部デバイスに出力し、
前記第１バッファに対して行われた書き込みの競合の有無の判定を前記複数の第１演算器に実行させ、当該競合無しと判定された場合には前記第１バッファに対する書き込み結果を前記第１メモリに反映させる
付記１記載の情報処理システム。
【０３０８】
（付記８）
前記第１制御部は、
前記第２の計算を実行する第１演算器を特定するための情報を、前記第２制御部に送信し、
前記第２の計算を実行している第１演算器が前記第１バッファへ書き込んだデータを、前記第２制御部に送信し、
前記第２の計算を実行していた第１演算器のうちある第１演算器から前記第１外部デバイスへの第３の出力要求が出力されたことを検出すると、前記第２の計算を実行していた第１演算器を停止させ、
前記第３の出力要求で出力される値を含む第３の比較対象データを前記第２制御部に送信し、
前記第２制御部は、
前記情報及び前記第１バッファへ書き込んだデータを、前記第１制御部から受信し、
前記第１制御部から前記第３の比較対象データを受信した場合、前記情報に基づき前記第２の計算に対応する第４の計算を実行する第２演算器に特定して前記第４の計算を実行させ、
特定された前記第２演算器のうちある第２演算器から前記第２外部デバイスへの第４の出力要求が出力されたことを検出すると、前記第４の出力要求で出力される値を含む第４の比較対象データと前記第３の比較対象データとを比較し、
当該比較の結果が、前記第３の比較対象データと前記第４の比較対象データとが一致することを表す場合には、前記ある第２演算器に、前記第４の出力要求で出力される値を前記第２外部デバイスへ出力させ、
前記第１バッファへ書き込んだデータを用いて、書き込みの競合の有無の判定を前記第２演算器に実行させる
付記７記載の情報処理システム。
【０３０９】
（付記９）
複数の第１演算器と第１制御部と第１外部デバイスとを含む第１のシステムと、複数の第２演算器と第２制御部と第２外部デバイスとを含み、前記第１のシステムで実行された計算と同一の計算を行って計算結果の比較を行うための第２のシステムとを有するシステムのうち前記第１制御部は、
前記複数の第１演算器のうち１又は複数の第１演算器から前記第１外部デバイスへの第１の出力要求が出力されたことを検出すると、前記１又は複数の第１演算器を含み且つ第１の計算を実行していた第１演算器を停止させ、
前記第１の出力要求で出力される値を含む第１の比較対象データを前記第２制御部に送信し、
前記第１の計算を実行していた第１演算器のうち前記１又は複数の第１演算器以外の第１演算器に、第２の計算を実行させ、
前記第２制御部は、
前記第１制御部から前記第１の比較対象データを受信した場合、前記第１の計算に対応する第３の計算を、前記第１の計算を実行していた第１演算器に対応する第２演算器に実行させ、
前記第１の計算を実行していた第１演算器に対応する第２演算器のうち１又は複数の第２演算器から前記第２外部デバイスへの第２の出力要求が出力されたことを検出すると、前記第２の出力要求で出力される値を含む第２の比較対象データと前記第１の比較対象データとを比較する
情報処理方法。
【符号の説明】
【０３１０】
１００  先行系計算機
１１０，２１０  演算部
１１１，２１１  コア
１１２，２１２  メモリ制御部
１１３，２１３  アクセス抽出部
１１４，２１４  メモリ
１２０，２２０  同期制御部
１２１，２２１  アクセス履歴格納部
１２２，２２２  制御部
１２３，２２３  出力値格納部
１３０，２３０  通信部
１４０，２４０  外部デバイス
１４１，２４１  ストレージ
１４２，２４２  Ｉ／Ｏ装置
１９０  系間通信路
２００  遅延系計算機
１２２１，２２２１  グループ対応表
１２２２  グループ管理部
１２２３，２２２２  コア実行制御部
２２２３  比較部
【図１】
0006337676.tif 000002
【図２】
0006337676.tif 000003
【図３】
0006337676.tif 000004
【図４】
0006337676.tif 000005
【図５】
0006337676.tif 000006
【図６】
0006337676.tif 000007
【図７】
0006337676.tif 000008
【図８】
0006337676.tif 000009
【図９】
0006337676.tif 000010
【図１０】
0006337676.tif 000011
【図１１】
0006337676.tif 000012
【図１２】
0006337676.tif 000013
【図１３】
0006337676.tif 000014
【図１４】
0006337676.tif 000015
【図１５】
0006337676.tif 000016
【図１６】
0006337676.tif 000017
【図１７】
0006337676.tif 000018
【図１８】
0006337676.tif 000019
【図１９】
0006337676.tif 000020
【図２０】
0006337676.tif 000021
【図２１】
0006337676.tif 000022
【図２２】
0006337676.tif 000023
【図２３】
0006337676.tif 000024
【図２４】
0006337676.tif 000025
【図２５】
0006337676.tif 000026
【図２６】
0006337676.tif 000027
【図２７】
0006337676.tif 000028
【図２８】
0006337676.tif 000029
【図２９】
0006337676.tif 000030
【図３０】
0006337676.tif 000031
【図３１】
0006337676.tif 000032
【図３２】
0006337676.tif 000033
【図３３】
0006337676.tif 000034
【図３４】
0006337676.tif 000035
【図３５】
0006337676.tif 000036
【図３６】
0006337676.tif 000037
【図３７】
0006337676.tif 000038
【図３８】
0006337676.tif 000039
【図３９】
0006337676.tif 000040
【図４０】
0006337676.tif 000041
【図４１】
0006337676.tif 000042
【図４２Ａ】
0006337676.tif 000043
【図４２Ｂ】
0006337676.tif 000044
【図４３】
0006337676.tif 000045
【図４４】
0006337676.tif 000046
【図４５】
0006337676.tif 000047
【図４６】
0006337676.tif 000048
【図４７】
0006337676.tif 000049
【図４８】
0006337676.tif 000050
【図４９】
0006337676.tif 000051
【図５０】
0006337676.tif 000052
【図５１】
0006337676.tif 000053