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シミュレーションx2^ 11ステップは7秒かかります、それはかなり巨大ですよね?!Matlabでの私の古典的なモンテカルロは1秒未満かかります…

誰かがこの点で私を助けてもらえますか?

どうもありがとう

4

2 に答える 2

2

double を float に置き換えます。二重の良い仕事、cuda 3.5のみ

于 2013-12-08T17:04:36.547 に答える
2

GTX 680 での倍精度演算のパフォーマンスはそれほど高くありません。GTC 2012 で、Nvidia のエンジニアが、GTX 680 には単精度 FPU よりも倍精度 FPU の方がはるかに少ないとアドバイスしたことを思い出します。このカードは、コンピューティングではなくゲーム用に最適化されています。

この沼地の投稿http://blog.accelereyes.com/blog/2012/04/26/benchmarking-kepler-gtx-680/ は逸話的な証拠を裏付けています。新しい GTX Titan カードを試すか、単精度でモンテカルロ シミュレーションを試してください (どちらのオプションも満足できるものではないと思います)。

于 2013-04-05T02:53:57.803 に答える