我使用nvprof和nvidia-smi分别监控GPU功耗,但观察到不同的结果,总结在下表中。
----------------------------------------------------------------
gpu | busy | idle
model | nvprof[Watt] smi[Watt] | nvprof[Watt] smi[Watt]
----------------------------------------------------------------
M2090 | ~151 ~151 | ~100 ~75
K20 | ~105 ~102 | ~63 ~43
----------------------------------------------------------------
注意0:“忙”表示我的代码在受监控的GPU上运行
注1:nvprof报告所有设备的电量。因此,使用nvprof为特定GPU获取“空闲”功能的方法就是让代码在另一个GPU上运行。
注2:nvidia-smi报道了几个关于功率的不同数量,但我专注于“功耗”
注3:cuda版本:5.5
所以我的问题是:为什么nvidia-smi报告的功率通常小于nvprof,为什么在监视空闲功率时这种差异会变大?最后,我应该更信任哪个实用程序?
另外,为了确保两个实用程序测量的功率是指输入电功率(P = I * U)而不是输出功率,对吗?
非常感谢任何建议!
更新 @njuffa和@talonmies的推测非常有道理。所以我对功率分析进行了更多的探索。然而,结果对我来说没有意义。
补充说明:
红色数据的不连续性是因为我直接使用了 smi报告的时间戳,分辨率低(秒)。除了, 为了说明的目的,为p0分配数值20和 因此,在大多数情况下,GPU已经完全投入使用 性能状态(这是奇数),除了“忙”情况,GPU以某种方式 在15~18s内下降到p1(奇数)。
直到~21.3s才调用cudaSetDevice() 第一次。因此,功率上升和p态变化发生在〜18s 相当奇数。
“忙碌功率”, 并且smi进入无限循环以查询功率和p状态 反复进行,直到后台进程终止。 “闲置的力量”是 简单地通过启动smi 50次来测量。显然在后者 例如,smi表现出更大的开销,这又是奇数。
答案 0 :(得分:1)
忽略p状态。他们让你很困惑。
nvprof(单独)比使用nvidia-smi(单独)使用更多的GPU。因此,运行nvprof时消耗的“空闲”功率高于仅执行nvidia-smi时所消耗的功率。 nvprof在GPU上启动了许多引擎,而nvidia-smi只是启动了一些寄存器,可能还有一些I2C电路。
GPU具有多个p状态,并且真正的空闲p状态是P8或更低(即更大)。
运行nvidia-smi可以(经常会)将GPU的p状态从“真正的空闲”P状态简单地提升到更高的状态,如P0。这不告诉你: - p状态升高发生多长时间(nvidia-smi的采样周期过于粗糙) - 实际消耗了多少电量。是的,p-state是一个指标,但不会以校准的方式告诉你任何事情。在P0时,GPU可以或多或少地“空闲”(例如,将GPU置于持久模式)。
已经解释了两次测量之间的差异。图表和其他更新没有任何有用的用途,只会让您感到困惑。
如果您想测量功率,请使用任一方法。很明显,它们与GPU“忙碌”的情况非常相关,而且它们在“空闲”情况下看起来不同的事实只是意味着你在两种情况下都做出了关于“空闲”的假设,这些都不是真的