我正在处理一些关于我在 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 耗时不到一秒……
有人可以在这一点上帮助我吗?
非常感谢