我正在使用CUDA-GDB来找出我的内核执行问题。它总会输出; Cuda错误:内核执行:未指定的启动失败。这可能是任何人都可能得到的最严重的错误,因为没有任何迹象表明发生了什么!
回到CUDA-GDB ......当我使用调试器时,它会到达内核并输出; 断点1,MYKERNEL(__cuda_0 = 0x200300000,__cuda_1 = 0x200400000,__cuda_2 = 320,__cuda_3 = 7872,__cuda_4 = 0xe805c0,__cuda_5 = 0xea05e0,__cuda_6 = 0x96dfa0,__cuda_7 = 0x955680,__cuda_8 = 0.056646065580379823,__cuda_9 = -0.0045986640087569072,__cuda_10 = 0.125, __cuda_11 = 18.598229033761132,__ cuda_12 = 0.00048828125,__ cuda_13 = 5.9604644775390625e-08) at myFunction.cu:60
然后我会输入:next。
输出; __device_stub__Z31chisquared_LogLikelihood_KernelPdS_iiP12tagCOMPLEX16S1_S1_S_dddddd()中的0x00007ffff7f7a790 来自/home/alex/master/opt/lscsoft/lalinference/lib/liblalinference.so.3
该部分中值得注意的部分是它具有typedef'd数据类型的标记。 COMPLEX16定义为:typedef double complex COMPLEX16
然后我会输入:next。 输出; 单步执行直到退出函数 Z84 _device_stub__Z31chisquared_LogLikelihood_KernelPdS_iiP12tagCOMPLEX16S1_S1_S_ddddddPdS_iiP12tagCOMPLEX16S1_S1_S_dddddd @ plt, 没有行号信息。 0x00007ffff7f79560在? ()来自/home/alex/master/opt/lscsoft/lalinference/lib/liblalinference.so.3
键入下一个... 输出; 找不到当前函数的界限
输入继续... Cuda错误:内核执行:未指定的启动失败。
没有调试我得到的错误是什么。我已经看到一些类似于调试器无法找到当前函数边界的类似论坛主题,可能是因为库在某种程度上没有链接或沿着这些行的某些东西? ?? ??据说因为某些原因而调试器在某个地方是shell而不是在任何函数中。
我认为问题更深层的是我的代码中有这些有趣的数据类型。 COMPLEX16 REAL8
这是我的内核......
__global__ void chisquared_LogLikelihood_Kernel(REAL8 *d_temp, double *d_sum, int lower, int dataSize,
COMPLEX16 *freqModelhPlus_Data,
COMPLEX16 *freqModelhCross_Data,
COMPLEX16 *freqData_Data,
REAL8 *oneSidedNoisePowerSpectrum_Data,
double FplusScaled,
double FcrossScaled,
double deltaF,
double twopit,
double deltaT,
double TwoDeltaToverN)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
__shared__ REAL8 ssum[MAX_THREADS];
if (idx < dataSize)
{
idx += lower; //accounts for the shift that was made in the original loop
memset(ssum, 0, MAX_THREADS * sizeof(*ssum));
int tid = threadIdx.x;
int bid = blockIdx.x;
REAL8 plainTemplateReal = FplusScaled * freqModelhPlus_Data[idx].re
+ freqModelhCross_Data[idx].re;
REAL8 plainTemplateImag = FplusScaled * freqModelhPlus_Data[idx].im
+ freqModelhCross_Data[idx].im;
/* do time-shifting... */
/* (also un-do 1/deltaT scaling): */
double f = ((double) idx) * deltaF;
/* real & imag parts of exp(-2*pi*i*f*deltaT): */
double re = cos(twopit * f);
double im = - sin(twopit * f);
REAL8 templateReal = (plainTemplateReal*re - plainTemplateImag*im) / deltaT;
REAL8 templateImag = (plainTemplateReal*im + plainTemplateImag*re) / deltaT;
double dataReal = freqData_Data[idx].re / deltaT;
double dataImag = freqData_Data[idx].im / deltaT;
/* compute squared difference & 'chi-squared': */
double diffRe = dataReal - templateReal; // Difference in real parts...
double diffIm = dataImag - templateImag; // ...and imaginary parts, and...
double diffSquared = diffRe*diffRe + diffIm*diffIm ; // ...squared difference of the 2 complex figures.
//d_temp[idx - lower] = ((TwoDeltaToverN * diffSquared) / oneSidedNoisePowerSpectrum_Data[idx]);
//ssum[tid] = ((TwoDeltaToverN * diffSquared) / oneSidedNoisePowerSpectrum_Data[idx]);
/***** REDUCTION *****/
//__syncthreads(); //all the temps should have data before we add them up
//for (int i = blockDim.x / 2; i > 0; i >>= 1) { /* per block */
// if (tid < i)
// ssum[tid] += ssum[tid + i];
// __syncthreads();
//}
//d_sum[bid] = ssum[0];
}
}
当我没有调试(-g -G没有包含在命令中)时,如果我不包含以d_temp [idx - lower]和ssum [tid]开头的行,内核只能正常运行。我只做d_temp以确保它不是共享内存错误,运行正常。我也试过用ssum [tid] = 20.0和其他各种数字类型来运行,以确保它不是那种问题,也运行得很好。当我运行其中任何一个包含然后内核退出上面的cuda错误。
如果有什么不清楚或令人困惑,请问我。
答案 0 :(得分:1)
我的问题在这里缺乏背景。假设可能是我在内核执行之前为所有涉及的指针做了cudaMalloc和其他这样的初步事情。但是我只对d_temp和d_sum做过(我正在制作大量的开关,几乎没有意识到我正在制作其他四个指针)。一旦我为所需的数据做了cudaMalloc和cudaMemcpy,那么一切都运行得很好。
感谢您的见解。