我正在处理我在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上的经典蒙特卡罗花了不到一秒钟......
在这一点上有人可以帮助我吗?
非常感谢
答案 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