CUDA:未指定的发射失败
我使用CUDA-GDB来找出内核执行的问题所在。它总是输出;Cuda错误:内核执行:未指定的启动失败。这可能是任何人都可能遇到的最严重的错误,因为没有任何迹象表明发生了什么 回到CUDA-GDB。。。当我使用调试器时,它会到达内核并输出; 断点1,myKernel(uuu-cuda_0=0x200300000,u-cuda_1=0x200400000,u-cuda_2=320,u-cuda_3=7872,uu-cuda_4=0xe805c0,uuu-cuda_5=0xea05e0,uuu-cuda_-cuda_6=0x96dfa0,uuuu-cuda_u-7=0x955680,uuu-cuda_u-8=0.0566655803723,uuuuuu-cuda=98908;, __cuda_11=18.598229033761132,___12=0.00048828125,___13=5.9604644775390625e-08) 在myFunction。cu:60 然后我会输入:next 产出; 0x00007FF7F7A790 in uuu设备uu存根uuu Z31chisquared逻辑似然u内核PDS iiP12tagCOMPLEX16S1 u S1 uu S ddddddddddd() from/home/alex/master/opt/lscsoft/lalinference/lib/liblalinference.so.3 该部分中值得注意的部分是,它有一个指向typedef'd数据类型的标记。COMPLEX16定义为:typedef双复数COMPLEX16 然后我会输入:next。 产出; 单步执行直到退出功能Z84_设备_存根_Z31; chisquared_对数似然度_内核PDS_iiP12tagCOMPLEX16S1_S_uuDDdddPDS_iiP12tagCOMPLEX16S1_S1_S_dddddd@plt, 它没有行号信息。 0x00007FF7F79560英寸??()from/home/alex/master/opt/lscsoft/lalinference/lib/liblalinference.so.3 键入下一个。。。 产出; 找不到当前函数的边界 输入continue。。。 Cuda错误:内核执行:未指定的启动失败 这是我在没有调试的情况下得到的错误。我在论坛上看到过一些类似的主题,调试器无法找到当前函数的边界,可能是因为库没有链接,或者是沿着这些线?这个之所以说是因为调试器出于某种原因位于shell的某个位置,而不是在任何函数中 我相信问题更深层的原因在于我的代码中有这些有趣的数据类型。复杂16实8 这是我的内核CUDA:未指定的发射失败,cuda,complex-data-types,Cuda,Complex Data Types,我使用CUDA-GDB来找出内核执行的问题所在。它总是输出;Cuda错误:内核执行:未指定的启动失败。这可能是任何人都可能遇到的最严重的错误,因为没有任何迹象表明发生了什么 回到CUDA-GDB。。。当我使用调试器时,它会到达内核并输出; 断点1,myKernel(uuu-cuda_0=0x200300000,u-cuda_1=0x200400000,u-cuda_2=320,u-cuda_3=7872,uu-cuda_4=0xe805c0,uuu-cuda_5=0xea05e0,uuu-cud
__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];
}
}
\uuuuuu全局\uuuuuuvoid chisquared\u loglikelization\u内核(REAL8*d\u temp,double*d\u sum,int lower,int dataSize,
COMPLEX16*freqModelhPlus_数据,
复杂16*freqModelhCross_数据,
COMPLEX16*频率数据\u数据,
REAL8*单边无电频谱数据,
双刻度,
双F交叉缩放,
双三角洲,
双双坑,
双德尔塔,
双三角帆(双三角帆)
{
int idx=blockIdx.x*blockDim.x+threadIdx.x;
__共享的REAL8 ssum[最大线程数];
if(idx0;i>>=1){/*每个块*/
//如果(tid
当我不调试(-g-g未包含在命令中)时,只有在我不包含以d_temp[idx-lower]和ssum[tid]开头的行时,内核才能正常运行。我只做了d_temp以确保它不是共享内存错误,运行正常。我还尝试使用ssum[tid]=20.0和其他各种数字类型来运行,以确保它不是那种问题,运行也很好。当我运行其中任何一个时,内核将退出,并出现上面的cuda错误
请问我是否有不清楚或混淆的地方 我的问题缺乏背景。假设我在内核执行之前已经完成了cudamaloc和其他类似的预备工作,用于所有涉及的指针。然而,我只做了d_temp和d_sum(我做了很多开关,几乎没有意识到我在做其他四个指针)。一旦我为需要的数据做了Cudamaloc和cudaMemcpy,那么一切都运行得非常完美
感谢您的见解。双精度复杂变量在库(如Cublas/Cusparse)中被广泛使用,这已经表明它们本身并不是问题。您是否有机会通过将COMPLEX16类型定义为CUDA的double2类型来检查您是否能够实现所需的行为,即,正确对齐的双精度2矢量?不是