-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_6 = 0x96dfa0、__ cuda_7 = 0 __cuda_11 = 18.598229033761132、__ cuda_12 = 0.00048828125、__ cuda_13 = 5.9604644775390625e-08)at myFunction.cu:60

次に、次のように入力します。

出力; /home/alex/master/opt/lscsoft/lalinference/lib/liblalinference.so.3の__device_stub__Z31chisquared_LogLikelihood_KernelPdS_iiP12tagCOMPLEX16S1_S1_S_dddddd()の0x00007ffff7f7a790

そのセクションの注目すべき部分は、typedefされたデータ型へのタグがあることです。COMPLEX16は次のように定義されます:typedef double complex COMPLEX16

次に、次のように入力します。出力; 行番号情報がない関数Z84_device_stub__Z31chisquared_LogLikelihood_KernelPdS_iiP12tagCOMPLEX16S1_S1_S_ddddddPdS_iiP12tagCOMPLEX16S1_S1_S_dddddd@pltを終了するまでのシングルステップ。0x00007ffff7f79560 in ?? ()/home/alex/master/opt/lscsoft/lalinference/lib/liblalinference.so.3から

next...outputと入力します。現在の関数の境界が見つかりません

「continue...」と入力します。Cudaエラー:カーネルの実行:不特定の起動エラー。

これは、デバッグせずに取得するエラーです。デバッガーが現在の関数の境界を見つけることができない類似したものに関するいくつかのフォーラムトピックを見たことがあります。おそらく、ライブラリが何らかの形でリンクされていないか、それらの線に沿ったものであるためですか??? デバッガーが何らかの理由でシェルであり、機能していないためと言われていました。

問題は、コードにこれらの興味深いデータ型があるという事実にあると思います。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 に対してしかそれを行っていませんでした (私は大量のスイッチを作成していましたが、他の 4 つのポインターを作成していることにほとんど気づきませんでした)。必要なデータに対して cudaMalloc と cudaMemcpy を実行すると、すべてが完全に実行されました。

洞察をありがとう。

于 2012-07-14T03:59:03.227 に答える