2

我正在处理一些关于我在 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 上的经典 Monte Carlo 耗时不到一秒……

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

非常感谢

4

2 回答 2

2

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

这篇博文http://blog.accelereyes.com/blog/2012/04/26/benchmarking-kepler-gtx-680/ 证实了轶事证据。试试新的 GTX Titan 卡或尝试单精度的 Monte Carlo 模拟(我怀疑这些选项对你来说都不是很满意)。

于 2013-04-05T02:53:57.803 回答
2

替换双浮动。双重好作品,只有cuda 3.5

于 2013-12-08T17:04:36.547 回答