如何确定某个进程所使用的 GPU 核心数量?

如何确定某个进程所使用的 GPU 核心数量?

我们知道,如果CPU有4个核心,那么最大利用率就是400%,如果总利用率是200%,那么就会被分析为4个核心中,有2个核心被占用了。

因此,对于 GPU 来说,最大利用率是 100%,如果总利用率是 80%,那么如何分析已利用了多少个核心?

对于 nvidia 显卡,可以使用 nvidia-smi 来查看 nvidia GPU 利用率。

对于英特尔显卡,可以使用 intel_gpu_time/intel-gpu-top 来查看 iGPU 利用率。

但是它们都没有显示正在使用的 GPU 核心数量。有什么办法吗?

我使用的是 Linux。Ubuntu 14.04 和 Centos 7.2

答案1

在 GPU 上,100% 利用率意味着所有核心基本上都在执行指令。当所有这些指令都是融合乘加运算时,它以最佳性能运行:a = a + b * c,大多数当前 GPU 仅使用一条指令即可完成此操作。

当你编写一个在 GPU 上执行计算的程序时(使用 CUDA 或 OpenCL),你会将工作分配到所谓的线程块网格中(CUDA 术语)。GPU 负责调度所有这些线程(以 32 个线程的“warp”为单位),以保持所有 GPU 核心忙碌。我不知道你对这个主题有多熟悉,但介绍可能会很有趣。

举个例子来解释这与利用率的关系。假设 GPU 处于空闲状态,然后您启动一个应用程序,该应用程序仅为单个线程块启动一个内核,但该块内有足够的计算。GPU 会将线程块调度到 GPU 上的流式多处理器(SM = 128 个内核的组)之一上。例如,对于具有 20 个 SM 的 Nvidia GTX 1080,这将导致利用率仅为 (1/20 * 100%) = 5%。

有了这些 GPU 计算的基本知识,你可以通过Nvidia 可视化分析器(对于 CUDA 应用程序)或通过 CodeXL(对于 OpenCL 应用程序)查看应用程序用来推断 GPU 利用率的任何内核的线程配置。但这还不是全部,此工具对于准确查看 GPU 正在执行的操作类型(以及效率)非常有用。

相关内容