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()
ましたが、うまくいきませんでした。
誰かがこの点で助けてもらえますか?
どうもありがとう