CUDA:未指定的发射失败

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

我使用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

这是我的内核

__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矢量?不是