(57)【要約】【課題】  モンテカルロ法を用いたシミュレーションあるいは数値積分のための効率的な並列処理手法を提供する。【解決手段】  状態変数生成記憶部（４８１）と複数のスレッド（４４０、４５０、４６０、４７０）を用いて並列処理によりモンテカルロ法を実行する方法であって、状態変数生成記憶部（４８１）に排他ロックがかかっているか否かを一のスレッドにおいてプロセッサコアが判断するステップと、状態変数生成記憶部（４８１）に排他ロックをかけるステップと、状態変数生成記憶部（４８１）に記憶されている状態変数を順次スキップ処理するステップと、排他ロックを解除するステップとを含み、前記の各ステップを他のスレッドにおいても順次実行してゆく方法である。【選択図】  図４
2012014591.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータによるモンテカルロ法の実行を状態変数生成記憶部と複数のスレッドを用いて並列処理する並列処理方法であって、
状態変数を状態変数生成記憶部に記憶するステップと、
一のスレッドのプロセッサコアが、排他制御のもと前記一のスレッドのプロセッサコアのみがアクセスできる状態で、前記状態変数生成記憶部に記憶されている状態変数に対し、所定の回数にわたり順次スキップ処理と変換処理を行って、乱数を生成する乱数生成ステップと、
前記一のスレッドのプロセッサコアが、前記生成した乱数を用いて前記一のスレッドに割り当てられた試行の演算を行う試行演算ステップと
を含み、前記乱数生成ステップと試行演算ステップを他のスレッドにおいても並行して順次実行してゆく並列処理方法。
【請求項２】
前記乱数生成ステップが、
乱数を生成するために用いる状態変数が記憶されている状態変数生成記憶部に排他ロックがかかっているか否かを一のスレッドにおいてプロセッサコアが判断するステップと、
前記状態変数生成記憶部に排他ロックがかかっていない場合には、前記一のスレッドのプロセッサコアが前記状態変数生成記憶部に排他ロックをかけるステップと、
前記一のスレッドのプロセッサコアが、前記状態変数生成記憶部に記憶されている状態変数に対し、所定の回数にわたり順次スキップ処理と変換処理を行う処理ステップと、
前記一のスレッドのプロセッサコアが前記状態変数生成記憶部に対する排他ロックを解除するステップと
を含む請求項１に記載の並列処理方法。
【請求項３】
コンピュータによるモンテカルロ法の実行を状態変数生成記憶部と複数のスレッドを用いて並列処理する並列処理方法であって、
状態変数を状態変数生成記憶部に記憶するステップと、
一のスレッドのプロセッサコアが、排他制御のもと前記一のスレッドのプロセッサコアのみがアクセスできる状態で、前記状態変数生成記憶部に記憶されている状態変数を取得するとともに、該状態変数に対し、所定の回数にわたり順次スキップ処理を行う状態変数スキップ処理ステップと、
前記一のスレッドのプロセッサコアが、前記取得した状態変数に対し、所定の回数にわたり変換処理とスキップ処理を行って乱数を生成するステップと、
前記一のスレッドのプロセッサコアが、前記生成した乱数を用いて前記一のスレッドに割り当てられた試行の演算を行う試行演算ステップと
を含み、前記各ステップを他のスレッドにおいても並行して順次実行してゆく並列処理方法。
【請求項４】
前記状態変数スキップ処理ステップが、
乱数を生成するために用いる状態変数が記憶されている状態変数生成記憶部に排他ロックがかかっているか否かを一のスレッドにおいてプロセッサコアが判断するステップと、
前記状態変数生成記憶部に排他ロックがかかっていない場合には、前記一のスレッドのプロセッサコアが前記状態変数生成記憶部に排他ロックをかけるステップと、
前記一のスレッドのプロセッサコアが、前記状態変数生成記憶部から状態変数の値を取得するステップと、
前記一のスレッドのプロセッサコアが、前記状態変数生成記憶部に記憶されている状態変数に対し、所定の回数にわたり順次スキップ処理を行う処理ステップと、
前記一のスレッドのプロセッサコアが、前記状態変数生成記憶部に対する排他ロックを解除するステップと
を含む請求項３に記載の並列処理方法。
【請求項５】
複数の債権を含むポートフォリオの信用リスク量を計測する方法であって、請求項１〜４のいずれか一項に記載の方法を用いてモンテカルロ法を実行することにより信用リスク量を計測する方法。
【請求項６】
請求項１〜４のいずれか一項に記載の方法を用いてモンテカルロ法を実行することにより、金融市場の変動によって生ずる市場リスク量を計測する方法。
【請求項７】
金融市場の変化をモデル化し、請求項１〜４のいずれか一項に記載の方法を用いてモンテカルロ法を実行することにより、金融商品の価格を算出する方法。
【請求項８】
コンピュータによるモンテカルロ法を状態変数生成記憶部と複数のスレッドを用いて並列処理により実行する並列処理システムであって、
前記複数のスレッドで共有される、乱数を生成するために用いる状態変数が記憶されている状態変数生成記憶部と、
前記状態変数生成記憶部に記憶されている状態変数に対し、所定の回数にわたり順次変換処理とスキップ処理を行って乱数を生成する乱数生成部と、
各スレッドについて、前記状態変数生成記憶部に排他ロックをかけるか、あるいは排他ロックを解除する排他ロック制御部と、
前記乱数生成部で生成された乱数を用いて試行の演算を行う演算処理実行部と
を備える並列処理システム。
【請求項９】
コンピュータによるモンテカルロ法を状態変数生成記憶部と複数のスレッドを用いて並列処理することにより実行する並列処理システムであって、
前記複数のスレッドで共有される、乱数を生成するために用いる状態変数が記憶されている状態変数生成記憶部と、
前記状態変数生成記憶部に記憶されている状態変数に対し、所定の回数にわたり順次スキップ処理を行う状態変数スキップ処理部と、
各スレッドについて、前記状態変数生成記憶部に排他ロックをかけるか、あるいは排他ロックを解除する排他ロック制御部と、
前記状態変数生成記憶部から状態変数の値を取得してメモリに保存する状態変数取得部と、
メモリに保存されている状態変数に対して、所定の回数にわたり変換処理とスキップ処理を行い、乱数を生成する乱数生成部と、
前記乱数生成部で生成された乱数を用いて試行の演算を行う演算処理実行部と
を備える並列処理システム。
【請求項１０】
複数の債権を含むポートフォリオの信用リスク量を計測する請求項８または９に記載の並列処理システム。
【請求項１１】
金融市場の変動によって生ずる市場リスク量を計測する請求項８または９に記載の並列処理システム。
【請求項１２】
金融商品の価格を算出するために、金融市場の変化をモデル化し、並列処理システムを用いてモンテカルロ法を実行する請求項８または９に記載の並列処理システム。
【請求項１３】
コンピュータに請求項１〜７のいずれかに記載の方法の各ステップを実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、モンテカルロ法の並列処理手法に関し、特に、並列計算機を効率的に用いるモンテカルロ法の並列処理手法と、それを実行するための装置およびコンピュータプログラムに関する。
【背景技術】
【０００２】
モンテカルロ法（Monte Carlo method）は、自然現象や社会現象をはじめとする確率的な現象の分析や、複雑な数値積分などに広く用いられる手法である。このモンテカルロ法は、解析的に解くことが難しい問題に対して特に威力を発揮する。自然現象および社会現象は、不確実性を有するものが大半を占めるため、モンテカルロ法の適用範囲は学術分野から実務にわたり極めて広い。さらに、モンテカルロ法のアルゴリズム（計算手順）は理解が容易であることもモンテカルロ法が広く普及している一因である。例えば、モンテカルロ法を産業上利用している具体例としては、流体力学の分野におけるシミュレーションや、金融機関におけるリスク量の算出や各種金融商品の価格算出などが挙げられる（例えば、特許文献１、非特許文献１参照）。
【０００３】
一方で、モンテカルロ法の計算精度を確保するためには試行回数を十分に取る必要があり、その結果、計算時間が増大するという短所をもつ。近年では、複数のプロセッサコアを搭載したコンピュータが続々と登場し、従来は単一のスレッドで実行していたところ、複数のプロセッサコアのそれぞれにおいてスレッドを立てて並列に処理することによって計算時間を短縮することが比較的容易になった。ここで、スレッドとは、プロセス内の処理の流れのことを指す。モンテカルロ法についても並列処理によって計算時間を短縮することができる。特に、モンテカルロ法のアルゴリズムは並列処理と親和性が非常に高く、モンテカルロ法の並列処理による高速化の要請は高まっている。
【０００４】
モンテカルロ法に並列処理を施すこと自体は従来から行われている。すなわち、モンテカルロ法の試行全体を複数のスレッドで分担して、１台のコンピュータあるいは１個のプロセッサコアにつき１個のスレッドを割り当てることにより、各コンピュータまたはプロセッサコアが独立して処理を行うことができる。例えば試行回数を１００００回として４台のコンピュータで並列処理する場合には、各コンピュータでそれぞれ２５００回の試行を行えばよい。
【０００５】
しかし、実用上は、次に挙げる２つの問題を克服しなければならない。一つは、計算結果の再現性の問題であり、もう一つは、乱数系列間に生じる相関の問題である。
【０００６】
一つ目の計算結果の再現性とは、同じ乱数シード、すなわち、同じ乱数系列を用いてモンテカルロ法による数値計算を繰り返し行った場合に、同じ計算結果が得られるという意味である。この再現性は、バックテストを行うときや計算条件を変更した際の影響を検証する際に欠かせないものである。一般に、プログラムを並列化すると処理の逐次性が失われるため、計算結果の再現性を確保するには乱数の生成法と使用法に関する工夫が必要となる。
【０００７】
二つ目の乱数系列間に生じる相関とは、モンテカルロ法の並列処理にあたって、スレッド毎に用いる乱数系列の間に有意にゼロとは言えない相関が生じることを指す。このような相関が生じると計算結果の信頼性が低下するため、コンピュータあるいはプロセッサコアごとにそれぞれ別の乱数系列を生成する場合には、乱数列間の相関が非常に小さいものを用いる必要がある。その解決策としては、一つの乱数系列を用いて並列処理を行うか、あるいは、互いに相関が非常に小さい乱数系列を生成し単純に並列処理を行うかのいずれかが考えられる。後者についてのアルゴリズムは存在するが、モンテカルロ法を実行する以前に乱数系列を生成するための処理や乱数列の独立性に関する検証が必要となるなど、課題が多い。したがって、一つの乱数列を用い、かつ、計算結果の再現性を保持しつつ、並列処理を行うことが実用上は重要となる。
【０００８】
一つの乱数列を用い、計算結果の再現性を保持しつつ、並列処理を行う際には、モンテカルロ法実行時の乱数の生成方法が本質的に重要となる。モンテカルロ法の並列処理に関する既存の技術としては以下のものがある。
【０００９】
［従来技術１］
図１は、従来技術（以下、従来技術１とも呼ぶ。）として、４個のスレッドを有する並列処理システムを用いて並列処理を行う場合の各スレッドの試行番号の担当を示す図である。横軸は第１スレッドから第４スレッドを示しており、縦軸は時間ｔを示している。そして、符号Ａは、後続で行う試行に用いる乱数の生成処理を示している。符号Ｂは、各試行の実行処理を示している。符号Ｂの後に続くかっこ書きの数字は、試行番号である。符号Ｃは、後述する乱数捨象処理もしくは状態変数のスキップ処理を示している。
【００１０】
図１に示すように、従来技術１では各スレッドに対して試行回数を均等に配分する。具体的には、前述のように１００００回の試行を４個のスレッドで実行すると考えて、第１スレッドは第１番目から第２５００番目の試行を担当する。そして、第２スレッドは第２５０１番目から第５０００番目の試行を担当し、第３スレッドは第５００１番目から第７５００番目の試行を担当し、第４スレッドは第７５０１番目から第１００００番目の試行を担当する。すなわち、それぞれのスレッドは２５００回分の試行を実行する。
【００１１】
乱数生成部をスレッドごとにそれぞれ用意し、全ての乱数生成部に同一の乱数シード（乱数系列)を与える。各スレッドは、自己が担当する試行にとって不要な乱数を捨象した上で、各自が割り当てられた試行を行う。
【００１２】
例えば、１回の試行に１００個の乱数を用いるとすると、第１スレッドは、１００×２５００＝２５万個の乱数を生成して試行を行う。
【００１３】
第２スレッドも同様に２５万個の乱数を必要とする。しかし、第２スレッドは、５０万個の乱数を生成した上で、前半の２５万個を捨象し、後半の２５万個を試行に用いる必要がある。前半の２５万個の乱数は、第１スレッドが試行のために使用するものであり、第２スレッドは前半の２５万個の乱数を使用することができない。第２スレッドも前半の２５万個の乱数を使用してしまうと、第１スレッドと第２スレッドのいずれもが同じ乱数を用いて試行を行うこととなり、モンテカルロ法の結果の信頼性が低下してしまう。この乱数捨象処理を図１において符号Ｃで示している。
【００１４】
これは、擬似乱数が、ランダムな物理現象、例えばサイコロを振って出た目を利用して生成する物理乱数とは異なり、前回の乱数を算術式に代入して、新たな乱数を生成するという逐次的な性質を有するからである。したがって、第２スレッドにおいては、第１番目から第２５万番目の乱数を生成しないと、第２５万１番目以降の乱数を生成することができない。
【００１５】
第３スレッドは、７５万個の乱数を生成する。そして、第１スレッドで使用する最初の２５万個の乱数と、第２スレッドで使用する次の２５万個の乱数とを足し合わせた５０万個の乱数を捨象した上で、第５０万１番目の乱数から始めて２５万個の乱数を用いて試行を行う。
【００１６】
最後に、第４スレッドは、１００万個の乱数を生成する。そして、第１スレッドで使用する最初の２５万個の乱数と、第２スレッドで使用する次の２５万個の乱数と、第３スレッドで使用するさらに次の２５万個の乱数とを足し合わせた７５万個の乱数を捨象した上で、第７５万１番目から始めて２５万個の乱数を用いて試行を行う。
【００１７】
ここで、第１スレッドは乱数の捨象処理を行わないことに留意されたい。
【００１８】
これにより上記二つの問題を克服した並列処理が可能となる。ただし、この方法では、後続の試行を担当するスレッドほどより多くの乱数を捨象しなければならないため、試行回数は均等であるが、各スレッドの処理負荷は不均等となる。図１の例では、第１スレッドは乱数の捨象処理を行わないため、４つのスレッドの中で最も処理負荷が小さい。そして、第２スレッド、第３スレッド、第４スレッドの順に、生成する乱数の個数が増えるため、処理の負荷も同じ順番で大きくなる。すなわち、第４スレッドは、４個のスレッドの中で最も処理負荷が大きい。
【００１９】
第４スレッドが第１００００番目の試行の試行を終えた時点で、モンテカルロ法の処理は終了する。第４スレッドが第１００００番目の試行を終えるまでに要する理論的な計算時間ｔｐ１は、以下のように表現することができる。
【数１】
2012014591.tif 000003
ここで、ＮＳｉｍはモンテカルロ法の試行回数であり、ＮＴは並列処理を行うスレッドの数であり、ｔＳｉｍは１回の試行に要する時間であり、ｔＳｋｉｐは１回の試行に用いる乱数の捨象に要する時間である。
【００２０】
この処理方法では、スレッド数が多いほど処理負荷の不均等が如実に現れるため、スレッド数が増加するに従って並列処理の効率が悪化していく。
【００２１】
［従来技術２］
上記の方法を改善したものが特許文献１に記載されている。特許文献１によれば、金融工学の種々の計算におけるモンテカルロ法において、各スレッドが担当する試行回数を均等に割り当てるのではなく、後続の試行を担当するスレッドの試行回数を少なくすることにより、各スレッドの処理負荷の均一化を図るように改善されている。その様子を図２に示している。図１と同様に、符号Ａは、後続で行うモンテカルロ法に用いる乱数生成処理を示している。符号Ｂは、試行の実行処理を示している。符号Ｂの後に続くかっこ書きの数字は、試行番号である。符号Ｃは、乱数捨象処理を示している。
【００２２】
図２に示すように、例えば、第１スレッドは第１番目から第３０００番目の試行を担当する。第２スレッドは第３００１番目から第５７５０番目の試行を担当する。第３スレッドは第５７５１番目から第８０００番目の試行を担当する。第４スレッドは第８００１番目から第１００００番目の試行を担当する。
【００２３】
つまり、第１スレッドは３０００回分の試行を担当し、第２スレッドは２７５０回分の試行を担当し、第３スレッドは２２５０回分の試行を担当し、第４スレッドは２０００回分の試行を担当する。
【００２４】
このように、従来技術２では、乱数を多く生成する必要があるスレッドの試行担当回数を他のスレッドよりも減らすことにより、全体として、４個のスレッドの負荷の均等化を図っている。
【００２５】
この従来技術において、各プロセッサコアの処理負荷が均一になるように試行回数を割り当てた場合に試行の実行に要する理論的な計算時間ｔｐ２は、以下のように表現することができる。
【数２】
2012014591.tif 000004
ここで、ＮＳｉｍはモンテカルロ法の試行回数であり、ＮＴは並列処理を行うスレッドの数であり、ｔＳｉｍは１回の試行に要する時間であり、ｔＳｋｉｐは１回の試行に用いる乱数の捨象に要する時間である。
【００２６】
この技術にも次のような問題点がある。一つは、処理負荷が均一になるように各スレッドに最適な試行回数を割り当てるためには、ｔＳｉｍとｔＳｋｉｐの値を計測する必要があり、そのための追加的なプログラムが必要となる点である。もう一つは、依然として各スレッドで乱数の捨象処理を行う必要があるため、従来技術１と比べて改善はするものの、やはりスレッド数が増えるにつれて並列処理の効率が落ちるという点である。
【００２７】
なお、式（２）および式（３）において、スレッド数ＮＴ→∞の極限をとると、いずれもＮＳｉｍｔＳｋｉｐとなる。すなわち、どんなにスレッド数を増やしても、ＮＳｉｍｔＳｋｉｐの計算時間を要する。これは、乱数の生成は逐次的に行うものであって、モンテカルロ法全体を完全には並列化することができないからである。
【先行技術文献】
【特許文献】
【００２８】
【特許文献１】特許４０３２３３９号公報
【非特許文献１】石川達也、内田善彦、「モンテカルロ法によるプライシングとリスク量の算出について―正規乱数を用いる場合の適切な実装方法の考察―」、金融研究、日本銀行金融研究所、２００２年６月、第２１巻、別冊第１号、ｐ．５１−９０
【発明の概要】
【発明が解決しようとする課題】
【００２９】
本発明は、従来技術で行っていた、各スレッドにおける無駄な乱数の捨象を行わず、かつ、処理負荷の均一化を図るために各スレッドが担当する試行回数を予め計算して決めておく必要のない、効率的な並列処理手法を提供することを目的とする。
【課題を解決するための手段】
【００３０】
本発明は、コンピュータによるモンテカルロ法の実行を状態変数生成記憶部と複数のスレッドを用いて並列処理する並列処理方法であって、状態変数を状態変数生成記憶部に記憶するステップと、一のスレッドのプロセッサコアが、排他制御のもと前記一のスレッドのプロセッサコアのみがアクセスできる状態で、前記状態変数生成記憶部に記憶されている状態変数に対し、所定の回数にわたり順次スキップ処理と変換処理を行って、乱数を生成する乱数生成ステップと、前記一のスレッドのプロセッサコアが、前記生成した乱数を用いて前記一のスレッドに割り当てられた試行の演算を行う試行演算ステップとを含み、前記乱数生成ステップと試行演算ステップを他のスレッドにおいても並行して順次実行してゆく並列処理方法を提供する。
【００３１】
本発明はまた、前記乱数生成ステップが、乱数を生成するために用いる状態変数が記憶されている状態変数生成記憶部に排他ロックがかかっているか否かを一のスレッドにおいてプロセッサコアが判断するステップと、前記状態変数生成記憶部に排他ロックがかかっていない場合には、前記一のスレッドのプロセッサコアが前記状態変数生成記憶部に排他ロックをかけるステップと、前記一のスレッドのプロセッサコアが、前記状態変数生成記憶部に記憶されている状態変数に対し、所定の回数にわたり順次スキップ処理と変換処理を行う処理ステップと、前記一のスレッドのプロセッサコアが前記状態変数生成記憶部に対する排他ロックを解除するステップとを含むものである前記並列処理方法を提供する。
【００３２】
さらに、本発明はコンピュータによるモンテカルロ法の実行を状態変数生成記憶部と複数のスレッドを用いて並列処理する並列処理方法であって、状態変数を状態変数生成記憶部に記憶するステップと、一のスレッドのプロセッサコアが、排他制御のもと前記一のスレッドのプロセッサコアのみがアクセスできる状態で、前記状態変数生成記憶部に記憶されている状態変数を取得するとともに、該状態変数に対し、所定の回数にわたり順次スキップ処理を行う状態変数スキップ処理ステップと、前記一のスレッドのプロセッサコアが、前記取得した状態変数に対し、所定の回数にわたり変換処理とスキップ処理を行って乱数を生成するステップと、前記一のスレッドのプロセッサコアが、前記生成した乱数を用いて前記一のスレッドに割り当てられた試行の演算を行う試行演算ステップとを含み、前記各ステップを他のスレッドにおいても並行して順次実行してゆく並列処理方法を提供する。
【００３３】
ここで、前記状態変数スキップ処理ステップは、乱数を生成するために用いる状態変数が記憶されている状態変数生成記憶部に排他ロックがかかっているか否かを一のスレッドにおいてプロセッサコアが判断するステップと、前記状態変数生成記憶部に排他ロックがかかっていない場合には、前記一のスレッドのプロセッサコアが前記状態変数生成記憶部に排他ロックをかけるステップと、前記一のスレッドのプロセッサコアが、前記状態変数生成記憶部から状態変数の値を取得するステップと、前記一のスレッドのプロセッサコアが、前記状態変数生成記憶部に記憶されている状態変数に対し、所定の回数にわたり順次スキップ処理を行う処理ステップと、前記一のスレッドのプロセッサコアが、前記状態変数生成記憶部に対する排他ロックを解除するステップとを含むものであってよい。
【００３４】
これらの並列処理方法は、金融工学の分野において、複数の債権を含むポートフォリオの信用リスク量を計測するため、金融市場の変化をモデル化して金融商品の価格を算出するため、さらには、金融市場の変動によって生ずる市場リスク量を計測するために、モンテカルロ法を実行するのに用いることができる。
【００３５】
本発明は、これらの並列処理方法の各ステップをコンピュータに実行させるためのプログラムも提供する。
【００３６】
さらに、本発明は、コンピュータによるモンテカルロ法を状態変数生成記憶部と複数のスレッドを用いて並列処理により実行する並列処理システムであって、前記複数のスレッドで共有される、乱数を生成するために用いる状態変数が記憶されている状態変数生成記憶部と、前記状態変数生成記憶部に記憶されている状態変数に対し、所定の回数にわたり順次変換処理とスキップ処理を行って乱数を生成する乱数生成部と、各スレッドについて、前記状態変数生成記憶部に排他ロックをかけるか、あるいは排他ロックを解除する排他ロック制御部と、前記乱数生成部で生成された乱数を用いて試行の演算を行う演算処理実行部とを備える並列処理システムを提供する。
【００３７】
そして、本発明は、コンピュータによるモンテカルロ法を状態変数生成記憶部と複数のスレッドを用いて並列処理することにより実行する並列処理システムであって、前記複数のスレッドで共有される、乱数を生成するために用いる状態変数が記憶されている状態変数生成記憶部と、前記状態変数生成記憶部に記憶されている状態変数に対し、所定の回数にわたり順次スキップ処理を行う状態変数スキップ処理部と、各スレッドについて、前記状態変数生成記憶部に排他ロックをかけるか、あるいは排他ロックを解除する排他ロック制御部と、前記状態変数生成記憶部から状態変数の値を取得してメモリに保存する状態変数取得部と、メモリに保存されている状態変数に対して、所定の回数にわたり変換処理とスキップ処理を行い、乱数を生成する乱数生成部と、前記乱数生成部で生成された乱数を用いて試行の演算を行う演算処理実行部とを備える並列処理システムをも提供する。
【００３８】
本発明の一実施形態によれば、モンテカルロ法を用いて金融工学の分野における信用リスク量の計測を行うことができる。すなわち、個々の債務者（通常、企業）の価値の変化をモデル化して、そのポートフォリオまたは銀行の信用リスク量（信用ＶａＲ、条件付き信用ＶａＲなど）を計測する場合に、本発明の方法を用いてモンテカルロシミュレーションを実行することにより、全体的な信用リスク量を算出することができる。
【００３９】
また、同様にして本発明のモンテカルロ法を用いて金融市場における市場リスク量の計測を行うことができる。具体的には、株式市場における株価の変化や債券市場における債券価格の変化をモデル化して、本発明の方法を用いてモンテカルロシミュレーションを実行することにより、これらの市場の変動によって生ずる市場リスク量を計測することができる。
【００４０】
あるいは、本発明のモンテカルロ法を用いて金融商品の価格算出を行うことができる。すなわち、金融市場の変化をモデル化して、本発明の方法を用いてモンテカルロシミュレーションを実行することにより、各種有価証券やデリバティブなどの金融商品の価格を算出することができる。
【発明の効果】
【００４１】
本発明では、ほぼ理想的な並列化効率を実現したモンテカルロ法の並列処理が実現される。また、本発明は実装が容易であるという特長を持つ。本発明は、一般のモンテカルロ法についての技術であって、適用分野を問わないため、上述のように、本発明によりモンテカルロ法の計算負荷の軽減のメリットを享受できる分野は極めて広いと考えられる。金融工学の各分野のほか、流体力学や分子動力学などの種々の分野において有用なものである。また、従来技術の上記二つの欠点、すなわち、無駄な乱数の捨象によりスレッド数が増えるに従って並列化の効率が落ちるという欠点と、各スレッドに割り当てる試行回数をあらかじめ計算しなければならないという欠点とをいずれも解消でき、より一層効率的な並列処理が可能となる。
【図面の簡単な説明】
【００４２】
【図１】従来技術に基づいて、各スレッドに試行回数を割り当てる様子を示す模式図である。
【図２】従来技術に基づいて、各スレッドに試行回数を割り当てる様子を示す模式図である。
【図３】乱数を生成する処理の流れを示す模式図である。
【図４】モンテカルロ法の並列処理を行う並列処理システムのブロック図である。
【図５】モンテカルロ法の並列処理の流れを示すフローチャートである。
【図６】各スレッドに試行回数を割り当てる様子を示す模式図である。
【図７】従来技術１との計算時間の比較を示す表である。
【図８】従来技術２との計算時間の比較を示す表である。
【図９】モンテカルロ法を逐次処理することにより、半径０．５の円の面積を求めるプログラム例である。
【図１０】モンテカルロ法を並列処理することにより、半径０．５の円の面積を求めるプログラム例である。
【図１１】モンテカルロ法を並列処理することにより、半径０．５の円の面積を求めるプログラム例である。
【図１２】乱数生成クラスのプログラム例である。
【発明を実施するための形態】
【００４３】
まず、乱数生成処理について述べる。図３は、乱数を生成する処理の流れを示す模式図である。乱数を生成するためには、最初にシード（乱数種）と呼ばれる、擬似乱数を生成する元となる値を用意する。このシードを符号１０１で示している。シード１０１は、キーボードを通して入力するか、あるいは、専用のプログラムを用いて準備することもできる。
【００４４】
そして、ステップＳ１として、用意されたシード１０１から状態変数１０２を計算する。状態変数とは、一般には整数を要素とするベクトルである。次にステップＳ２として、初期状態変数１０２から乱数１０３を生成する。ステップＳ３では、初期状態変数１０２から新たな状態変数１０４を計算する。ステップＳ４では、状態変数１０４から乱数１０５を生成する。ステップＳ５では、状態変数１０４から新たな状態変数１０６を計算する。ステップＳ６では、状態変数１０６から乱数１０７を生成する。
【００４５】
あるいは、ステップＳ１、Ｓ３、Ｓ５、Ｓ７、・・・を実行して、状態変数を必要な乱数個分生成する。その上で、ステップＳ２、Ｓ４、Ｓ６、・・・を実行して乱数を生成することもできる。
【００４６】
このようにして、状態変数の計算と乱数の生成とを繰り返すことにより、複数の乱数を生成することができる。この乱数生成方法の具体例として、メルセンヌ・ツイスター（Mersenne Twister）法や線形合同法を挙げることができる。線形合同法は、状態変数そのものが乱数であると考えることにより、上述の乱数生成処理の枠組みで捉えることが可能である。
【００４７】
ステップＳ３、Ｓ５、Ｓ７のように、ある状態変数から新たな状態変数を計算する処理を状態変数のスキップ処理と呼ぶ。このように、状態変数に対してスキップ処理を行うと、状態変数の値は更新される。
【００４８】
上述したように、乱数の生成は、状態変数のスキップ処理と、状態変数を乱数に変換する変換処理とに分けることができる。また、各スキップ処理の後すぐに乱数の生成を実行することもできる。本発明は、排他制御を利用しつつ、状態変数の値を全てのスレッドで共有することにより、従来技術における無駄な乱数の捨象処理が不要となるという知見に基づいている。
【００４９】
本発明を実現する一つの方法として、次のような実施形態が考えられる。すなわち、状態変数の情報を保持することができる乱数生成モジュールを１個用意し、全スレッドで共有する。このモジュールおよび、並列タスク・スケジューリングを以下のように組み合わせることにより、無駄な捨象のない乱数の割り当てを実現する。
【００５０】
例えば、ある試行において、第１スレッドが乱数生成処理に入る場合を考える。このとき、排他制御の下、第１スレッドが、前記モジュールにおいて順次変換処理とスキップ処理を行い、１回の試行で必要な乱数を生成してスレッド内のローカルメモリに保存する。この処理により、前記モジュールには最後のスキップ処理によって得られた状態変数が保存された状態となる。その後、排他制御が解除され、第１スレッドは上記ローカルメモリに保存された乱数を元に、モンテカルロ法の１回の試行を実施する。次に、第２スレッドは、同じく排他制御の下、前記モジュールにおいて１回の試行で必要な乱数のスキップ処理と変換処理を行うことになる。このようにして、その他のスレッドについても同様にして処理が進行していく。
【００５１】
上記の実施形態では、１回の試行に使用する乱数が多くなるにつれ、各スレッドで使用するローカルメモリの容量も多くなり、また、乱数の保存および呼び出しに伴うメモリアクセスの回数も増える。このため、１回の試行に使用する乱数の数が多い場合には、メモリへのアクセスに要する時間が無視できなくなり、処理時間が増大する可能性がある。メモリの使用量を最小限に留めることにより、上記の処理時間増大の可能性を回避する方法を、次の実施形態で示す。
【００５２】
本発明を実現する他の一つの方法として、次のような実施形態が考えられる。すなわち、スキップ処理と変換処理のそれぞれの目的に応じて、二つのメモリ保持形態を有するモジュールを用意する。その上で、状態変数の保存とスキップ処理を行うためのモジュールを１つ用意し（以下、モジュールｍ０とする)、全スレッドで共有する。さらに、状態変数に変換処理とスキップ処理を施して乱数を生成するためのモジュールをスレッドごとに用意する（以下、ｍ１，ｍ２，・・・，ｍＮＴとする）。
【００５３】
これらの（ＮＴ＋１）個のモジュールおよび、並列タスク・スケジューリングを以下のように組み合わせることにより、無駄な捨象がない乱数の割り当てを実現する。例えば、ある試行において、第１スレッドが乱数生成処理に入る場合を考える。このとき排他制御の下、第１スレッドがモジュールｍ０に保存されている状態変数をモジュールｍ１にコピーする。さらに、１回の試行で必要な乱数分のスキップ処理をモジュールｍ０において行う。この処理により、モジュールｍ０には、最後のスキップ処理によって得られた状態変数が保存された状態となる。その後、排他制御が解除され、第１スレッドはモジュールｍ１を用いてローカルに変換処理とスキップ処理を行い、試行の実行に必要な乱数を生成する。次に、第２スレッドは、同じく排他制御の下、モジュールｍ０に保存されている状態変数の情報をモジュールｍ２へコピーしたうえで、モジュールｍ０のスキップ処理を行うことになる。このようにして、その他のスレッドについても同様にして処理が進行していく。
【００５４】
上記の一連の操作でも、無駄な乱数の捨象は発生しない。また、各試行にはどのスレッドが任意の順番で担当しても同じ乱数が割り当てられるため、計算結果の再現性が得られ、各スレッドに担当させる試行の回数をあらかじめ決めておく必要はない。
【００５５】
上記の一連の操作においては、各スレッドのローカルメモリ上にコピーされるのはモジュールｍ０に保存されている状態変数だけであり、最初に示した実施形態に比べて、メモリへのアクセスを減らすことができる。一方で、各スレッドは状態変数のスキップ処理をモジュールｍ０のほか、各スレッドで行われる乱数生成時にも行う必要がある。このため、どちらの実施形態の処理時間が速いかは、ハードウエアや分析の対象に依存する。
【００５６】
なお、上記の２つの実施形態からも分かるように、本発明では状態変数のスキップ処理に対する排他制御を行う必要がある。排他制御を実現する方法には様々なものが知られているが、本発明は特定の排他制御の方法を前提としたものではない。各スレッドに共有された状態変数のスキップ処理が複数のスレッドで同時に行われることを回避できさえすれば、どのような排他制御方法を用いても実現可能である。この排他制御は、例えば、同期オブジェクトと排他ロックという概念を用いて実行することができる。排他制御が必要となる部分、すなわちある特定のセッションに入る前に、あるオブジェクトに鍵をかける。鍵がかかっている間、他のスレッドは同じオブジェクトに鍵をかけることできず、鍵が外されるまで待たされる。そして、鍵をかけたスレッドはその特定のセッションを終えた後にそのオブジェクトに対する鍵を外す。このとき、鍵をかける対象となるオブジェクトのことを同期オブジェクトと、鍵をかける操作のことを排他ロックと呼ぶ。この同期オブジェクトは、以下に説明する状態変数生成記憶部としてとらえることもできるし、それ以外の対象あるいは抽象的なデータとしてとらえることもできる。
【００５７】
図４は、ある一実施の形態に基づいてモンテカルロ法を並列に実行する並列処理システム４００のブロック図である。並列処理システム４００は、キーボードおよびマウスを含む入力装置４１０と、ＬＣＤ（Liquid Crystal Display）ディスプレイなどの表示装置４２０とを有している。
【００５８】
並列処理システム４００は、さらに、並列処理制御部４３０と、第１スレッド４４０と、第２スレッド４５０と、第３スレッド４６０と、第４スレッド４７０と、グローバル記憶部４８０とを有している。この第１から第４のスレッド４４０、４５０、４６０、４７０は、４個以上のプロセッサコアを有するコンピュータを用いて実現することもできるし、４台以上のコンピュータを用いて実現することができる。また、並列処理システム４００自体を、４個以上のプロセッサを有するマルチプロセッサコンピュータを含むコンピュータシステムを用いて実現することもできる。
【００５９】
グローバル記憶部４８０は、状態変数を記憶する状態変数生成記憶部４８１と状態変数スキップ処理部４８２とを有している。状態変数生成記憶部４８１および状態変数スキップ処理部４８２には、第１スレッドから第４スレッドの各スレッドのいずれもがアクセスして状態変数の値の取得やスキップ処理を行うことができる。
【００６０】
並列処理制御部４３０は、入力装置４１０からの指示を受けて、状態変数生成記憶部４８１と、状態変数スキップ処理部４８２と、第１スレッド４４０と、第２スレッド４５０と、第３スレッド４６０と、第４スレッド４７０とに対し、モンテカルロ法を並列に処理するよう指示を送る。各スレッドは、一つのプロセッサコアが担当して実行することができる。
【００６１】
このとき、並列処理制御部４３０は、入力装置４１０から受け取ったシードを用いて状態変数を生成し、状態変数生成記憶部４８１に保存する。あるいは、並列処理制御部４３０が自ら専用のプログラムを用いてシードを生成し、そのシードから状態変数を生成して状態変数生成記憶部４８１に保存することができる。
【００６２】
第１スレッド４４０と、第２スレッド４５０と、第３スレッド４６０と、第４スレッド４７０とは、並列処理制御部４３０による制御を受けて、モンテカルロ法を並列に実行する。本実施形態の並列処理システム４００は４個のスレッドを有しているが、これに限定されない。スレッド数は任意の整数とすることができ、ハードウエアの構成に応じて変更することもできる。
【００６３】
第１から第４のスレッド４４０、４５０、４６０、４７０は、いずれも同じ構造をとっている。例えば、第１スレッドは、試行回数計数部４４１と、排他ロック制御部４４２と、状態変数取得部４４３と、乱数生成部４４５と、試行実行部４４６と、ローカル記憶部４４７とを有している。
【００６４】
並列処理システム４００は、結果出力部４９０も有している。結果出力部４９０は、４個のスレッド４４０、４５０、４６０、４７０でそれぞれ実行された試行により得られた結果をまとめて、表示装置４２０へ出力することができる。
【００６５】
図５は、図４に示した第１から第４のスレッド４４０、４５０、４６０、４７０がそれぞれ並列に行う処理のフローチャートである。一例として、試行回数Ｎｓｉｍを１００００回（Ｎｓｉｍ＝１００００）とする。
【００６６】
以下、第１スレッド４４０を例にとって処理の流れを説明する。まず、ステップＳ５０１で処理を開始する。ステップＳ５０２において、試行回数計数部４４１が、第何番目の試行であるかを表す変数ｎと、試行回数Ｎｓｉｍとの大小関係を判断する。なお、変数nの値は、処理の開始時点で０に初期化されているものとする。
【００６７】
ステップＳ５０２において、試行回数計数部４４１がｎ＜Ｎｓｉｍと判断した場合には、ステップＳ５０３に進む。他方、試行回数計数部４４１が、ｎ＜Ｎｓｉｍと判断しなかった場合には、ステップＳ５１１に進み、処理を終了する。
【００６８】
ステップＳ５０３では、試行回数計数部４４１がｎをインクリメントする。すなわち、ｎ＋１を計算して得られた結果を新たなｎの値とする。このとき得られた新たなｎの値が、これから実行する試行の番号である。
【００６９】
ステップＳ５０４では、排他ロック制御部４４２が、状態変数生成記憶部４８１へのアクセスを試みる。第２から第４のスレッドの排他ロック制御部４５２、４６２、４７２のいずれもが状態変数生成記憶部４８１に対して排他ロックをかけていない場合には、第１スレッド４４０が状態変数生成記憶部４８１へアクセスすることができ、次いでステップＳ５０５に進む。
【００７０】
他方、ステップＳ５０４の段階で、第２から第４のスレッドの排他ロック制御部４５２、４６２、４７２のいずれか、例えば第４スレッド内の排他ロック制御部４７２が状態変数生成記憶部４８１に対して排他ロックをかけている場合には、第１から第３のスレッド４４０、４５０、４６０は状態変数生成記憶部４８１へアクセスすることができない。その場合は、ステップＳ５０４をある一定の時間をおいてから再度実行する。
【００７１】
ステップＳ５０５では、第１スレッド４４０の排他ロック制御部４４２が状態変数生成記憶部４８１に対して排他ロックをかける。その結果、第２、第３、第４のスレッド４５０、４６０、４７０は、いずれも状態変数生成記憶部４８１に対してアクセスすることができなくなる。
【００７２】
状態変数生成記憶部４８１に対するアクセスの排他制御を行わないとすると、同時に複数のスレッドがアクセスでき、複数のスレッドが同じ状態変数を用いて乱数を生成することとなる。この場合、異なるスレッドで使用する乱数の一部に重複が生じ、得られるモンテカルロ法の結果も信頼性に欠けるものとなる。このように、同じ状態変数を複数のスレッドが重複して用いないようにするために、上述した排他的なアクセス制御が有効である。
【００７３】
次にステップＳ５０６では、第１スレッドの状態変数取得部４４３が状態変数生成記憶部４８１にアクセスし、状態変数生成記憶部４８１に保存されている状態変数の値を取得して、ローカル記憶部４４７に保存する。
【００７４】
次にステップＳ５０７では、状態変数スキップ処理部４８２が状態変数生成記憶部４８１に保存されている状態変数に対しスキップ処理を実行する。具体的には、状態変数スキップ処理部４８２が、図３に示したステップＳ３、Ｓ５、Ｓ７、・・・を繰り返して実行する。このとき、繰り返す回数は、１回のシミュレーションを行うのに必要な乱数の個数と同じ値である。
【００７５】
例えば、１回の試行に１００個の乱数を要する場合は、ステップＳ５０７で、状態変数スキップ処理部４８２が、図３に示した状態変数スキップ処理（ステップＳ３、Ｓ５、Ｓ７、・・・）を１００回繰り返して実行する。
【００７６】
この時点で、第１スレッド４４０のローカル記憶部４４７には、ステップＳ５０６で取得された状態変数が保存されている。また、状態変数生成記憶部４８１には、次の試行で用いる最初の乱数に対応する状態変数が保存されている。
【００７７】
次にステップＳ５０８では、第１スレッド４４０の排他ロック制御部４４２が、状態変数生成記憶部４８１に対する排他ロックを解除する。その結果、第２から第４のスレッド
４５０、４６０、４７０が状態変数生成記憶部４８１へアクセスできることとなる。
【００７８】
ステップＳ５０９では、ローカル記憶部４４７に保存されている状態変数を呼び出し、乱数生成部４４５にその値を渡す。
【００７９】
ステップＳ５１０では、乱数生成部４４５が１００個の乱数を生成しながら、試行実行部４４６が１回の試行を実行する。その後、ステップＳ５０２に進む。
【００８０】
以上のようにして、第１スレッド４４０は、自己が担当するモンテカルロ法を実行することができる。第２スレッド４５０、第３スレッド４６０、第４スレッド４７０も、図５に示した処理を実行することにより、自己が担当するモンテカルロ法をそれぞれ実行することができる。その結果、第１スレッド４４０、第２スレッド４５０、第３スレッド４６０、第４スレッド４７０が、全ての試行を並列に実行することができる。
【００８１】
上記実施形態を通して説明したように、本発明においては、排他制御を利用しつつ、状態変数の情報を全スレッドで共有することにより、無駄な状態変数のスキップ処理を排除している。
【００８２】
図６は、上記実施形態による各スレッドの試行の担当例を示す図である。横軸は第１スレッドから第４スレッドを示しており、縦軸は時間ｔを示している。図１および図２と同様に、符号Ａは、後続で行うモンテカルロ法の試行に用いる乱数の生成処理を示している。符号Ｂは、試行の実行処理を示している。符号Ｂの後に続くかっこ書きの数字は、試行番号である。ここで、従来技術１を示す図１および従来技術２を示す図２とは異なり、上記実施形態においては乱数捨象処理を表す符号Ｃが各スレッドに分散しており、処理負荷の均一化が図られていることがわかる。このように各スレッドの負荷が均一化できるのは、状態変数生成記憶部を利用することにより、試行に用いる状態変数の情報を全スレッドが共有しているためである。
【００８３】
図６に示した例では、第１スレッドは、ｎ＝２，６，・・・，９９９８の試行を実行し、第２スレッドは、ｎ＝１，５，・・・，９９９７の試行を実行し、第３スレッドは、ｎ＝４，８，・・・，１００００の試行を実行し、第４スレッドは、ｎ＝３，７，・・・，９９９９の試行を実行している。ただし、各スレッドに対する試行番号の割り当てはＯＳの並列タスク・スケジューリングにより自動的に決められるため、一般に各スレッドに割り当てられる試行番号は実行のたびに異なるものとなる。また、各スレッドが実行する試行回数は必ずしも同一の回数になるとも限らない。一方で、本発明の方法では、同一の試行番号の試行には必ず同じ乱数が割り当てられるため、モンテカルロ法の実行結果には再現性がある。
【００８４】
マルチタスクＯＳでは、試行実行中であっても、ＯＳによってプロセッサコアに他のタスクが割り当てられることがあり、計算量が均等になるように各スレッドに処理を割り当てたとしても、各プロセッサコアが処理の終了までに要する時間は必ずしも均一になるとは限らない。本発明の方法によれば、他のタスクによる負荷が少ないプロセッサコアに自動的に多くの試行処理が割り当てられ、プロセッサコア間の負荷が自動的に分散化されるという利点もある。
【００８５】
上記実施形態における並列処理は、第１００００番目の試行を終えた時点で、処理終了となる。第１００００番目の試行を終えるまでに要する理論的な計算時間ｔＭＣは、以下のように表現することができる。
【数３】
2012014591.tif 000005
ここで、ＮＳｉｍはモンテカルロ法の試行回数であり、ＮＴは試行を実行するスレッドの数であり、ｔＳｉｍは１回の試行に要する時間であり、ｔＳｋｉｐは１回の試行に用いる乱数のスキップ処理に要する時間である。
【００８６】
スレッド数ＮＴ≦ｔＳｉｍ／ｔＳｋｉｐの場合には、試行の実行処理を行っている間に、他のスレッドのスキップ処理が終わるため、排他ロックによる処理の待ち時間は生じない。この場合、式（４）からわかるように、スレッド数ＮＴを増加させると、それに応じて計算時間ｔＭＣは短くなる。他方、スレッド数ＮＴ≧ｔＳｉｍ／ｔＳｋｉｐの場合には、スレッド数ＮＴを増加させても計算時間ｔＭＣは変化しない。これは、この場合には排他ロックによる処理の待ち時間が生じるためである。
【００８７】
図７に示す表１は、本発明の一実施形態と、上述した従来技術１との理論的な計算時間の比較を表している。横軸はスレッド数であり、縦軸はｔＳｉｍ／ｔｓｋｉｐである。そして、表内の値は、（本発明の一実施形態による理論的な計算時間）／（従来技術１の理論的な計算時間）である。
【００８８】
ｔＳｉｍ／ｔｓｋｉｐの値が大きくほど、乱数発生以外の処理に掛かる時間が長い複雑な試行であることを意味する。なお、ｔＳｉｍ／ｔｓｋｉｐ＝１の場合、すなわち、１回の試行に要する時間ｔＳｉｍと、１回の試行に用いる乱数のスキップ処理に要する時間ｔＳｋｉｐとが等しい場合は、乱数を生成させただけで、乱数を用いた演算を行わないことを意味している。これは、実用的には意味のないものであるが、計算時間の比較として参考までに載せるものである。
【００８９】
表１によれば、スレッド数を２０とし、ｔＳｉｍ／ｔｓｋｉｐ＝２０である場合には、（本発明の一実施形態による理論的な計算時間）／（従来技術１の理論的な計算時間）＝０．５４である。すなわち、従来技術１と比べて計算時間をほぼ半減できることを意味している。
【００９０】
図８に示す表２は、本発明の一実施形態と、上述した従来技術２との理論的な計算時間の比較を表している。表１と同様に、横軸はスレッド数であり、縦軸はｔＳｉｍ／ｔｓｋｉｐである。そして、表内の値は、（本発明の一実施形態による理論的な計算時間）／（従来技術２の理論的な計算時間）である。なお、従来技術２では、理論的な計算時間を達成するためにモンテカルロ法実行前にｔＳｉｍとｔｓｋｉｐを計測する必要があるが、ここでの比較ではその計測に要する時間は考慮していない。
【００９１】
表２によれば、スレッド数を２０とし、ｔＳｉｍ／ｔｓｋｉｐ＝２０である場合には、（本発明の一実施形態による理論的な計算時間）／（従来技術２の理論的な計算時間）＝０．６７である。すなわち、従来技術１より優れている従来技術２と比較しても計算時間をほぼ３分の２に短縮できることを意味している。
【００９２】
［実施例］
以下、モンテカルロ法を用いて、半径０．５の円の面積を求める実施例について説明する。まず、図９は、モンテカルロ法を並列にではなく、逐次的に行うプログラム例である。ここでは、プログラミング言語としてＣ＋＋言語を用いる。図９に示されているプログラムの各行の左側に示されている「１」、「２」、・・・、「２０」は、プログラムの行番号を表すものであって、プログラム自体を構成するものではない。
【００９３】
第１行目の「AreaOfCircle」は、モンテカルロ法により半径０．５の円の面積を求める関数である。この関数の引数「ＮＳｉｍ」は試行回数を表す変数であり、引数「ｓｅｅｄ」は、擬似乱数を生成する元となる値である。関数「AreaOfCircle」が第２行目から第２０行目において定義されている。
【００９４】
第４行目の変数「ｘ」および「ｙ」は、生成した乱数をｘ座標値およびｙ座標値とするための変数である。第５行目の変数「ｒ＿ｓｑ」は、半径０．５の円の中心点（０．５，０．５）と、乱数生成により求めたＸＹ平面上の点との距離を二乗した値を保存する変数である。第６行目の変数「ｓ」は、乱数生成により求めたＸＹ平面上の複数の点のうち、半径０．５の円内に含まれる点の数を保存する変数である。
【００９５】
第７行目の「RandomNumberGenerator」は、（０，１）区間の一様乱数を生成するクラスである。その詳細については後述する。第１０行目では、関数「AreaOfCircle」の引数「ｓｅｅｄ」の初期化を行う。
【００９６】
第１３行目から第１８行目は、モンテカルロ法を行うループである。試行番号を表す変数ＳｉｍＮｏ＝０から始めてＮＳｉｍ回の試行を逐次的に行う。第１４行目および第１５行目でそれぞれ１個の乱数を生成して、それぞれの値をＸ座標値およびＹ座標値とする。これにより、ＸＹ平面上の点をランダムに定めることができる。第１６行目では、ピタゴラスの定理を用いて、第１４行目および第１５行目で定められたＸＹ平面上の点と、円の中心点（０．５、０．５）との距離の二乗を計算し、変数ｒ＿ｓｑに保存する。第１７行目では、ｒ＿ｓｑと０．２５（＝０．５＊０．５）との大小関係を判断して、ｒ＿ｓｑ＜０．２５を満たす場合、すなわち、ランダムに定められたＸＹ平面上の点が半径０．５の円内に含まれる場合に、変数ｓをインクリメントする。そして、第１９行目のｓ／ＮＳｉｍが関数AreaOfCircleの戻り値、すなわち、求められた円の面積である。試行の実行回数ＮＳｉｍの値が大きければ大きいほど、求まる円の面積は、π＊０．５＊０．５に近くなる。
【００９７】
図１０は、図９のプログラム例を並列化したプログラム例である。図１０に示すプログラム例では、並列計算を行うための標準規格であるＯｐｅｎＭＰを用いて並列化を行っている。ＯｐｅｎＭＰは、主に共有メモリ型の並列計算機で用いられている。
【００９８】
第１行目は、図９と同様に、変数ＮＳｉｍおよび変数ｓｅｅｄを引数とする関数AreaOfCircleの宣言文である。
【００９９】
第５行目は、状態変数の値を取得するための乱数生成クラスRandomNumberGeneratorを宣言している。この乱数生成クラスRandomNumberGeneratorは、全てのスレッドが共有するクラスである。後に図１２に示すように、このクラスには状態変数に相当するメンバ変数が含まれており、状態変数生成記憶部４８１の役割を果たすことができる。また、状態変数のスキップ処理や状態変数の値の取得処理、乱数の生成処理を行うメソッドも含まれている。
【０１００】
第６行目の変数ｓは、図９と同様に、乱数生成により求めたＸＹ平面上の複数の点のうち、半径０．５の円内に含まれる点の数を保存する変数である。
【０１０１】
第１２行目から第３２行目は、各スレッドが並列に処理を実行する部分である。すなわち、変数ＳｉｍＮｏ＝０から始めてＮＳｉｍ回の試行を図４に示したスレッド４４０、４５０、４６０、４７０が分担して実行する。
【０１０２】
第２２行目および第２７行目は、状態変数生成記憶部４８１に対する排他ロックの制御を行う処理である。これは、図４の排他ロック制御部４４２、４５２、４６２、４７２が行う処理に相当する。この処理により、あるスレッドが乱数の生成処理を行っている場合（第２５、２６行目）においては、他のスレッドは、乱数生成処理を実行することができなくなる。
【０１０３】
第３３行目で計算するｓ／ＮＳｉｍは、関数AreaOfCircleの戻り値、すなわち、求められた円の面積である。この計算は、図４の結果出力部４９０の処理に相当する。
【０１０４】
第１２行目、第１９行目、第２２行目の記述は、ＯｐｅｎＭＰによる並列処理の指示を示している。
【０１０５】
なお、図１０に示したプログラム例では、図４で示したブロック図とは異なり、乱数生成部は全スレッドに共有されており、各スレッドには状態変数取得部や乱数生成部は存在しない。一方で、排他制御を利用しつつ状態変数の情報を全スレッドで共有する、という発明の特徴は備えている。このような例も、本発明の範囲に含まれる。
【０１０６】
図１０のプログラム例では、１回の試行に用いる乱数は２個と少ないが、１回の試行に多くの乱数を使用するシミュレーションでは、各スレッドで使用するメモリの容量が増え、メモリへのアクセス回数も増える。このため、ハードウエアや分析の対象によっては、図１０と同様のプログラムではメモリへのアクセスに要する時間が無視できなくなる場合がある。
【０１０７】
図１０のプログラム例における排他制御部での処理を最小限に留めることにより、上記の処理時間増大の可能性を軽減する方法も考えられる。それが、図１１で示すプログラム例である。
【０１０８】
第５行目は、図１０と同様に、全てのスレッドで共有する、乱数生成クラスRandomNumberGeneratorを宣言している。このクラスには状態変数にあたるメンバ変数が含まれており、これによって状態変数の情報が全クラスで共有されることとなる。
【０１０９】
第６行目では、１回のモンテカルロ法で用いる乱数の個数を表す変数ＮＲａｎｄを定めている。本例では、ＮＲａｎｄ＝２と定めている。これは、１回の試行につき、Ｘ座標値とするための乱数と、Ｙ座標値とするための乱数とをあわせた合計２個の乱数が必要となるからである。
【０１１０】
第２８行目および第３４行目は、状態変数生成記憶部４８１に対する排他ロックの制御を行う処理である。この処理により、あるスレッドが状態変数の値の取得（第３１行目）を行っている場合と、状態変数のスキップ処理（第３３行目）を行っている場合とにおいては、他のスレッドは、状態変数の値の取得およびスキップ処理をいずれも行うことができなくなる。
【０１１１】
第３７行目では、先に取得した状態変数を各スレッドの乱数生成クラスにセットする。そして、第３８行目および第３９行目で乱数を生成して、それぞれＸ座標値およびＹ座標値とする。
【０１１２】
図１２は、図９、図１０、図１１の各プログラム例で用いる乱数生成クラス「RandomNumberGenerator」を宣言するプログラム例である。図１２の第１０行目では、状態変数に相当するメンバ変数ｓｔａｔｅ＿ｖｅｃが宣言されている。この変数に状態変数の値を格納することにより、このクラスは状態変数生成記憶部４８１の役割を果たすことができる。また、このクラスRandomNumberGeneratorには、乱数の生成処理を行うメソッド（第２３行目）や、状態変数のスキップ処理を行うメソッド（第２６行目）、状態変数の値の取得処理を行うメソッド（第２９行目）が用意されている。これらは、図４のブロック図でいえば、それぞれ乱数生成部（符号４４５、４５５、４６５、４７５）、状態変数スキップ処理部（符号４８２）、状態変数取得部（符号４４３、４５３、４６３、４７３）に相当する役割を果たすものである。このクラスの実際の処理は、乱数生成アルゴリズムとして、メルセンヌ・ツイスター法、線形合同法、あるいはその他の方法のいずれを使用するかによって変わる。
【０１１３】
並列計算機は、共有メモリ型並列計算機と、分散メモリ型並列計算機とに大別できる。共有メモリ型並列計算機は、全てのプロセッサコアがメモリを共同で使用するタイプの計算機である。このメモリは、共有メモリと呼ばれている。共有メモリ型並列計算機は、プロセッサコア間のデータの交換が容易であるという長所を有する。一方で、プロセッサコア数が多い場合には、共有メモリへの書き込みが競合し、性能が低下する場合があるという短所を有する。共有メモリ型並列計算機への実装にはＯｐｅｎＭＰを用いることができる。
【０１１４】
分散メモリ型並列計算機は、図４に示した第１から第４のスレッド４４０、４５０、４６０、４７０のそれぞれを、個別にメモリを持ついくつかのプロセッサにより実行することができるものである。プロセッサ間でデータを交換するためには、プロセッサ間で通信を行う必要がある。分散メモリ型並列計算機への実装には、ＭＰＩ（Message Passing Interface）を用いることができる。
【０１１５】
上記実施形態は、共有メモリ型並列計算機、および分散メモリ型並列計算機のいずれにも実装することができる。すなわち、図４に示した第１から第４のスレッド４４０、４５０、４６０、４７０の全てが、状態変数の情報を共有できさえすれば、共有メモリ型並列計算機、および分散メモリ型並列計算機のいずれにも実装することができる。また、各スレッドを１個のプロセッサコアが担当するように構成することもできるし、各スレッド自体を２個以上のプロセッサコアにより処理することもできる。
【０１１６】
なお、本発明の各実施の形態を実装するためのコンピュータのハードウエア構成は特段図示した構成に限定されるものではなく、数値演算の形式に併せて専用の数値演算ユニットを一つ以上有していたり、複数の筐体に分かれて互いにネットワークにより接続されているクラスタ構成にされていたりすることができる。なお、本実施例のみならず、本発明全般に、区別して記載された機能手段は、実質的にそのような区別された機能を果たす任意の構成要素によって実現される。このとき、その構成要素が、物理的にいくつの数を有するか、あるいは、複数であり互いにどのような位置関係にあるかなどの機能を果たす上で制限とならない属性によって本発明が制限されることはない。例えば、複数の区別された機能が単一の構成要素によって経時的に異なるタイミングで実行されることも本発明の範囲に含まれる。
【０１１７】
本発明の各実施の形態の機能処理を実装するコンピュータにおいて数値計算をするためのソフトウエア構成は、本発明の各実施の形態の数値情報処理を実現する限り任意の構成とすることができる。そのコンピュータは、基本入出力システム（ＢＩＯＳ）などのハードウエア制御のためのソフトウエアを搭載しており、これと連携して動作し、ファイル入出力やハードウエアリソースの割り振りを担当するオペレーティングシステム（ＯＳ）によって管理されている。当該ＯＳは、ＯＳやハードウエアと連携して動作するアプリケーションプログラムを、例えばユーザーからの明示の命令や、ユーザーからの間接的な命令や他のプログラムからの命令に基づいて実行することができる。アプリケーションプログラムは、このような動作を可能とし、ＯＳと関連して動作するように、ＯＳの規定する手続に依存して、あるいはＯＳに依存しないように適切にプログラムされている。本発明の各実施の形態を実装する場合には、一般に、専用のアプリケーションプログラムの形式で数値計算やファイル入出力等の処理を実装するが、本発明がそれのみに限定されるものではなく、複数の専用または汎用アプリケーションプログラムを用いたり、既成の数値計算ライブラリを部分的に用いたり、他のコンピュータのハードウエアによって処理されるようにネットワークプログラミング手法によって実現されていたり、その他の任意の実装形態によって実現されうる。したがって、本発明の各実施の形態の計算手法をコンピュータ上に実装するための一連の命令を表現するソフトウエアを、単にプログラムと呼ぶ。プログラムは、コンピュータにより実行可能な任意の形式あるいはそのような形式に最終的に変換可能な任意の形式によって表現される。
【０１１８】
本発明の各実施の形態のプログラムは、ハードウエア資源であるＭＰＵなどの演算手段が、ＯＳを介してあるいはＯＳを介することなく計算プログラムからの指令を受け、ハードウエア資源であるメインメモリや補助記憶装置などの記憶手段と協働して、ハードウエア資源である適当なバスなどを通じて演算処理を行うように構成される。つまり、本発明の各実施の形態の計算手法を実現するソフトウエアによる情報処理が、これらのハードウエア資源によって実現されるように実装される。記憶手段あるいは記憶部は、任意の単位によって論理的に区分されているコンピュータが可読な情報記憶媒体の一部または全部またはそれらの組み合わせをいう。この記憶手段は、例えば、ＭＰＵ内のキャッシュメモリや、ＭＰＵと接続されたメインメモリや、ＭＰＵと適当なバスによって接続されたハードディスクドライブなどの不揮発性記憶媒体など、任意のハードウエア資源によって実現される。ここで、記憶手段は、ＭＰＵのアーキテクチャによって規定されるメモリ内の領域や、ＯＳが管理するファイルシステム上のファイルやフォルダ、同じコンピュータ内やネットワーク上のいずれかのコンピュータにあってアクセス可能なデータベースマネージメントシステム内のリストやレコード、リレーショナルデータベースによって相互にリレーションがある複数のリストで管理されたレコードなど任意の形式によって実現され、論理的に他と区分され、情報を識別可能に少なくとも一時的に記憶または記録できる任意のものを含む。
【符号の説明】
【０１１９】
４００  並列処理システム
４１０  入力装置
４２０  表示装置
４３０  並列処理制御部
４４０  第１スレッド
４５０  第２スレッド
４６０  第３スレッド
４７０  第４スレッド
４４１、４５１、４６１、４７１  試行回数計数部
４４２、４５２、４６２、４７２  排他ロック制御部
４４３、４５３、４６３、４７３  状態変数取得部
４４５、４５５、４６５、４７５  乱数生成部
４４６、４５６、４６６、４７６  試行実行部
４４７、４５７、４６７、４７７  ローカル記憶部
４８０  グローバル記憶部
４８１  状態変数生成記憶部
４８２  状態変数スキップ処理部
４９０  結果出力部
【図１】
2012014591.tif 000006
【図２】
2012014591.tif 000007
【図３】
2012014591.tif 000008
【図４】
2012014591.tif 000009
【図５】
2012014591.tif 000010
【図６】
2012014591.tif 000011
【図７】
2012014591.tif 000012
【図８】
2012014591.tif 000013
【図９】
2012014591.tif 000014
【図１０】
2012014591.tif 000015
【図１１】
2012014591.tif 000016
【図１２】
2012014591.tif 000017