我试图运行下面的代码并遇到内存访问错误。我试图运行cuda-memcheck并返回以下信息:
这对我来说很奇怪,因为相同的代码在另一台具有不同GPU卡的计算机上运行良好。我尝试使用cuda-memcheck并返回以下信息:
========= CUD的CUDA-MEMCHECK CUDA错误:/Users/s161901/Desktop/Liver_Bio_recon_study/IVFD_GPU_only/codes/kernel.cu:2010 code = 4(cudaErrorLaunchFailure)“cudaMemcpy(Iout,d_Iout,sizeof( float)* voxelNumber,cudaMemcpyDeviceToHost)“=========程序命中cudaErrorLaunchFailure(错误4),因为CUDA API调用cudaThreadSynchronize时出现”未指定的启动失败“。 =========保存的主机回溯到错误的驱动程序入口点=========主机帧:C:\ WINDOWS \ system32 \ nvcuda.dll(cuDevicePrimaryCtxGetState + 0x2d242e)[0x2e006b] = ========主机框架:F:\ Liver_Bio_recon_study \ IVFD_GPU_only \ cudart64_70.dll(cudaThreadSynchronize + 0xf5)[0x1bba5] =========主机框架:F:\ Liver_Bio_recon_study \ IVFD_GPU_only \ IVFD_GPU_0。 exe [0x130ef] =========主机帧:F:\ Liver_Bio_recon_study \ IVFD_GPU_only \ IVFD_GPU_0.exe [0xc17b] =========主机帧:F:\ Liver_Bio_recon_study \ IVFD_GPU_only \ IVFD_GPU_0。 exe [0x1bedc] =========主机帧:F:\ Liver_Bio_recon_study \ IVFD_GPU_only \ IVFD_GPU_0.exe [0x1bd2e] =========主机帧:C:\ WINDOWS \ System32 \ KERNEL32。 DLL(BaseThreadInitThunk + 0x14)[0x13034]
=========由于CUDA API调用cudaMemcpy时出现“未指定的启动失败”,程序命中cudaErrorLaunchFailure(错误4)。 =========保存的主机回溯到错误的驱动程序入口点=========主机帧:C:\ WINDOWS \ system32 \ nvcuda.dll(cuDevicePrimaryCtxGetState + 0x2d242e)[0x2e006b] = ========主机框架:F:\ Liver_Bio_recon_study \ IVFD_GPU_only \ cudart64_70.dll(cudaMemcpy + 0x12f)[0x2711f] =========主机框架:F:\ Liver_Bio_recon_study \ IVFD_GPU_only \ IVFD_GPU_0。 exe [0x13113] =========主机帧:F:\ Liver_Bio_recon_study \ IVFD_GPU_only \ IVFD_GPU_0.exe [0xc17b] =========主机帧:F:\ Liver_Bio_recon_study \ IVFD_GPU_only \ IVFD_GPU_0。 exe [0x1bedc] =========主机帧:F:\ Liver_Bio_recon_study \ IVFD_GPU_only \ IVFD_GPU_0.exe [0x1bd2e] =========主机帧:C:\ WINDOWS \ System32 \ KERNEL32。 DLL(BaseThreadInitThunk + 0x14)[0x13034]
=========错误摘要:2个错误
我的cuda内核是:
__global__ void backwardProj(float *dest, int NPROJ, float *d_prj3d, int nx, int nz, float vx, float vz, float *d_sine, float *d_cosine, float PIXSIZE_X, float PIXSIZE_Z, int NI_X, int NI_Z, float L1, float L2)
{
const int tid = (blockIdx.y*32768 + blockIdx.x)*blockDim.x + threadIdx.x;
if (tid >= nx*nx*nz)
return;
float result = 0.0F;
for(int iproj = 0; iproj < NPROJ; iproj++)
{
float sinTheta = d_sine[iproj];
float cosTheta = d_cosine[iproj];
// setup rotation angle
int ix = tid % nx;
int iy = ((tid-ix)/nx) % nx;
int iz = tid/(nx*nx);
float xptemp = (ix - nx/2 + 0.5F) * vx;
float yptemp = (iy - nx/2 + 0.5F) * vx;
float xp = xptemp * cosTheta + yptemp * sinTheta;
float yp = -xptemp * sinTheta + yptemp * cosTheta;
float zp = (iz - nz/2 + 0.5F) * vz;
// coordinate of a point in the phantom in rotated coordinate
float xs = -L1;
float ys = 0.0;
float zs = 0.0;
// coordinate of source in rotated coordinate
float x = -(ys + (yp - ys)*(L2 - xs)/(xp - xs))/PIXSIZE_X + NI_X/2;
float z = (zs + (zp - zs)*(L2 - xs)/(xp - xs))/PIXSIZE_Z + NI_Z/2;
int xi = floor(x-0.50);
int zi = floor(z-0.50);
// coordinate on the imager in unit of pixsize
float factor1 = sqrt((xp-xs)*(xp-xs)+(yp-ys)*(yp-ys)+(zp-zs)*(zp-zs))/abs(xp-xs);
float factor2 = (L1+L2)*(L1+L2)/(xp - xs)/(xp-xs);
float v00 = (x>=0 && x<=NI_X && z>=0 && zi<=NI_Z) *
d_prj3d[ind3to1(xi+(xi<0), zi+(zi<0), iproj, NI_X, NI_Z, NPROJ) ];
float v10 = (x>=0 && x<=NI_X && z>=0 && zi<=NI_Z) *
d_prj3d[ (xi+1-(xi+1>=NI_X)) + (zi+(zi<0)) * NI_X + iproj * NI_X * NI_Z];
float v01 = (x>=0 && x<=NI_X && z>=0 && zi<=NI_Z) *
d_prj3d[ xi+(xi<0) + (zi+1-(zi+1>=NI_Z)) * NI_X + iproj * NI_X * NI_Z ];
float v11 = (x>=0 && x<=NI_X && z>=0 && zi<=NI_Z) *
d_prj3d[ xi+1-(xi+1>=NI_X) + (zi+1-(zi+1>=NI_Z))*NI_X + iproj * NI_X * NI_Z ];
// obtain values at four nearest neighbors
x -= xi;
z -= zi;
float value = v00*(1-x)*(1-z) + v10*x*(1-z) + v01*(1-x)*z + v11*x*z;
// biliear interpolation
result += factor1*factor2*value;
}
dest[tid] =(result*vx*vx*vz/PIXSIZE_X/PIXSIZE_Z)/vx;
}
我的主持人电话是:
N = 256*256*217;
nblocks.x = 32768;
NTHREAD_PER_BLOCK=512;
nblocks.y = ((1 + (N - 1)/NTHREAD_PER_BLOCK) - 1) / NBLOCKX + 1;
backwardProj<<<nblocks, NTHREAD_PER_BLOCK>>>(sk, nview, d_diff3d, nx, nz, VOXSIZE_X, VOXSIZE_Z, d_sine, d_cosin, PIXSIZE_X, PIXSIZE_Z, NI_X, NI_Z, L1, L2);
cudaThreadSynchronize();
cudaError_t error = cudaGetLastError();
if(error!=cudaSuccess)
{
fprintf(stderr,"ERROR: %s\n", cudaGetErrorString(error) );
exit(-1);
}
非法内存访问与没有足够内存无关。这意味着您的代码正在尝试访问它不应该访问的内存。这意味着您的代码中存在错误。
不幸的是,你只显示了一些代码,而不是一个自包含的例子,所以对你的代码没有太多可说的。我最好的猜测是,最有可能的是,你的索引计算有问题......