“CudaLaunch返回(0x9)”,以及程序计时问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“CudaLaunch返回(0x9)”,以及程序计时问题相关的知识,希望对你有一定的参考价值。
我写了一个CUDA程序,我有两个关于这个程序的问题。
- 当我调用内核函数时,我知道block_len必须<= 1024,但我仍然设置block_len> 1024.当我用cuda-gdb和Nsight调试时,有一个预期的“cudaLaunch返回(0x9)”错误。如果我在没有调试的情况下运行程序,程序运行平稳,计算结果与使用CPU(没有并行性)相同,表明我的计算是正确的。为什么错误的程序可以得到正确的结果?
- 程序将计算长度*长度矩阵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) ",a2);
如果length = 32,则内核时间为:
kernel time: 37.341919 (ms)
如果length = 33,则内核时间为:
kernel time: 0.004128 (ms)
我的设备的一些信息:
答案
您应该提供完整的代码。然而:
- 可能是正确的结果仍然在前一次运行的内存中。当您设置
length
> 32时,您将启动非法内核,并且您的内核将无法运行或产生任何结果。您可以通过在内核启动之前清除输出数据来确认这一点。例如,如果dev_D
包含内核的输出,那么执行以下操作:cudaMemset(dev_D, 0, length*length*sizeof(dev_D[0])); kernel<<<dimGrid, dimBlock>>>(dev_d, dev_D);
如果你这样做,并且内核无法运行,你肯定应该在dev_D
中得到0而不是预期的结果。 - 当
length
参数大于32时,您要求每个块超过1024个线程,这在CUDA中是非法的。因此内核不运行(如果要确认这一点,请使用正确的CUDA错误检查。)当内核不运行时,测量的启动时间比内核运行时短得多。
以上是关于“CudaLaunch返回(0x9)”,以及程序计时问题的主要内容,如果未能解决你的问题,请参考以下文章
我应该参考哪个单位的宽度以及我应该使用啥单位进行响应式设计? (非自适应设计)
python中sort命令介绍以及list结构中统计各元素出现的个数的方法
模板计几旋转坐标(用于最小三角形以及三角形四边形面积存在性问题)