私はCUDAでいくつかのコードをテストしています(私はCUDAが初めてで、これが私の最初のアプリケーションです)。これまでのところ、コードを CPU でシリアルに実行して得られる結果と同じ結果を CUDA で達成しました。Visual Studio 2010 を使用しており、ビルド構成はデバッグです。しかし、ビルド構成を「リリース」に変更するとすぐに、間違った結果が得られ始めます。Nvidia フォーラムは現在ダウンしているため、使用できませんでした。CUDA の経験を持つ人が問題を指摘できますか。コードは次のとおりです。
__global__ void MyKernel(int *Nptr,int *deltaptr, double *gravityptr, double *separationptr, double *fconptr, double *xForce, double *yForce, double *zForce,
double *xPos, double *yPos, double *zPos )
{
int N = *Nptr;
int delta= *deltaptr;
double gravity= *gravityptr;
double separation = *separationptr;
double fcon = *fconptr;
double len=0.0;
double r12X =0.0;
double r12Y =0.0;
double r12Z =0.0;
double PE=0.0;
int nx = blockDim.x * blockIdx.x + threadIdx.x;//use this place of nx
//int ny = blockDim.x * blockIdx.x + threadIdx.y;//use this place of ny
int ny = blockDim.y * blockIdx.y + threadIdx.y;
//printf("nx:%d ny:%d\n", nx,ny);
if(!(nx< N && ny <N))
return;
//printf("nx:%d ny:%d\n", nx,ny);
xForce[nx*N+ny] = 0.0;
yForce[nx*N+ny] = -gravity;
zForce[nx*N+ny] = 0.0;
int lowerValuedx = maxOnDevice(nx-delta,0);
int upperValuedx=minOnDevice(nx+delta+1,N);
for(int dx=lowerValuedx; dx<upperValuedx;dx++)
{
int lowerValuedy=maxOnDevice(ny-delta,0);
int upperValuedy=minOnDevice(ny+delta+1,N);
for(int dy=lowerValuedy; dy<upperValuedy;dy++)
{
len=sqrt((double)((nx-dx)*(nx-dx)+(ny-dy)*(ny-dy)) ) *separation;
bool condition = ny!=dy;
bool condition1 = nx!=dx;
//if (nx!=dx || ny!=dy)
if (condition || condition1)
{
r12X = xPos[dx*N+dy] - xPos[nx*N+ny];
r12Y = yPos[dx*N+dy] - yPos[nx*N+ny];
r12Z = zPos[dx*N+dy] - zPos[nx*N+ny];
xForce[nx*N+ny] = xForce[nx*N+ny] +fcon*normxOnDevice(r12X,r12Y,r12Z)*(magOnDevice(r12X,r12Y,r12Z)-len);
yForce[nx*N+ny]= yForce[nx*N+ny] +fcon*normyOnDevice(r12X,r12Y,r12Z)*(magOnDevice(r12X,r12Y,r12Z)-len);
zForce[nx*N+ny]= zForce[nx*N+ny] +fcon*normzOnDevice(r12X,r12Y,r12Z)*(magOnDevice(r12X,r12Y,r12Z)-len);
}
}
}
}
ありがとう