(57)【特許請求の範囲】
【請求項１】
それぞれが並列処理によるモンテカルロシミュレーションの試行を実行する複数の並列試行実行部を備えた並列シミュレーション装置であって、
前記複数の並列試行実行部は、それぞれ、
自身の試行を実行する試行実行部と、
前記複数の並列試行実行部に共通のシード値を用いて、初回の乱数生成における状態変数の更新回数を、並列試行実行部毎に付与された並列番号と同数に決定し、初回以降の乱数生成における状態変数の更新回数を、前記複数の並列試行実行部の個数である並列数と同数に決定する並列乱数生成部とを備え、
前記並列番号は、０から始まり前記並列数から１を減じた値までの連番であり、
前記試行実行部は、前記並列乱数生成部で生成された乱数を用いて前記試行を行うことを特徴とする並列シミュレーション装置。
【請求項２】
前記並列乱数生成部は、
前記試行実行部が試行を実行した際の前記複数の並列試行実行部の個数である並列数と、当該試行を実行した自並列試行実行部に付与されている値である識別値と、前記シード値と、前記自並列試行実行部が生成した乱数の生成回数とを保存することを特徴とする請求項１記載の並列シミュレーション装置。
【請求項３】
一度実行したモンテカルロシミュレーションの試行を終了後に再現する際、
前記並列乱数生成部は、
当該試行の実行後に保存された、当該試行を実行した際の前記複数の並列試行実行部の並列数と、当該試行を実行した自並列試行実行部の識別値と、前記シード値と、前記自並列試行実行部が生成した最後の乱数生成回数とを用い、
初回の乱数生成における状態変数の更新回数を、前記試行実行時の並列数、識別値、シード値及び乱数生成回数を基に決定すると共に、初回以降の乱数生成における状態変数の更新回数を当該並列数を基に決定し、
前記試行実行部は、前記並列乱数生成部で生成された乱数を用いて前記試行の再現を行うことを特徴とする請求項２記載の並列シミュレーション装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列処理によるモンテカルロシミュレーションを実行する並列シミュレーション装置に関するものである。
【背景技術】
【０００２】
モンテカルロシミュレーションは、評価対象となる事象の確率的な発生頻度等を見積るために、乱数を用いた多数回のシミュレーション（以降、試行と称す。）を繰り返し実行して全試行の実行結果を統計的に処理することで評価を行う手法である。モンテカルロシミュレーションによる見積りの精度は大数の法則に従うため、試行回数を多くすればするほど、より良い精度の見積りを得ることができる。そのため、モンテカルロシミュレーションでは、実行可能な限られた時間内においてできるだけ多くの試行を実行するための実行速度の高速化が求められる。
【０００３】
このような背景に対し、複数の計算機や、ＣＰＵコアなどの計算機中の複数のプロセッサや、あるいはこれらの組合せによる複数の計算資源を用いた並列処理によるモンテカルロシミュレーションの高速化が検討されている。例えば１０００回の試行を実行するにあたり、４つのＣＰＵコアを持つ計算機を用い４並列でモンテカルロシミュレーションを実行したとすると、各ＣＰＵコアは１０００／４すなわち２５０試行を分担して並列に実行することで、１つの計算資源を用いた場合に比べて最大で４倍の高速化を実現することができる。このような複数の計算資源による並列処理を用いたモンテカルロシミュレーションでは、乱数生成処理が計算資源に分散するため、次に述べるような２つの実用上の問題がある。
【０００４】
まず１つ目の問題は、試行の実行結果の確認や、あるいは新たな条件で試行を実行した場合の影響を検証するために、試行の実行結果の再現性を確保できなければならないという問題である。再現性を確保するためには、試行の実行において使われた各種計算条件を全て再現できる必要があるため、各試行で利用された乱数列も再現できることが求められる。再現性のある乱数列の取得方法として、一般的には、線形合同法やメルセンヌ・ツイスタ等に代表される、同一のシード値から常に同一の乱数列が生成される疑似乱数生成アルゴリズムが利用される。しかし、これらの疑似乱数生成アルゴリズムは逐次的に乱数を発生させるため、乱数生成処理が複数の計算資源において並列に実行される場合は、そのままでは再現性のある乱数列を取得することができない。
次に２つ目の問題は、各試行が利用する乱数列に相関があると、多数回の試行の実行結果にバイアスがかかるため、モンテカルロシミュレーションの結果の精度が悪化するという問題である。そのため、各試行で相関の小さい乱数列が生成できることが技術的な課題となる。
【０００５】
そこで、これらの対策として、従来、例えば特許文献１に示すような並列処理手法があった。この並列処理手法は、初回の乱数生成にシード値を基に状態変数を計算し、次にその状態変数を基に乱数を生成する。初回以降の乱数生成は、前回の乱数生成で計算した状態変数を基に状態変数を更新し、更新された状態変数を基に新たな乱数を生成する。このような処理の流れは、メルセンヌ・ツイスタ等の疑似乱数生成アルゴリズムを一般的に示したものであり、また線形合同法の場合は、状態変数を生成された乱数そのものに置き換えることで、同じ枠組みとして考えることができる。なお、特許文献１では状態変数の更新処理をスキップ処理と呼ぶが、本発明では更新処理と称す。
【０００６】
特許文献１の方式は、同一のシード値から常に同一の乱数列が生成される疑似乱数生成アルゴリズムの状態変数の更新処理と保存処理を、並列に実行される試行の処理から排他的にアクセスする方式である。特許文献１の方式では、任意の試行を再現するためには、使用したシード値、当該試行の番号ｎ、更新処理に使用した１回の試行の実行に必要な乱数の個数、の３つの値を保存しておくことで、各試行で利用された乱数列を再現することが可能である。また、特許文献１の方式では、同じシード値から生成された乱数列を試行毎に分割して利用するが、例えば、メルセンヌ・ツイスタでは生成される乱数は６２３次元に均等分布し、また（２＾１９９３７）−１という非常に長い周期を持つことが証明されているため、このような疑似乱数生成アルゴリズムを特許文献１の方式に組合せることで、各試行が使用する乱数列の相関を小さくすることが可能である。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１２−１４５９１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上記特許文献１の方式では、シードの値、各試行の番号ｎ、１回の試行の実行に必要な乱数の個数の３つの値を保存することで、各試行が実行した際に利用した乱数列を再現することが可能である。しかし、この３つの値のうち、１回の試行の実行に必要な乱数の個数は、試行実行前に見積った値であり、シミュレーションの対象によっては事前に見積ることが困難な場合がある。例えば、敵・味方の２サイドが戦闘を行うようなシナリオにおいて味方側の作戦評価等に利用する防衛作戦評価用モンテカルロシミュレーションでは、ある部隊が他方の部隊を攻撃し破壊できるか否かが乱数を用いて模擬される。もし、ある時点で、ある部隊が破壊された場合、その部隊の攻撃の模擬はそれ以降実行されない。このようなモンテカルロシミュレーションでは、試行毎に、部隊が破壊された時刻や、破壊されずに戦闘を行った時刻が異なるため、早い時刻で部隊が破壊された試行では使用された乱数が少なく、また、破壊されずに戦闘を継続した試行では使用された乱数が多くなる。このように、試行の実行の途中の状況によって利用する乱数の個数が変化するようなモンテカルロシミュレーションでは、事前に１回の試行の実行に必要な乱数の個数を見積ることは困難という課題があった。
【０００９】
また、特許文献１の方式では、並列に試行を実行する各スレッドが乱数生成を行うが、各スレッドの乱数生成の初期値となる状態変数を得るために試行の実行開始前にグローバル記憶部に対して排他アクセスを行う。複数のスレッドが同時にグローバル記憶部にアクセスした場合は、後からアクセスしたスレッドの実行が、状態変数の更新を行う処理時間と、排他ロックの処理時間を足した分だけ待たされる。一般的に、状態変数の更新を行う処理時間は試行の処理時間に対して非常に小さいと考えられるが、排他ロックの処理時間は、例えば多数の計算機をネットワークで接続したような大規模並列計算機システムの場合等では状態変数の更新処理時間よりも大きくなることが考えられる。このような並列化できない処理が性能に与える影響は、一般的に次式（１）に示す並列処理におけるアムダールの法則として知られており、全体の実行時間に対して並列化できない処理の割合によって、並列数（特許文献１の方式ではスレッド数）を増やしても高速化倍率が上がらないことが知られている。      
0006270765.tif 000002
Ｓ（Ｎ）：並列数Ｎの場合の高速化倍率
Ｐ      ：全体の実行時間に対して並列化可能な処理の割合
【００１０】
式（１）において（１−Ｐ）の項が並列化できない処理の割合である。並列化できない処理の割合が１．０％である場合、並列数Ｎをいくら大きくしても高速化倍率Ｓ（Ｎ）は１００倍を超えない。このように、特許文献１の方式のような並列処理中に排他アクセスがあるようなシステムでは、並列数を増やしても高い高速化効果を得ることが難しいという課題があった。
【００１１】
この発明は上記のような課題を解決するためになされたもので、試行の再現性を確保するために試行を実行する前に１回の試行の実行に必要な乱数の個数を見積る必要がなく、また、乱数生成のために排他アクセスの必要が無い並列シミュレーション装置を得ることを目的とする。
【課題を解決するための手段】
【００１２】
この発明に係る並列シミュレーション装置は、それぞれが並列処理によるモンテカルロシミュレーションの試行を実行する複数の並列試行実行部を備えた並列シミュレーション装置であって、複数の並列試行実行部は、それぞれ、自身の試行を実行する試行実行部と、複数の並列試行実行部に共通のシード値を用いて、初回の乱数生成における状態変数の更新回数を、並列試行実行部毎に付与された並列番号と同数に決定し、初回以降の乱数生成における状態変数の更新回数を、複数の並列試行実行部の個数である並列数と同数に決定する並列乱数生成部とを備え、並列番号は、０から始まり前記並列数から１を減じた値までの連番であり、試行実行部は、並列乱数生成部で生成された乱数を用いて前記試行を行うようにしたものである。
【発明の効果】
【００１３】
この発明の並列シミュレーション装置は、試行の再現性を確保するために試行を実行する前に１回の試行の実行に必要な乱数の個数を見積る必要がなく、また、乱数生成のために排他アクセスの必要が無いという効果を得ることができる。
【図面の簡単な説明】
【００１４】
【図１】この発明の実施の形態１による並列シミュレーション装置を示す構成図である。
【図２】この発明の実施の形態１による並列シミュレーション装置のモンテカルロシミュレーションの流れを示すフローチャートである。
【図３】この発明の実施の形態１による並列シミュレーション装置の各並列試行実行部の処理の流れを示すフローチャートである。
【図４】この発明の実施の形態１による並列シミュレーション装置の並列乱数生成部における乱数生成処理の流れを示すフローチャートである。
【図５】この発明の実施の形態２による並列シミュレーション装置の過去に実行した試行の再現実行処理の流れを示すフローチャートである。
【図６】この発明の実施の形態２による並列シミュレーション装置の並列乱数生成部における乱数生成処理を示すフローチャートである。
【図７】この発明の実施の形態１及び実施の形態２による並列シミュレーション装置の効果を示す説明図である。
【図８】図７のデータをグラフ化して示す説明図である。
【発明を実施するための形態】
【００１５】
実施の形態１．
図１は、この発明の実施の形態１による並列シミュレーション装置を示す構成図である。
図１に示す並列シミュレーション装置は、全体制御部１と複数の並列試行実行部２−１〜２−ｎを備える。全体制御部１は、モンテカルロシミュレーション全体の実行制御を行う制御部である。並列試行実行部２−１〜２−ｎは、モンテカルロシミュレーションの各試行を並列に実行する処理部であり、モンテカルロシミュレーションを実行する計算資源の数に応じて用意され、図１ではｎ個用意されている例を示す。並列試行実行部２−１〜２−ｎは、それぞれ並列乱数生成部３と試行実行部４とを備えている。並列乱数生成部３は、全体制御部１によって並列試行実行部２−１〜２−ｎに実行が割り当てられた試行で利用する乱数を生成するための処理部である。試行実行部４は、全体制御部１によって並列試行実行部２−１〜２−ｎに実行が割り当てられた試行を実行するための処理部である。
【００１６】
並列乱数生成部３は、並列数保存部５、並列番号保存部６、シード値保存部７、状態変数更新部８、乱数生成部９、乱数生成回数保存部１０を備えている。なお、図１では、これら並列数保存部５〜乱数生成回数保存部１０の構成を並列試行実行部２−１のみ示しているが、他の並列試行実行部２−２〜２−ｎにおいても同様に備えているものとする。並列数保存部５は、全体の並列試行実行部２−１〜２−ｎの個数である並列数を保存する記憶部である。並列番号保存部６は、全体制御部１が各並列試行実行部２−１〜２−ｎに割り当てた番号のうち、自身の並列番号を識別値として保存する記憶部である。シード値保存部７は、全体制御部１が全ての並列試行実行部２−１〜２−ｎに同じ値として割り当てたシード値を保存する記憶部である。状態変数更新部８は、疑似乱数生成アルゴリズムにおける状態変数の更新を行う処理部である。乱数生成部９は、状態変数に基づいて乱数を生成する処理部である。乱数生成回数保存部１０は、その並列乱数生成部３において、乱数生成が行われた回数をカウントし記憶するための記憶部である。
【００１７】
次に、実施の形態１の並列シミュレーション装置の動作について説明する。
図２は、並列シミュレーション装置が行うモンテカルロシミュレーションの流れを示すフローチャートである。
モンテカルロシミュレーションの実行が開始されると、全体制御部１は、ステップＳＴ１において、ユーザによって設定された試行回数と、利用する計算資源による並列数と、乱数生成の初期値となるシード値を取得する。ここで、シード値は、ユーザが設定した値を利用するか、または、全体制御部１が、例えば日付等を基に自動的に生成した値を利用することができる。
【００１８】
次に、ステップＳＴ２において、利用する計算資源に割当てられた並列試行実行部２−１〜２−ｎに対し、全体の並列数と、それぞれの並列試行実行部２−１〜２−ｎに割り振られた並列番号と、シード値を設定する。ここで、並列番号は、０から始まる｛並列数−１｝までの整数値で、各並列試行実行部２−１〜２−ｎに対して連番で割り振られた番号である。並列試行実行部２−１〜２−ｎに設定された値は、並列乱数生成部３において、並列数保存部５に並列数が保存され、並列番号保存部６に自身の並列番号が保存され、シード値保存部７にシード値が保存される。
【００１９】
次に、ステップＳＴ３において、試行回数ループ処理が開始される。ステップＳＴ３のループ処理の終了条件は、全ての未実行の試行が実行するまでである。
次に、ステップＳＴ３のループ処理中のステップＳＴ４において、未実行の試行の１つが試行を実行していない並列試行実行部２−１〜２−ｎのうちの１つに対して割り振られる。ステップＳＴ３のループ処理の初回のステップＳＴ４では、全ての並列試行実行部２−１〜２−ｎが試行を実行していないため、全ての並列試行実行部２−１〜２−ｎに試行が割当てられ並列に実行される。
【００２０】
次に、ステップＳＴ３のループ処理中のステップＳＴ５において、何れか１つの並列試行実行部２−１〜２−ｎに割り当てた試行が終了するまで待つ処理が行われる。何れか１つの並列試行実行部２−１〜２−ｎの試行が終了した場合、ステップＳＴ３のループ処理によってループの終了条件の判定が行われ、未実行の試行が残っていた場合には、終了条件の判定が偽となり、ステップＳＴ４に処理が進み、未実行の試行が、試行の終了した並列試行実行部２−１〜２−ｎに対して割り当てられ実行される。ステップＳＴ３のループの終了条件の判定が真となった場合は、モンテカルロシミュレーションの終了となる。
【００２１】
次に、並列試行実行部２−１〜２−ｎの処理について説明する。図３は、各並列試行実行部２−１〜２−ｎの処理の流れを示すフローチャートである。
図２のステップＳＴ４で試行の実行が開始されると、全体制御部１によって割当てられた未実行の試行の実行が図３に示すように行われる。この試行実行処理は、まずステップＳＴ１１において、試行実行ループ処理が開始される。ステップＳＴ１１のループ処理の終了条件は、例えば、シミュレーションの時刻が終了時刻に達するまでであったり、あるいは、シミュレーションにおける終了イベントが模擬されるまで等、シミュレーションの種類や目的によってユーザにより設定される試行の終了条件が満たされるまでである。
【００２２】
次に、ステップＳＴ１１のループ処理中のステップＳＴ１２において、試行における１時刻分の模擬処理が開始される。次に、ステップＳＴ１３において、試行実行部４は、開始された１時刻分の模擬処理が、乱数を用いる模擬かどうかを判定する。ステップＳＴ１３の判定がＮＯ（偽）の場合、ステップＳＴ１５に進み、模擬処理を実行する。ステップＳＴ１３の判定がＹＥＳ（真）の場合、ステップＳＴ１４に進み、試行実行部４は、並列乱数生成部３に対して、当該模擬処理において必要とされる乱数を要求し、取得した後、ステップＳＴ１５に進み、模擬処理を実行する。
【００２３】
ステップＳＴ１５において１時刻分の模擬処理の実行が終了すると、次にステップＳＴ１６に進み、試行の時刻の更新を行い、次のループ処理に進み、ステップＳＴ１１において模擬実行ループの終了条件の判定が行われる。模擬実行ループの終了条件の判定が偽の場合、ステップＳＴ１２以降の処理が行われ、また、模擬実行ループの終了条件の判定が真の場合は、ステップＳＴ１７に処理が進み、当該試行において使用された乱数列の再現のために必要な情報が保存される。保存される情報は、並列乱数生成部３の並列数保存部５に保存する並列数と、並列番号保存部６に保存する並列番号と、シード値保存部７に保存するシード値と、乱数生成回数保存部１０に保存する当該試行が開始された際の乱数生成回数である。ステップＳＴ１７の処理が終了すると、その並列試行実行部２−１〜２−ｎに割り当てられた試行の実行が終了する。
【００２４】
次に、並列乱数生成部３の動作について説明する。図４は、各並列試行実行部２−１〜２−ｎの、並列乱数生成部３における乱数生成処理の流れを示すフローチャートである。なお、ここでは、各並列試行実行部２−１〜２−ｎの一つとして並列試行実行部２−１における並列乱数生成部３の動作を一例として説明する。
図３のステップＳＴ１４において、試行実行部４より並列乱数生成部３に対して乱数が要求されると、１個の乱数要求に対して図４の乱数取得処理が開始される。
先ず、ステップＳＴ１０１において、今回の乱数の要求が、並列試行実行部２−１において初回の乱数取得かどうかの判定が行われる。
ステップＳＴ１０１の判定結果がＹＥＳ（真）の場合、ステップＳＴ１０２に進み、シード値保存部７に保存されたシード値が取り出され、状態変数更新部８における状態変数更新処理の初期値として設定される。次に、ステップＳＴ１０３において、並列番号保存部６に保存された並列試行実行部２−１に割り当てられた並列番号が取り出され、次に、状態変数更新部８において並列番号と同じ数の回数分更新処理が実行され、状態変数が更新される。並列番号は各並列試行実行部２−１〜２−ｎに対して連番で割り振られた０から始まる｛並列数−１｝までの整数値であるため、このステップＳＴ１０３の処理の結果、各並列試行実行部２−１〜２−ｎは、それぞれ異なる状態変数の値に更新される。
【００２５】
ステップＳＴ１０１の判定結果がＮＯ（偽）の場合、ステップＳＴ１０４の処理に進み、並列数保存部５に保存された並列数が取り出され、次に、状態変数更新部８において並列数と同じ数の回数分更新処理が実行され、状態変数が更新される。初回の乱数取得の際にステップＳＴ１０３が実行された結果、各並列試行実行部２−１〜２−ｎは、それぞれ異なる状態変数の値に更新されているため、このステップＳＴ１０４の処理の結果も、各並列試行実行部２−１〜２−ｎは、それぞれ異なる状態変数の値に更新される。また、各並列試行実行部２−１〜２−ｎの状態変数更新部８における、初回の乱数取得から今回の乱数取得までの更新回数は、次式（２）の通りとなり、各並列試行実行部２−１〜２−ｎの全ての乱数取得において異なる状態変数の値に更新される。
Ｓｉ＝ＰＮ＋ｉ・Ｎparallel                    （２）
Ｓｉ：ｉ番目の乱数取得における更新回数
ＰＮ：各並列試行実行部に割り当てられた並列番号
Ｎparallel：並列数
なお、初回のｉの値は０である。
【００２６】
ステップＳＴ１０３またはステップＳＴ１０４の実行が終了すると、次にステップＳＴ１０５に処理が進み、乱数生成部９において状態変数を基に乱数が生成される。次に、ステップＳＴ１０６に処理が進み、乱数生成回数保存部１０において並列試行実行部２−１における乱数生成回数がカウントされる。乱数生成回数保存部１０が保存する乱数生成回数は、試行の実行が開始される時点の乱数生成回数であり、並列試行実行部２−１の最初の試行実行の際は０が、また、それ以外の試行実行の際は、その試行の前に並列試行実行部２−１で実行された試行の最後の乱数生成回数である。ステップＳＴ１０６の処理が終了すると、並列乱数生成部３における乱数取得処理が終了する。
【００２７】
以上説明したように、実施の形態１の並列シミュレーション装置によれば、それぞれが並列処理によるモンテカルロシミュレーションの試行を実行する複数の並列試行実行部を備えた並列シミュレーション装置であって、複数の並列試行実行部は、それぞれ、自身の試行を実行する試行実行部と、複数の並列試行実行部に共通のシード値を用いて、初回の乱数生成における状態変数の更新回数を並列試行実行部毎に付与された異なる値を基に決定し、初回以降の乱数生成における状態変数の更新回数を複数の並列試行実行部の個数を基に決定する並列乱数生成部とを備え、試行実行部は、並列乱数生成部で生成された乱数を用いて試行を行うようにしたので、試行の再現性を確保するために試行を実行する前に１回の試行の実行に必要な乱数の個数を見積る必要がなく、また、乱数生成のために排他アクセスの必要が無いという効果がある。なお、効果の詳細については実施の形態２を含めて後述する。
【００２８】
また、実施の形態１の並列シミュレーション装置によれば、並列乱数生成部は、初回の乱数生成における状態変数の更新回数を並列試行実行部毎に付与された異なる値と同数とし、初回以降の乱数生成における状態変数の更新回数を複数の並列試行実行部の個数と同数とするようにしたので、構成を複雑化することなく、試行の再現性を確保するために試行を実行する前に１回の試行の実行に必要な乱数の個数を見積る必要がなく、また、乱数生成のために排他アクセスの必要が無いという効果を得ることができる。
【００２９】
また、実施の形態１の並列シミュレーション装置によれば、並列乱数生成部は、試行実行部が試行を実行した際の複数の並列試行実行部の個数である並列数と、試行を実行した自並列試行実行部に付与されている値である識別値と、シード値と、自並列試行実行部が生成した乱数の生成回数とを保存するようにしたので、試行の再現性を確保するために試行を実行する前に１回の試行の実行に必要な乱数の個数を見積る必要がなく、また、乱数生成のために排他アクセスの必要が無いという効果がある。
【００３０】
実施の形態２．
実施の形態２は、過去に実行した試行の再現実行を行う場合の並列シミュレーション装置の処理を示すものである。実施の形態２における並列シミュレーション装置の図面上の構成は図１に示す実施の形態１の構成と同様であるため、図１を用いて説明する。また、過去に実行した試行とは例えば実施の形態１で説明した試行である。
実施の形態２の全体制御部１は、過去に実行した試行の再現実行を行う場合、これを指示し、各並列試行実行部２−１〜２−ｎはこれに従って試行の再現実行を行うよう構成されている。すなわち、各並列試行実行部２−１〜２−ｎにおける並列乱数生成部３は、試行の実行後に保存された、その試行を実行した際の並列数と、その試行を実行した自並列試行実行部の識別値である並列番号と、各並列試行実行部２−１〜２−ｎに共通のシード値と、自並列試行実行部が生成した最後の乱数生成回数と用いて、初回の乱数生成における状態変数の更新回数を、試行実行時の並列数、並列番号、シード値及び乱数生成回数を基に決定すると共に、初回以降の乱数生成における状態変数の更新回数を並列数を基に決定するよう構成されている。また、試行実行部４は、過去に実行した試行の再現実行を行う際、並列乱数生成部３で決定された乱数を用いて行うよう構成されている。
【００３１】
次に、実施の形態２の並列シミュレーション装置の動作について説明する。
図５は、過去に実行した試行の再現実行処理の流れを示すフローチャートである。
全体制御部１の指示により各並列試行実行部２−１〜２−ｎで試行の再現実行処理を行う場合、まず、ステップＳＴ２１において、当該試行が過去に実行された際の並列試行実行部２−１〜２−ｎにおけるステップＳＴ１７で保存された、試行再現情報である並列数、並列番号、シード値、乱数生成回数が取得される。
次に、ステップＳＴ２２において、ステップＳＴ２１で取得された並列数、並列番号、シード値、乱数生成回数が、当該試行を実行する並列試行実行部２−１〜２−ｎに対して設定される。各並列試行実行部２−１〜２−ｎに設定された値は、それぞれの並列試行実行部２−１〜２−ｎにおいて、並列数保存部５に並列数が保存され、並列番号保存部６に並列番号が保存され、シード値保存部７にシード値が保存され、乱数生成回数保存部１０に乱数生成回数が保存される。
【００３２】
次に、ステップＳＴ２３において、当該試行を実行する並列試行実行部２−１〜２−ｎに当該試行が割り当てられ、実行が開始される。各並列試行実行部２−１〜２−ｎによる試行の再現実行の処理の流れは、図３に示したフローチャートと同じである。
各並列試行実行部２−１〜２−ｎによる試行の実行が終了すると、試行の再現実行が終了する。
【００３３】
次に、図６は、図５のステップＳＴ２３で実行が開始された試行の再現実行において、並列乱数生成部３における乱数生成処理を示すフローチャートである。すなわち、この処理は図３のステップＳＴ１４において試行実行部４から並列乱数生成部３に対して乱数の取得要求があった場合の流れに相当する。
図６のフローチャートの基本的な流れは図４のフローチャートと同様であるが、ステップＳＴ２０１〜ステップＳＴ２０４の条件分岐以降の更新処理を行うステップが異なる。まず、ステップＳＴ２０１において、今回の乱数の要求が、当該並列試行実行部２−１〜２−ｎの当該試行の再現実行において初回の乱数取得かどうかの判定が行われる。
ステップＳＴ２０１の判定結果がＹＥＳ（真）の場合、ステップＳＴ２０２に進み、シード値保存部７に保存されたシード値が取り出され、状態変数更新部８における状態変数更新処理の初期値として設定される。次にステップＳＴ２０３において、並列数保存部５に保存された並列数、並列番号保存部６に保存された並列番号、乱数生成回数保存部１０に保存された乱数生成回数が取り出され、状態変数更新部８において式（２）に示した式によって更新回数が計算され、算出された更新回数分状態変数の更新を行う。ここで、式（２）の変数ｉには乱数生成回数が設定される。以上の処理により、状態変数更新部８の状態変数の値は、再現の対象となる当該試行が実行された際の初回の乱数生成時の状態変数の値に再現される。
【００３４】
一方、ステップＳＴ２０１の判定結果がＮＯ（偽）の場合、ステップＳＴ２０４の処理に進み、並列数保存部５に保存された並列数が取り出され、次に、状態変数更新部８において並列数と同じ数の回数分更新処理が実行され、状態変数が更新される。以上の処理により、状態変数更新部８の状態変数の値は、再現の対象となる当該試行が実行された際の初回以降の乱数生成時の状態変数の値に再現される。
なお、試行を再現実行する際に設定される並列数、並列番号は、当該試行が過去に実行された際のシステム構成における値を利用するだけであり、試行を再現実行にあたって過去に当該試行を実行したシステム構成そのものを再現する必要はない。
【００３５】
次に、実施の形態１及び実施の形態２を含む本発明の効果について説明する。
まず、本発明は、各試行を並列に実行する並列試行実行部２−１〜２−ｎにおいて、試行を実行する前に、当該試行が必要とする乱数の個数を予め見積る必要がなく、試行を実行した後に実際に生成した乱数の数を計測して保存することで、試行が使用した乱数列の再現を行うことを可能とする。そのため、従来技術の課題に例示した防衛作戦評価用モンテカルロシミュレーションのような、事前に必要とする乱数の個数を見積ることが困難なシミュレーションであっても問題無く利用することが可能である。
【００３６】
次に、本発明は、各試行を並列に実行する並列試行実行部２−１〜２−ｎにおいて、他の並列試行実行部２−１〜２−ｎと異なる状態変数の値になるように更新するよう更新回数を調整することで、状態変数の更新を各並列試行実行部２−１〜２−ｎにおいて排他アクセスすることなく並列に実行することができる。そのため、従来技術として示した特許文献１の方式に比べ、並列化できない処理の割合を小さくすることが可能であり、より高い並列化効果を得ることが可能である。この効果を、図７及び図８を用いて定量的に説明する。
【００３７】
図７は、並列数による高速化倍率を見積った表の説明図である。図７の表は、並列化できない処理の時間として、乱数生成に必要な更新処理と、排他ロックの処理の合計の処理時間として、式（１）に挙げた並列処理におけるアムダールの法則に基づき高速化倍率を見積った。本発明と特許文献１の方式を比較した場合、もし双方が同じ個数の乱数を用いた試行を実行したと仮定すると、双方の方式で更新処理の実行回数は同一であり、異なる点は本発明は更新処理が並列に実行され、特許文献１の方式は排他アクセスが行われるグローバル記憶部で実行される点である。そのため、図７の表において、見出しを除く左端の０．１％という列の数字が本発明による高速化倍率の見積値であり、それ以外の０．２〜０．７％という列が、それぞれ排他ロックの処理時間の割合に応じた高速化倍率の見積値である。
【００３８】
図８は、図７の表をグラフ化した説明図であり、横軸に並列数を、縦軸に高速化倍率を対数目盛で示したグラフを示している。図示のグラフに示した通り、排他ロックが必要な方式では、排他ロックの処理時間が全体に対して０．１〜０．６％と非常にわずかであっても、並列数の増加に対して高速化倍率が向上せず、より少ない並列数で高速化の効果が限界に達する。排他ロックの必要のない本発明では、より高い並列効果を得ることが可能である。
【００３９】
以上説明したように実施の形態２の並列シミュレーション装置によれば、一度実行したモンテカルロシミュレーションの試行を終了後に再現する際、並列乱数生成部は、試行の実行後に保存された、試行を実行した際の複数の並列試行実行部の並列数と、試行を実行した自並列試行実行部の識別値と、シード値と、自並列試行実行部が生成した最後の乱数生成回数とを用い、初回の乱数生成における状態変数の更新回数を、試行実行時の並列数、識別値、シード値及び乱数生成回数を基に決定すると共に、初回以降の乱数生成における状態変数の更新回数を並列数を基に決定し、試行実行部は、並列乱数生成部で生成された乱数を用いて試行の再現を行うようにしたので、試行の再現性を確保するために試行を実行する前に１回の試行の実行に必要な乱数の個数を見積る必要がなく、また、乱数生成のために排他アクセスの必要が無いという効果がある。
【００４０】
なお、本願発明はその発明の範囲内において、各実施の形態の自由な組み合わせ、あるいは各実施の形態の任意の構成要素の変形、もしくは各実施の形態において任意の構成要素の省略が可能である。
【符号の説明】
【００４１】
１  全体制御部、２−１〜２−ｎ  並列試行実行部、３  並列乱数生成部、４  試行実行部、５  並列数保存部、６  並列番号保存部、７  シード値保存部、８  状態変数更新部、９  乱数生成部、１０  乱数生成回数保存部。
【図１】
0006270765.tif 000003
【図２】
0006270765.tif 000004
【図３】
0006270765.tif 000005
【図４】
0006270765.tif 000006
【図５】
0006270765.tif 000007
【図６】
0006270765.tif 000008
【図７】
0006270765.tif 000009
【図８】
0006270765.tif 000010