使用CUDA进行蒙特卡罗优化

时间:2013-03-18 15:29:02

标签: optimization cuda gpu montecarlo

我正在处理我在CUDA中开发的蒙特卡罗模拟的一些缓慢问题。我观察到我的GTX 680(计算能力3.0)表现非常糟糕,我不知道我实施蒙特卡罗模拟的方式有什么问题。我试图通过在主循环中执行多个路径来“展开”我的循环,而不会观察到任何显着的改进。

我已经将我的内核定义如下:        SimulationVolInterp = parallel.gpu.CUDAKernel('sh_cuda_MC.ptx','sh_cuda_MC.cu','MCSharedMemory');      SimulationVolInterp.ThreadBlockSize = 2 ^ 9;      SimulationVolInterp.GridSize = 2 ^ 5;

这是我的核心功能:

__global__ void MC(double* vol_int, double* matrice,const double* randomWalk, int nbreSimulation, int nPaths, double S0, double strike, double T, double drift,  const double* strikes_vec, const double* volatility_mat, int l_strikes_vec) {

    //double mydt = (index - nbreSimulation)/nbreSimulation*dt + dt;
    double dt = T/nPaths;
    unsigned int tid = threadIdx.x + blockDim.x * blockIdx.x; 
   // unsigned int stride = blockDim.x*gridDim.x;
    unsigned int index = tid;   
    int workingCol = 0; 
    unsigned int previousMove;  
    if (index < nbreSimulation) {
        matrice[index] = S0;  
        for (workingCol=1; workingCol< nPaths; workingCol++) {
            previousMove = index; 
            index += nbreSimulation;
            vol_int[index] = 0.25;
            matrice[index] = matrice[previousMove]*exp((drift - vol_int[index] *vol_int[index] *0.5)*dt + randomWalk[index]*vol_int[index] *sqrt(dt));
        }
   }
}    

例如,2 ^ 12个模拟x 2 ^ 11个步骤需要7秒,它相当巨大吧?! 我在Matlab上的经典蒙特卡罗花了不到一秒钟......

在这一点上有人可以帮助我吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

GTX 680的双精度算术表现并不是那么好。我记得在GTC 2012上,一位Nvidia工程师告诉我,GTX 680的单精度FPU的双精度FPU要少得多。该卡针对游戏而非计算进行了优化。

这个沼泽地http://blog.accelereyes.com/blog/2012/04/26/benchmarking-kepler-gtx-680/ 证实了轶事证据。试试新的GTX Titan卡或单精度尝试蒙特卡罗模拟(我怀疑这些选项对您来说都不是很满意。)

答案 1 :(得分:1)

将double替换为float。双重好工作,只有cuda 3.5

相关问题