我正在測試CUDA中的一些代碼(我是CUDA的新手,這是我的第一個應用程序)。到目前爲止,我已經在CUDA中獲得了與通過在CPU上串行運行代碼所獲得的結果相同的結果。我正在使用Visual Studio 2010,並且構建配置是調試。但是,只要我將構建配置更改爲「發佈」,我就開始得到錯誤的結果。我目前還沒有能夠使用Nvidia論壇。有CUDA經驗的人可以指出這個問題。的代碼如下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);
}
}
}
}
由於
結果如何「錯誤」?只有一些小的數字差異,或結果完全垃圾? CPU和GPU結果之間以及GPU上調試和發佈版本之間存在數值差異並不罕見。這並不意味着結果是錯誤的,它們實際上可能更準確。請參閱NVIDIA的以下白皮書:http://developer.download.nvidia.com/assets/cuda/files/NVIDIA-CUDA-Floating-Point。pdf您可以檢查nvcc標誌-fmad = false是否消除了差異,這表明這些差異是由於FMA合併造成的,因此無害。 – njuffa 2012-07-26 19:22:57
非常感謝njuffa。我不知道爲什麼,但使用-fmad = false flag起作用......請將此作爲答案,我會將其標記爲已接受。 – umbersar 2012-07-27 00:41:24