【问题标题】:"CudaLaunch returned (0x9)", and program timing issues“CudaLaunch 返回 (0x9)”,以及程序计时问题
【发布时间】:2018-08-09 05:56:08
【问题描述】:

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

  1. 当我调用内核函数的时候,我知道block_len一定是block_len em>> 1024. 当我使用 cuda-gdb 和 Nsight 进行调试时,出现预期的“cudaLaunch 返回 (0x9)”错误。如果我在没有debug的情况下运行程序,程序运行流畅,计算结果和使用CPU一样(没有并行),说明我的计算是正确的。为什么错误的程序能得到正确的结果?

  2. 程序会计算出一个length * length矩阵A,A的每个元素的计算由一个线程完成,ngridDim设置为(1,1) .当length 的执行时间

    kernel <<< (1,1), (length, length) >>> 
    

    根据长度的大小规律变化。当length> 32时,内核花费的时间突然减少了100-1000倍。我首先怀疑我的计时码是错误的,但检查后,我认为没有错误。后面我会附上计时码,是什么原因造成的?

    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);
    

如果length=32,内核时间为:

    kernel time: 37.341919 (ms)

如果length=33,内核时间为:

    kernel time: 0.004128 (ms)

我的设备的一些信息:

【问题讨论】:

    标签: matrix cuda gpu timing


    【解决方案1】:

    您应该提供完整的代码。然而:

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

      cudaMemset(dev_D, 0, length*length*sizeof(dev_D[0]));
      kernel<<<dimGrid, dimBlock>>>(dev_d, dev_D);
      

      如果你这样做了,但内核无法运行,你肯定会在dev_D 中得到 0 而不是预期的结果。

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

    【讨论】:

    • 我确认了你所说的方式,你的回答是正确的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2021-10-12
    相关资源
    最近更新 更多