1

我目前正在使用运行 openCV GPU/CUDA 代码的 OS X 10.9 开发 rMBP。我更具体地使用 BruteForceMatcher_GPU knnMatchSingle/knnMatch 功能。在 GPU 计算 5 秒后,OSX 覆盖并终止程序,这是一个众所周知的恢复过程,以避免 OSX 的 launchd 或 NVIDIA GPU 驱动程序导致屏幕冻结。Windows 和 Linux 允许关闭 GPU 看门狗定时器,但 OSX 不允许,这可能是有道理的。无论如何,我的问题是,是否可以在 openCV 中保存 GPU 内存状态并在一定延迟后恢复它,从而克服看门狗定时器的限制?如果没有,关于如何解决 OSX 的 GPU 看门狗计时器的任何其他想法?非常感谢

PS:我已经安装了 gfxCardStatus 2.3 可以看到显卡之间的切换。

4

1 回答 1

1

在使用过 OpenCV GPU 模块和低级 CUDA 编程后,我也遇到了这个问题。简短的回答是否定的——你不能像通过 Windows 中的注册表项那样绕过看门狗计时器——或者更确切地说——即使我在各种 CUDA 开发论坛上尝试了一些建议,我也从未找到这样做的方法。

由于 NVidia GPU 的 GPU 架构,因此无法保存 GPU 状态。通常,要在 GPU 上计算任何内容,您需要在 CPU 上初始化数据并将其保存在 RAM 中,将数据复制到 GPU 内核可以访问的 GPU 全局内存中,进行计算,将结果保存在全局内存中,然后将其复制回 CPU / RAM,CPU 可以在其中访问结果,并且您的内核终止释放所有数据。当看门狗定时器启动时,内核被终止并且您的所有数据都丢失了。

所以从技术上讲 - 要解决这个问题,只有两种可能的解决方案:一种解决方法是只执行少于 5 秒计时器(或系统上的任何计时器)的 GPU 计算,将中间结果保存到 CPU /RAM,并启动一个新内核,下一个数据在队列中等待。你一直这样做,直到你完成。但是,这会对您的性能产​​生很大影响,因为您首先必须拆分数据,正确排队,并将数据多次复制到 GPU 或从 GPU 复制数据 - 因此,根据您的数据,您可能会损失很多性能。

另一种解决方案是安装两个专用 GPU - 一个用作系统 GPU,另一个在您告诉它时坐在那里处理数字。至少在 Windows 和 Linux 上,这可以完美地工作,而无需禁用看门狗计时器。我不知道 OSX 是否同样适用,因为我没有在 Mac 上使用多个 CUDA GPU 的经验。CUDA 公开了一个功能,您可以在其中手动设置要使用的设备:

http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group__CUDART__DEVICE_g418c299b069c4803bfb7cab4943da383.html

默认 GPU 始终为索引 0,根据我的经验,它是您的系统设置为当前显示设备的那个。因此,将索引设置为 1 将使用您的系统当前未使用的 GPU(请注意,我不确定 SLI 设置中的行为是否相同)。比如我用来测试的Windows机器有一个8800GT作为显示设备,侧面有一个TESLA C2075。两者都支持 CUDA,因此手动将 TESLA 设置为 CUDA 设备(索引 1),这意味着显示设备永远不会冻结 - 因此看门狗永远不会启动。同样的情况发生在我的带有 GTX680/TESLA k20C 组合的 linux 机器上。

值得注意的是,cudaSetDevice 只知道 CUDA 设备——所以如果你有一个集成的 GPU 或 AMD GPU 和你的 Nvidia 卡,那么你不能用 cudaSetDevice 在它们之间进行更改。它将始终使用您启用 CUDA 的设备,或者完全失败。据我所知,没有 cv::gpu:cudaSetDevice 所以我不知道您是否可以将此函数与您的 OpenCV 代码一起调用。如果您使用的是 C 而不是 C++,您可能可以使用 NVCC 编译器并在 OpenCV 函数之前实际调用一些本机 CUDA(如 cudaSetDevice)函数。

但是,使用 OpenCV,您对 CUDA 代码中发生的事情的控制要少得多(与编写自己的内核相比),并且可能无法实际拆分数据并仍然获得令人满意的结果。在那种情况下,我认为您的问题没有解决方案。最重要的是,OSX 喜欢根据 MacBook Pro 上的当前工作负载在多个 GPU 之间切换。

当我在我的 MacBook Pro 上遇到这个问题时,我在我的训练营中安装了 Windows 7 以及 VS2010 和 CUDA 工具包,禁用了看门狗定时器并完美运行它。这不是一个完美的解决方案,但至少它允许我在将 CUDA 代码部署到我的测试服务器之前在本地开发它。

于 2013-12-01T18:19:41.317 回答