C#蒙特卡罗增量风险计算优化,随机数,并行执行

m3n*_*tat 8 c# random parallel-processing multithreading montecarlo

我目前的任务是优化蒙特卡罗模拟,该模拟根据一组Obligors计算资本充足率数据.

它运行大约10倍太慢,无法生产,需要数量或每日运行.此外,结果数字的粒度需要在某个阶段提升到桌面可能的书本水平,我给出的代码基本上是一个原型,由半生产能力的业务部门使用.

该应用程序目前单线程的,所以我需要使它多线程,可能看看System.Threading.ThreadPoolMicrosoft Parallel Extensions库但我在这家银行的服务器上受限于.NET 2所以我可能不得不考虑这个人的端口,http://www.codeproject.com/KB/cs/aforge_parallel.aspx.

我正在尽力让他们升级到.NET 3.5 SP1,但这是在这种规模的组织中的一项重要练习,在合同时间框架内可能无法实现.

使用dotTrace的试用版(http://www.jetbrains.com/profiler)描述了该应用程序.还有哪些好的剖析器?免费的?

大量的执行时间用于生成均匀的随机数,然后将其转换为正态分布的随机数.他们正在使用C#Mersenne twister实现.我不确定他们在哪里获得它,或者它是最好的方法来实现这个(或最佳实现)来生成统一的随机数.然后将其转换为正态分布版本以供计算使用(我还没有深入研究过翻译代码).

使用以下内容的经验是什么?

您知道的任何替代方案?我是C#开发人员,所以更喜欢C#,但C++包装应该不是问题,是吗?

也许更快地利用C++实现.我认为这些库中的一些库将具有最快的方法来直接生成正态分布的随机数,而无需转换步骤.此外,他们可能还有一些其他功能,将有助于后续计算.

此外,它所使用的计算机是四核Opteron 275,8 GB内存,但Windows Server 2003 Enterprise 32位.我应该建议他们升级到64位操作系统吗?任何支持这一决定的文章的链接都将非常感激.

无论如何,任何建议和帮助你都非常感激.

R U*_*ben 4

我发现 Mersenne Twister 速度很快。问题可能出在将均匀分布转换为高斯分布的算法(Box-Muller)中。标准算法如下所示:

y1 = sqrt( - 2 ln(x1) ) cos( 2 pi x2 )
y2 = sqrt( - 2 ln(x1) ) sin( 2 pi x2 )
Run Code Online (Sandbox Code Playgroud)

其中 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;
Run Code Online (Sandbox Code Playgroud)

如果他们不使用这样的东西,您可以通过避免三角函数甚至预先生成随机数来大大加快速度。