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シミュレーションx2^ 11ステップは7秒かかります、それはかなり巨大ですよね?!Matlabでの私の古典的なモンテカルロは1秒未満かかります…
誰かがこの点で私を助けてもらえますか?
どうもありがとう