0

CUDA の奇妙な動作について質問があります。私は現在、粒子軌道のモンテカルロ シミュレーションを開発しており、次のことを行っています。

特定の日付 t(n) での粒子の位置 p(n) は、前の日付 t(n-1) での粒子の位置 t(n-1) に依存します。実際、値 v(n) が値 p(n-1) から計算されるとしましょう。これが私のコードの簡単な例です:

__device__ inline double calculateStep( double drift, double vol, double dt, double randomWalk, double S_t){
  return exp((drift - vol*vol*0.5)*dt + randomWalk*vol*sqrt(dt))*S_t;
}    

__device__ double doSomethingWhith(double v_n, ….) {
  ...
  Return v_n*exp(t)*S
}



__global__ myMCsimulation( double* matrice, double * randomWalk, int nbreSimulation, int nPaths, double drift, ……) {


  double dt = T/nPaths;
  unsigned int tid = threadIdx.x + blockDim.x * blockIdx.x; 
  unsigned int stride = blockDim.x*gridDim.x;
  unsigned int index = tid;  
  double mydt = (index - nbreSimulation)/nbreSimulation*dt + dt;

  for ( index = tid; index < nbreSimulation*nPaths; index += stride) {
    if (index >= nbreSimulation)
    {
     double v_n = DoSomethingWith(drift,dt, matrice[index – nbreSimulation]);
     matrice[index] = matrice[index - nbreSimulation ] * calculateStep(drift,v_n,dt,randomWalk[index]); // 
    }
...}

最後のコード行:

matrice[index] = matrice[index - nbreSimulation ] * calculateStep(drift,v_n,dt,randomWalk[index]);

行列行列の 2 行目だけを埋めることができます。どうしてか分かりません。

コード行を次のように変更すると:

matrice[index] =  DoSomethingWith(drift,dt, matrice[index – nbreSimulation]);

私のマトリックスは十分に入力されており、すべての値が変更されているため、matrice[index – nbreSimulation]. これは同時アクセスだと思いますが、よくわかりません。試してみ__syncthreads()ましたが、うまくいきませんでした。

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

どうもありがとう

4

2 に答える 2

1

次のようにコードを変更しましたが、完全に機能するようになりました。

if (index < nbreSimulation) {
            matrice[index] = S0;    
            for (workingCol=1; workingCol< nPaths; workingCol++) {
                previousMove = index; 
                index = index + nbreSimulation;
                  ................
                matrice[index] = calculateStep(drift,vol_int[index],dt,randomWalk[index], matrice[previousMove]);             }
       }
    }  
于 2013-03-18T12:09:11.880 に答える
0

私は次のことを試しました:

各反復で計算された値を含む共有変数 (double の配列) を宣言しました。

__shared__ double mat[];

......
for ( index = tid; index < nbreSimulation*nPaths; index += stride) {
   .....
  mat[index] = computedValue;
   ......
 }

成功せずに。誰かが問題を見ていますか?

于 2013-03-15T15:04:40.727 に答える