-1

我正在使用 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 错误退出。

请问我是否有不清楚或令人困惑的地方。

4

1 回答 1

1

我的问题在这里缺乏背景。假设可能是我在内核执行之前为所有涉及的指针完成了 cudaMalloc 和其他类似的初步工作。然而,我只对 d_temp 和 d_sum 做了这件事(我做了很多开关,几乎没有意识到我在做其他四个指针)。一旦我为所需的数据执行了 cudaMalloc 和 cudaMemcpy,那么一切都运行得很好。

感谢您的洞察力。

于 2012-07-14T03:59:03.227 回答