我有一个关于 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]);
使我能够只填写矩阵矩阵的第二行。我不知道为什么。
当我通过以下方式更改代码行时:
matrice[index] = DoSomethingWith(drift,dt, matrice[index – nbreSimulation]);
我的矩阵填得很好,我的所有值都改变了,然后我可以取回matrice[index – nbreSimulation]
. 我认为这是一个并发访问,但我不确定,我试过__syncthreads()
但没有奏效。
有人可以帮忙吗?
非常感谢