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

C#蒙特卡罗增量风险计算优化、随机数、并行执行,c#,multithreading,parallel-processing,random,montecarlo,C#,Multithreading,Parallel Processing,Random,Montecarlo,我目前的任务是优化一个模型,该模型按地区计算一组债务人的资本充足率数字 它的运行速度比需要投入生产的地方慢了10倍左右,需要多少次或每天运行。此外,在某个阶段,结果数据的粒度需要提高到桌面级别(可能是书本级别),我给出的代码基本上是一个原型,供业务部门在半生产能力中使用 应用程序是“强”>当前单线程,所以我需要使它多线程< /强>,可以查看系统。线程。线程池< /COD>或微软库,但是我在这个银行的服务器上被限制为.NET 2,所以我可能不得不考虑这个家伙的端口。p> 我正在尽最大努力让他们升级

我目前的任务是优化一个模型,该模型按地区计算一组债务人的资本充足率数字

它的运行速度比需要投入生产的地方慢了10倍左右,需要多少次或每天运行。此外,在某个阶段,结果数据的粒度需要提高到桌面级别(可能是书本级别),我给出的代码基本上是一个原型,供业务部门在半生产能力中使用

应用程序是“强”>当前单线程<强>,所以我需要使它<强>多线程< /强>,可以查看<代码>系统。线程。线程池< /COD>或<强>微软<强>库,但是我在这个银行的服务器上被限制为.NET 2,所以我可能不得不考虑这个家伙的端口。p> 我正在尽最大努力让他们升级到.NET3.5SP1,但在这样一个规模的组织中,这是一项重要的工作,在我的合同期限内可能是不可能的

我已经使用试用版()分析了应用程序。还有什么好的分析器?免费的

大量的执行时间花费在生成统一的随机数上,然后将其转换为正态分布的随机数。他们正在使用C#实现。我不知道他们从哪里得到的,或者这是否是生成统一随机数的最佳方法(或最佳实现)。然后将其转换为正态分布的版本,以便在计算中使用(我还没有深入研究转换代码)

另外,使用以下工具的体验是什么

  • (C#quantlib港)或

你知道有其他选择吗?我是一名C#开发人员,所以我更喜欢C#,但是C++
包装应该不会有问题,对吗

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

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


无论如何,我们非常感谢您提供的任何建议和帮助。

您是否考虑过指点一下?我看到过一些简单的修复可以得到非常显著的改进的案例。就像将几个属性切换到字段一样。

首先被限制使用.Net进行大规模模拟会让您在前期损失相当多的性能…但也就是说

如果您运行的是Mersenne Twister的纯C#实现,那么很可能很难调整它的所有性能。如果你查看Mersenne Twister,你会发现他们的C版本针对支持SSE的处理器进行了大量优化,这非常快。我不相信在C#中(或者至少,我不知道如何)强制使用具有这种优化级别的SSE指令是可能的。我建议围绕Mersenne Twister库编写一个C++/CLI包装器(或P/Invoke包装器),看看这会如何影响性能。但是,您必须小心托管非托管marhsalling会影响您的性能,因为我在这里看到了其他关于该问题的帖子(尽管我现在似乎找不到它们…)


我可能会产生一些火焰来表示这一点,但是如果性能是应用程序中的一个重要问题,那么编写好的C或C++几乎总是比任何管理或解释的语言都好。

< P>我发现MelShanne Wrutter很快。问题可能在于将均匀分布转换为高斯分布的算法(Box-Muller)。标准算法如下所示:

y1 = sqrt( - 2 ln(x1) ) cos( 2 pi x2 )
y2 = sqrt( - 2 ln(x1) ) sin( 2 pi x2 )
其中x1和x2为均匀随机数,y1和y2为高斯分布输出

平方根很慢,但trig更差,接近0时不稳定。关于主题,给出了一个更快的(伪代码):


<>如果他们不使用这样的东西,你可以通过避免TIG函数或者甚至预先生成随机数来加快速度。

< P>我的经验是C + vs. C++的相对性能很大程度上取决于你所做的事情。关于这一点,这里有一个很好的讨论:

对于紧环做数学(如向量物理计算),C++比C语言快2-3倍,尽管Pyf可以由底层函数如Sqr()来支配。 我采用了一种混合语言的方法,用托管的C++/CLI包装器在C++/OpenMP中实现了最慢的代码。这只允许你“为你使用的东西付费”

下面是如何使用C++/CLI包装本机C/C++的摘要:


一旦你掌握了C++/CLI的诀窍,运行起来就很容易了。

我已经尝试了dottrace的试用,但结果没有那么精确,如果RedGate有免费试用的话,我会尝试一下。我想是的,Ants为我节省了很多时间。事实上,我非常不同意你最后的说法。。。C#可以表现得非常非常好。它确实需要分析,但在我的经验中,将C语言的配置和改进到C和C++的优越性要容易得多——特别是如果你利用正确的库,并且理解如何在C语言中编写紧凑、高效的代码。太:)@Reed-让我澄清一下-我不是说专业版的易用性
         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;