我正在使用 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) 在 myFunction.cu:60
然后我会输入:下一个。
输出; __device_stub__Z31chisquared_LogLikelihood_KernelPdS_iiP12tagCOMPLEX16S1_S1_S_dddddd () 中的 0x00007ffff7f7a790 来自 /home/alex/master/opt/lscsoft/lalinference/lib/liblalinference.so.3
该部分中值得注意的部分是它有一个 typedef 数据类型的标签。COMPLEX16 定义为:typedef double complex COMPLEX16
然后我会输入:下一个。输出; 单步执行直到从函数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
输入下一个...输出;找不到当前函数的边界
键入 continue... 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 错误退出。
请问我是否有不清楚或令人困惑的地方。