来自 CUDA 代码的 100% GPU 使用率导致屏幕滞后

Posted

技术标签:

【中文标题】来自 CUDA 代码的 100% GPU 使用率导致屏幕滞后【英文标题】:100% GPU usage from CUDA code makes screen lag 【发布时间】:2018-08-19 07:02:12 【问题描述】:

我有一些 pyCUDA 代码可以使 GPU 保持 100% 的使用率,并且似乎将 GPU 占用到我的屏幕仅每秒更新一次的程度。 更改块和网格大小没有帮助。 网格中的每个线程循环大约 130 万次,大约只有 6 个块,每块 16 个线程。如果我把它做成一个小循环,那没有问题,但不幸的是它必须那么大,而且我看不到将工作分配到更多块中的好方法。 有没有办法限制我的程序的 GPU 使用率,或者改变屏幕的优先级? Windows 上的 GTX 1060。

【问题讨论】:

"只有大约 6 块 16 线程" 这对 GPU 的使用非常低效。你没有提到这是Windows还是Linux。目前没有办法强制在 Windows WDDM GPU(或 linux 显示 GPU)上运行长时间运行的内核被抢占以允许显示任务继续进行。你需要推动那些你说你不能做的事情之一。或者,获取另一个 GPU,它可以在 Windows 上以 TCC 模式放置(或者任何 GPU 在 linux 上应该都可以)并在不处理 CUDA 任务的 GPU 上运行您的显示器。 我很确定,只要 GPU 使用率为 100%,将工作拆分得更多不会让事情变得更快。如果有的话,速度会慢一些。我正在使用带有 GTX 1060 的 Windows 10 您可以使用内核using a single thread 获得 100% 的使用率。这并没有说明正在运行的内核使用 GPU 的效率如何。将低效代码转换为高效代码当然可以在更短的时间内完成相同的工作。并且 96 个总线程不会有效地使任何 GPU 饱和。这比为 GPU 提供足够的并行工作以隐藏延迟的阈值低约 2 个数量级。 它比 CPU 上完全相同的代码快大约 300 倍,我也没有办法分解它。所以我想我可以解决这个问题 您总是可以得到第二张 GPU 卡...或者使用所有现代 CPU 都具有的集成 GPU 进行显示。 【参考方案1】:

有没有办法限制我的程序的 GPU 使用率,或者改变 屏幕的优先级?

总之,没有。

GPU 无法同时运行计算作业和刷新显示。没有优先级的概念。如果您有长时间运行的计算代码,它将阻止显示刷新,并且该块的持续时间由计算代码确定。驱动程序只有一种抢占机制,那就是看门狗定时器,它将终止显示设备上长时间运行的计算活动。

如果您在计算操作期间需要屏幕响应能力,要么大大减少单个内核启动的运行时间,要么获得第二个 GPU,其中一个专用于计算工作,一个用于显示。

【讨论】:

关于“大大减少单个内核启动的运行时间”:尝试扩展每个内核的工作,使内核在使用的最慢 GPU 上的执行时间为 200 毫秒或更短。这样,GUI 应该会感觉响应。

以上是关于来自 CUDA 代码的 100% GPU 使用率导致屏幕滞后的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 代码使两个 GPU “忙”

多 GPU 分析(多个 CPU,MPI/CUDA 混合)

Cuda 中的多个 GPU - 以前可以工作的代码,但现在不行了

GPU cuda代码可以在多个GPU卡上运行而无需任何实现吗?

在 Ubuntu 20.4 LTS 上使用 GPU (CUDA-11.0) 运行代码时的 TensorFlow 问题

Cuda 内核代码驻留在英伟达 GPU 上的啥位置?