使用MKL for rng在VS2010中与英特尔TBB进行并行仿真

时间:2013-01-10 20:08:48

标签: visual-studio-2010 random tbb montecarlo

我需要在安装了英特尔TBB和MKL且只有1GB内存的VS2010中通过使用C ++的蒙特卡罗模拟找到导数的默认概率。

设p(t)表示时间t的导数价格。目前的价格是S(0)= 100.

为简单起见,导数定义为(实数导数更复杂): 概率为99%S(t + 1)= S(t)* exp(X),X~N(μ= 0,sigma = 0.01) 以1%的概率,导数跳跃到S(t + 1)= S(t)* 0.4

如果导数在0 <0的某处低于10。 t <= 250,发生以下情况: 如果概率为80%,则S(t)处的导数价格设定为1.5 * S(t)或概率为10%,我们将有违约。

假设我需要运行至少1000万次此衍生物的模拟并计算所有损失。 然后我模拟的默认概率是#defaults / 10mn。序列代码看起来像:

for j = 1 to #simulation/{
    for t = 1 to 250{
        generate S(t+1)
        check if S(t+1) defaults
    }
}

如何并行化代码? 随机数生成的最佳策略是什么?我不能生成double a priori类型的随机数,因为10mn * 250 * 2(至少)= 500m随机数* 8Byte = 4GB。

将模拟数量划分为10 *个处理器块是不是一个好主意?

VSLStreamStatePtr stream[10*#processors];
for i = 1 to 10*#processor{
    vslNewStream( &stream[i], VSL_BRNG_MT2203+i, seed );
}

tbb_parallel_for i = 1 to 10*#processors{
    use stream[i]  for random number generation
    generate    10mn / (10*#processor) * 250     random numbers ~ N(0, 0.01) and store them in a vector.
    generate    10mn / (10*#processor) * 250     random numbers ~ Bernoulli(0.01) and store them in a vector.
    generate    10mn / (10*#processor) * 250     random numbers ~ Bernoulli(0.01) and store them in a vector.
    for j = 1 to #simulation/(10*#processors){
        use 
        for t = 1 to 250{
            generate S(t+1) using the vectors filled with random numbers
            check if S(t+1) defaults
        }
    }
}

任何帮助将不胜感激...... 马特

0 个答案:

没有答案