1

如果我使用 nsight cuda 分析器或直接从终端运行它,我有一个运行良好的 Cuda 内核。但是如果我使用这个命令

cuda-memcheck --leak-check full ./CudaTT 1 ../../file.jpg 

它因“未指定的启动失败”而崩溃。我在每个内核代码之后都使用它。

e=cudaDeviceSynchronize();

if (e != cudaSuccess) printf("Fail in kernel 2 %s",cudaGetErrorString(e));

并且 cuda-memcheck 显示了其中的几个

========= Program hit error 4 on CUDA API call to cudaDeviceSynchronize 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/libcuda.so [0x24e129]
=========     Host Frame:/usr/local/cuda-5.0/lib/libcudart.so.5.0 (cudaDeviceSynchronize + 0x214) [0x27e24]
=========
========= Program hit error 4 on CUDA API call to cudaFree 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/libcuda.so [0x24e129]
=========     Host Frame:/usr/local/cuda-5.0/lib/libcudart.so.5.0 (cudaFree + 0x228) [0x338b8]

最后它显示

========= LEAK SUMMARY: 0 bytes leaked in 0 allocations
========= ERROR SUMMARY: 10 errors

知道为什么会这样吗?

编辑:

我注释掉了另一个由于有很多寄存器而没有启动的内核,现在上面的内核上的错误现在发生了变化,它说:“启动超时并被终止”。它再次在 cuda 分析器上运行正常,并且在终端上没有 cuda-memcheck 但是当使用 cuda-memcheck 时它显示了这个

========= Program hit error 6 on CUDA API call to cudaDeviceSynchronize 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/libcuda.so [0x24e129]
=========     Host Frame:/usr/local/cuda-5.0/lib/libcudart.so.5.0 (cudaDeviceSynchronize + 0x214) [0x27e24]
=========
========= Program hit error 6 on CUDA API call to cudaFree 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/libcuda.so [0x24e129]
=========     Host Frame:/usr/local/cuda-5.0/lib/libcudart.so.5.0 (cudaFree + 0x228) [0x338b8]
=========     Host Frame:[0xbf913ea8]

最后还是同样的10个错误

========= LEAK SUMMARY: 0 bytes leaked in 0 allocations
========= ERROR SUMMARY: 10 errors

错误 6 似乎是由于内核超时持续时间过长,但是如果没有 cuda-memcheck,它是如何工作的?在分析器上,它显示内核持续了 3.771 秒。

另一个奇怪的行为是我在计算后打印了一些值。如果我使用 cuda-memcheck 与不使用,值会有所不同。

4

2 回答 2

2

更好的链接是http://docs.nvidia.com/cuda/cuda-memcheck/index.html。Cuda-memcheck 可以而且确实会改变应用程序的 CUDA 内核的运行时间。如果 GPU 用于显示,则存在看门狗超时,以防止内核的运行时间超过固定边界(在 Linux 上,这通常为约 5 秒)。鉴于未检测的内核需要 3.7 秒,很可能由 memcheck 运行的内核的修改版本实际上超过了看门狗,因此内核启动超时。在这种情况下有几个选择:

  1. 在未启动 X 的系统上运行
  2. Option "Interactive" "off"使用in以非交互模式启动 X 服务器/etc/X11/xorg.conf。请注意,在此模式下,显示不会在 CUDA 内核运行时更新。
于 2013-07-11T04:52:08.963 回答
0

使用 cuda-memcheck 似乎内核启动速度要慢得多

people.maths.ox.ac.uk/gilesm/cuda/doc/cuda-memcheck.pdf

第 16 页

“应用程序在 CUDA-MEMCHECK 下运行速度要慢得多。在启用 CUDA-MEMCHECK 的情况下运行时,这可能会导致某些内核启动失败并出现启动超时错误。”

于 2013-07-10T00:09:06.433 回答