我正在尝试在 Nvidia GPU(Tesla K20c)上运行 MJPEG 解码器的 OpenCL 代码。我问了其他stack exchange 网站上有关于在 GPU 上实现解码器的信息,我现在正试图计算在 Tesla K20c 上运行的每个单独的 OpenCL 内核的功耗。 (我已经将 4 个连续的 C 函数,即 iqzz、IDCT、上采样和颜色转换翻译成 OpenCL 内核)。
我一直用nvidia-smi
它来检查运行 OpenCL 代码时 GPU 的功耗。当没有运行任何代码时,K20c 的空闲功耗为 17 W。
我使用以下方法来检查每个内核的功率:
为了计算特定 OpenCL 内核的功耗,我一直在注释掉其余的 OpenCL 内核,并让其等效的 C 版本代替它们运行。我这样做是为了让代码正确运行。因此,当我想运行另一个 OpenCL 内核时,我会激活(取消注释)其他内核的单线程 C 版本。
我想要以上述方式检查的每个内核的功率都集中在约 49 W 至 55 W 的范围内。用于上采样功能的内核消耗的功率最多(55 W)。
此外,我相信如果我在 GPU 上同时运行所有 OpenCL 内核,则总功耗值应该是我单独运行每个内核时得到的值的总和。相反,当我同时运行所有内核时,总功耗竟然达到了 54.83 W!功耗甚至比内核进行上采样所消耗的功耗还要低。
您对正确计算我的 OpenCL 代码中每个内核所消耗的电量有什么建议吗?大多数研究论文(如这一)提到了一些花哨的技术,例如将探针连接到 PCI 总线、CPU 和 GPU。然而,我有一个封闭的系统而且我无法用物理方法来测量功率。
添加:
printf
当我向我的一个内核添加语句时,GPU 的利用率达到了 98% 。
答案1
nvidia-smi
正在返回整个 GPU 的功耗信息,我认为这无法提供您想要的粒度。
在这种情况下,“单个内核”的功耗没有多大意义;GPU 将处于开启状态并消耗一些不管您运行什么,它都会消耗大量的电量。(这个数字应该是您的功耗基准。)
- 你引用的 54.83W 数字意味着你的内核正在消耗较少的功率高于上采样,这是有道理的,因为上采样是一项成本很高的操作,很容易就会多消耗 170 mW 的功率。
(17W 的空闲测量值具有误导性,因为芯片组可能处于某种 ACPI 挂起状态,其中芯片的各个部分完全关闭,从而允许“异常”低功耗,这是在任何类型的内核运行下都无法达到的。)