“CudaLaunch返回(0x9)”,以及程序计时问题

问题描述 投票:1回答:1

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

  1. 当我调用内核函数时,我知道block_len必须<= 1024,但我仍然设置block_len> 1024.当我用cuda-gdb和Nsight调试时,有一个预期的“cudaLaunch返回(0x9)”错误。如果我在没有调试的情况下运行程序,程序运行平稳,计算结果与使用CPU(没有并行性)相同,表明我的计算是正确的。为什么错误的程序可以得到正确的结果?
  2. 程序将计算长度*长度矩阵A,A的每个元素的计算由一个线程完成,ngridDim设置为(1,1)。当长度<32时,执行时间为 kernel <<< (1,1), (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
投票

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

  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错误检查。)当内核不运行时,测量的启动时间比内核运行时短得多。
© www.soinside.com 2019 - 2024. All rights reserved.