Matrix &引用;CudaLaunch返回(0x9)“;,以及节目时间安排问题

Matrix &引用;CudaLaunch返回(0x9)“;,以及节目时间安排问题,matrix,cuda,gpu,timing,Matrix,Cuda,Gpu,Timing,我写了一个CUDA程序,关于这个程序我有两个问题 当我调用内核函数时,我知道block\u len必须是1024。当我使用cuda gdb和Nsight进行调试时,出现了预期的“cudaLaunch returned(0x9)”错误。如果我在没有调试的情况下运行程序,程序运行平稳,计算结果与使用CPU时相同(没有并行性),这表明我的计算是正确的。为什么错误的程序可以得到正确的结果 dim3 dimBlock(length, length); dim3 dimGrid(1, 1); float

我写了一个CUDA程序,关于这个程序我有两个问题

  • 当我调用内核函数时,我知道block\u len必须是1024。当我使用cuda gdb和Nsight进行调试时,出现了预期的“cudaLaunch returned(0x9)”错误。如果我在没有调试的情况下运行程序,程序运行平稳,计算结果与使用CPU时相同(没有并行性),这表明我的计算是正确的。为什么错误的程序可以得到正确的结果

  • dim3 dimBlock(length, length);
    dim3 dimGrid(1, 1);
    
    float a2;
    cudaEvent_t t1, t2;
    cudaEventCreate(&t1);
    cudaEventCreate(&t2);
    
    cudaEventRecord(t1, 0);
    kernel<<<dimGrid, dimBlock>>>(dev_d, dev_D);
    cudaEventRecord(t2, 0);
    
    cudaEventSynchronize(t1);
    cudaEventSynchronize(t2);
    cudaEventElapsedTime(&a2,t1,t2);
    printf("kernel time: %f (ms)\n",a2);
    

  • 程序将计算一个长度*长度矩阵A,A的每个元素的计算由一个线程完成,ngridDim设置为(1,1)。当长度时,应提供完整的代码。然而:

  • 可能是上一次运行的正确结果仍在内存中。当您设置
    length
    >32时,您将非法启动内核,并且您的内核将不会运行或产生任何结果。您可以通过在内核启动之前清除输出数据来确认这一点。例如,如果
    dev\u D
    包含内核的输出,则执行如下操作:

    cudaMemset(dev_D, 0, length*length*sizeof(dev_D[0]));
    kernel<<<dimGrid, dimBlock>>>(dev_d, dev_D);
    
    cudaMemset(dev_D,0,length*length*sizeof(dev_D[0]);
    内核(dev_d,dev_d);
    
    如果这样做,内核无法运行,那么在
    dev\u D
    中肯定会得到0,而不是预期的结果

  • length
    参数大于32时,每个块请求的线程数超过1024个,这在CUDA中是非法的。因此内核不运行(如果您想确认这一点,请使用适当的CUDA错误检查。)当内核不运行时,测得的启动时间比内核运行时要短得多


  • 我证实了你的说法,你的回答是正确的。多谢各位。
        kernel time: 37.341919 (ms)
    
        kernel time: 0.004128 (ms)
    
    cudaMemset(dev_D, 0, length*length*sizeof(dev_D[0]));
    kernel<<<dimGrid, dimBlock>>>(dev_d, dev_D);