TensorFlow 显存占用率高 GPU利用率低

nvidia-smi指令

命令位置:
在这里插入图片描述
所以Path中添加环境变量:
C:\Program Files\NVIDIA Corporation\NVSMI
试验一哈:
在这里插入图片描述
要注意的点:

  • Driver Version和CUDA Version不是一回事
  • CUDA Version实际是环境变量中Path配置的,如果一台机器同时装了多个CUDA,那么这里的CUDA Version显示的是Path中靠前的CUDA版本(和nvcc -V的显示是一样的)
  • 下方的GPU使用信息网上有很多资料,但是比较靠谱的资料是去官网查手册,这里不再赘述,只挑几个比较重要的说一下:
  1. Temp = Temperature,温度
  2. Perf = Performance,性能,P0-P12,由低到高
  3. Memory / Usage ,其实下方的数据是“已经使用的显存/总显存”
  4. GPU-Util,GPU使用率
  • 下方的Processes显示的使用GPU的线程信息:GPU序号,线程ID,线程名,GPU显存使用量
  • N/A可以
### 解析 GPU 显存占用与利用率的关系 当应用程序运行时,即使没有活跃的计算任务(即 GPU 利用率为零),仍然可能存在显存占用的情况。这是因为程序可能已经分配了内存用于存储数据或中间结果,而这些资源尚未被释放。 具体来说,在 CUDA 编程环境中,调用 `cudaMalloc` 函数会请求一块设备端内存空间[^1]。一旦这块内存被成功申请并初始化完毕之后,它就会一直存在于显卡内部直到显式地通过 `cudaFree` 来回收该部分资源为止。因此在这段时间里,尽管没有任何实际运算发生,这部分已分配出去却未使用的显存量依旧会被统计到总消耗当中去。 另一方面,关于 GPU 的“利用率”,通常是指执行单元如流式多处理器 (SMs) 被有效利用的程度。正如所提到的那样,如果只有一个线程在一个 SM 上工作,则对于整个 GPU 设备而言其整体利用率可能会非常——例如仅达到 1/SM 数量的比例。然而这并不影响之前已经被锁定下来的那部分显存容量;也就是说,即便此时此刻所有的核心都处于闲置状态,早先预留出来的那一份物理地址范围还是继续保留着不变的状态。 综上所述,可以得出结论说:**存在 GPU 显存占用但无 GPU 利用率的现象是因为虽然当前没有正在进行中的计算活动使得硬件设施得到充分利用,但是先前由应用层面上发起过的某些操作确实占用了必要的缓冲区或其他形式的工作集从而造成了持续性的内存负担**。 ```cpp // 示例代码展示如何分配和释放 GPU 内存而不触发任何计算任务 #include <iostream> #include <cuda_runtime.h> int main() { size_t bytes = 1 << 20; // 分配 1MB 大小的显存 float* d_x; cudaError_t err; // 分配显存 err = cudaMalloc((void**)&d_x, bytes); if (err != cudaSuccess){ std::cerr << "CUDA malloc failed!" << std::endl; return -1; } // 此处可插入一段长时间等待的时间窗口, // 在此期间不会有任何计算任务提交给 GPU // 释放显存 cudaFree(d_x); return 0; } ```
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值