8

私の現在の仕事は、一連の債務者の地域ごとの自己資本比率の数値を計算するモンテカルロシミュレーションを最適化することです。

実行が約10倍遅いため、本番環境で実行する必要があり、数または毎日の実行が必要です。さらに、結果の数値の粒度は、ある段階でデスクレベルまで改善する必要があります。私が提供したコードは、基本的に、半生産能力のビジネスユニットで使用されるプロトタイプです。

アプリケーションは現在シングルスレッドであるため、マルチスレッドにする必要がありSystem.Threading.ThreadPoolます。MicrosoftParallel Extensionsライブラリを参照することもできますが、この銀行のサーバーでは.NET 2に制限されているため、この人のアプリケーションを検討する必要があります。ポート、http://www.codeproject.com/KB/cs/aforge_parallel.aspx

.NET 3.5 SP1にアップグレードするために最善を尽くしていますが、これはこの規模の組織では主要な演習であり、契約期間内には不可能な場合があります。

dotTracehttp://www.jetbrains.com/profiler )のトライアルを使用してアプリケーションのプロファイルを作成しました。他にどのような優れたプロファイラーが存在しますか?無料のもの?

実行時間の多くは、均一な乱数を生成し、これを正規分布の乱数に変換するために費やされます。彼らはC#メルセンヌツイスターの実装を使用しています。彼らがそれをどこで手に入れたのか、あるいはそれが均一な乱数を生成するためにこれ(または最良の実装)を行うための最良の方法であるかどうかはわかりません。次に、これは計算で使用するために正規分布バージョンに変換されます(私はまだ翻訳コードを掘り下げていません)。

また、以下を使用した経験は何ですか?

あなたが知っている代替案はありますか?私はC#開発者なので、C#を好むでしょうが、C ++のラッパーは問題にならないはずですよね?

たぶん、C++実装を活用することでさらに速くなります。これらのライブラリのいくつかは、変換ステップなしで、正規分布の乱数を直接生成するための最速の方法を備えていると思います。また、後続の計算に役立つ他の関数がいくつかある場合もあります。

また、これが搭載されているコンピューターは、クアッドコアOpteron 275、8 GBメモリですが、Windows Server 2003Enterprise32ビットです。64ビットOSにアップグレードするようにアドバイスする必要がありますか?この決定を支持する記事へのリンクは本当にありがたいです。

とにかく、あなたが持っているかもしれないどんなアドバイスと助けも本当にありがたいです。

4

4 に答える 4

4

メルセンヌツイスターは速いと思いました。問題は、均一な分布をガウス分布に変換するアルゴリズム(Box-Muller)にある可能性があります。標準のアルゴリズムは次のようになります。

y1 = sqrt( - 2 ln(x1) ) cos( 2 pi x2 )
y2 = sqrt( - 2 ln(x1) ) sin( 2 pi x2 )

ここで、x1とx2は均一な乱数であり、y1とy2はガウス分布の出力です。

平方根は遅いですが、三角関数はより悪く、0に近いほど不安定です。主題に関するTaygetaのページは、より速いものを提供します(擬似コードで):

         float x1, x2, w, y1, y2;

     do {
             x1 = 2.0 * ranf() - 1.0;
             x2 = 2.0 * ranf() - 1.0;
             w = x1 * x1 + x2 * x2;
     } while ( w >= 1.0 );

     w = sqrt( (-2.0 * ln( w ) ) / w );
     y1 = x1 * w;
     y2 = x2 * w;

このようなものを使用していない場合は、三角関数を回避するか、乱数を事前に生成することで、処理を大幅に高速化できる可能性があります。

于 2009-07-06T17:57:53.467 に答える
1

コードにプロファイラーを向けることを検討しましたか?簡単な修正が非常に大幅に改善されるケースを見てきました。いくつかのプロパティをフィールドに切り替えるようなものです。

于 2009-07-06T17:23:09.527 に答える
0

そもそも大規模なシミュレーションに.Netを使用するように制約されていると、前もってかなりのパフォーマンスが犠牲になります...しかし、それは...

メルセンヌツイスターの純粋なC#実装を実行している場合、それから可能なすべてのパフォーマンスを微調整するのに苦労する可能性があります。Mersenne Twisterリファレンス実装を確認すると、SSE対応プロセッサ用に大幅に最適化されたCバージョンがあることがわかります。これは非常に高速です。C#では(または少なくとも、その方法はわかりませんが)、そのレベルの最適化でSSE命令の使用を強制することはできないと思います。MersenneTwisterライブラリの周りにC++/ CLIラッパー(またはP / Invokeラッパー)を作成し、それがパフォーマンスにどのように影響するかを確認することをお勧めします。ただし、この問題に関するSOに関する他の投稿をここで見たので、パフォーマンスに影響を与えるマネージド-アンマネージドマーサリングに注意する必要があります(ただし、

私はこれを言うためにいくらかの炎を生み出すかもしれませんが、パフォーマンスがアプリケーションで重大な懸念事項である場合、適切に記述されたCまたはC ++は、ほとんどの場合、管理または解釈された言語よりも好ましいでしょう。

于 2009-07-06T17:43:09.017 に答える
0

私の経験では、C#とC ++の相対的なパフォーマンスは、実行している内容に大きく依存します。ここでそれについての素晴らしい議論:

C++のパフォーマンスとJava/C#の比較

数学を行うタイトなループ(ベクトル物理計算など)の場合、C ++はC#よりも2〜3倍高速ですが、パフォーマンスはSqrt()などの基礎となる関数によって支配される場合があります。

私は混合言語アプローチを採用し、マネージC ++/CLIラッパーを使用してC++/OpenMPで最も遅いコードを(再)実装しました。これにより、「使用した分だけ支払う」ことができます。

ネイティブC/C++をC++/CLIでラップする方法の概要は次のとおりです。

http://msdn.microsoft.com/en-us/library/ms235281.aspx

C ++ / CLIのコツをつかめば、物事を実行するのは非常に簡単です。

于 2009-07-08T21:34:19.143 に答える