gpt4 book ai didi

opencv - 如何解决 OS X 中 CUDA 代码的 GPU 看门狗计时器限制

转载 作者:太空宇宙 更新时间:2023-11-03 23:00:25 24 4
gpt4 key购买 nike

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

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

最佳答案

在使用 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 函数之前实际调用一些 native CUDA(如 cudaSetDevice)函数。

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

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

关于opencv - 如何解决 OS X 中 CUDA 代码的 GPU 看门狗计时器限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19632401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com