通过CUDA的NVML库获取显卡的使用率-针对NVIDIA显卡

在使用CUDA的NVML库之前,需要安装CUDA SDK.
需要确定文件夹“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include”下包含nvml.h文件,并将该地址包含在工程中。
需要确定文件夹“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include下”包含nvml.lib文件,并将该地址包含在工程中。
将文件夹“C:\Program Files\NVIDIA Corporation\NVSMI”下的nvml.dll拷贝到工程目录下。

在VS2010上编写的代码如下:

#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <ctime>
#include <string.h>
#include "cuda_runtime.h"
#include <windows.h>
#include "nvml.h"

int main(int argc, char* argv[])
{
    nvmlReturn_t result0;
    unsigned int device_count;
    result0 = nvmlInit();

    result0 = nvmlDeviceGetCount(&device_count);
    if (NVML_SUCCESS != result0)
    {
        std::cout << "Failed to query device count: " << nvmlErrorString(result0);
        return -1;
    }
    std::cout << "Found" << device_count <<" device" << std::endl;
    std::stringstream availGPUTxt;

    for (int i=0; i<device_count; i++)
    {
        nvmlDevice_t device;
        nvmlPciInfo_t pci;
        result0 = nvmlDeviceGetHandleByIndex(i, &device);
        if (NVML_SUCCESS != result0)
        {
            std::cout << "Failed to get device count: " << nvmlErrorString(result0);
            return -1;
        }

        char name[NVML_DEVICE_NAME_BUFFER_SIZE];
        result0 = nvmlDeviceGetName(device, name, NVML_DEVICE_NAME_BUFFER_SIZE);
        if (NVML_SUCCESS != result0)
        {
            std::cout << "Failed to get device name: " << nvmlErrorString(result0);
            return -1;
        }

        nvmlUtilization_t utilization;
        result0 = nvmlDeviceGetUtilizationRates(device, &utilization);
        if (NVML_SUCCESS != result0)
        {
            std::cout << "Failed to get utilization rates: " << nvmlErrorString(result0);
            return -1;
        }

        nvmlMemory_t memory;
        result0 = nvmlDeviceGetMemoryInfo(device, &memory);
        if (NVML_SUCCESS != result0)
        {
            std::cout << "Failed to get memory info: " << nvmlErrorString(result0);
            return -1;
        }

        availGPUTxt << "-----------------------------------------------------------" << std::endl;
        availGPUTxt << "CUDA NVML" << std::endl;
        availGPUTxt << "第" << i << "块显卡" << std::endl;
        availGPUTxt << "GPU name:" << name << std::endl;
        availGPUTxt << "----- 使用率: -----" << std::endl;
        availGPUTxt << "GPU使用率:" << utilization.gpu << std::endl;
        availGPUTxt << "显存使用率:" << utilization.memory << std::endl;
         // Byte->KB->MB->GB
        availGPUTxt << "全部可用显存:" << (float)(memory.total)/1024.0f/1024.0f/1024.0f << "GB" << std::endl;
        availGPUTxt << "剩余可用显存:" << (float)(memory.free)/1024.0f/1024.0f/1024.0f << "GB" << std::endl;
        availGPUTxt << "-----------------------------------------------------------" << std::endl;
    }
    
    std::string fileFitBetaName = "E:\\test\\availGPUTest.txt";
    std::ofstream fileFitBetaInfo(fileFitBetaName, std::ios::out|std::ios::binary|std::ios::ate);
    fileFitBetaInfo.write((char*)availGPUTxt.str().c_str(), (int)availGPUTxt.str().length());
    fileFitBetaInfo.close();

    return 0;
}

在本地输出的结果为:
在这里插入图片描述
在以上代码中,使用NVML的nvmlDeviceGetUtilizationRates函数获得显卡的使用率,单位是百分比。此外,还可用使用GPU-Z查看显卡的使用。其他NVML的显卡信息查看函数可用查看NVML查看显卡信息或者直接查看官方文档。
上面的程序使用nvmlDeviceGetMemoryInfo函数获得显卡的全部可用内存和剩余可用内存。获得显卡的可用内存也可用使用CUDA Runtime API的cudaMemGetInfo函数。代码如下:

#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <ctime>
#include <string.h>
#include "cuda_runtime.h"
#include <windows.h>

int main(int argc, char* argv[])
{

    int id = -1;
    cudaGetDevice(&id);
    printf("cuda id=%d\n", id);

    unsigned int flags;
    cudaGetDeviceFlags(&flags);
    
    int count;
    if(cudaGetDeviceCount(&count)|| count < 1)
    {
        printf("cudaSetDevice failed! Do you have a CUDA-capable GPU installed?");
        return -3;
    }
    
    std::stringstream availGPUTxt;
    for (int i=0; i<count; i++)
    {
        cudaSetDevice(i);
        //cudaDeviceReset();

        cudaDeviceProp prop;
        cudaGetDeviceProperties(&prop, i);

        cudaDeviceAttr attr;
        int value;
        cudaDeviceGetAttribute(&value, cudaDevAttrMaxTextureCubemapLayeredLayers, i);

        size_t szmen = 1024*1024*360;
        float* ptrDevice = NULL;
        if (i==0)
            cudaMalloc((void**)&ptrDevice, szmen);

        size_t available, total;
        cudaMemGetInfo(&available, &total);

        availGPUTxt << "-----------------------------------------------------------" << std::endl;
        availGPUTxt << "CUDA Runtime API" << std::endl;
        availGPUTxt << "第" << i << "块显卡" << std::endl;
        // Byte->KB->MB->GB
        availGPUTxt <<"GPU 全部可用显存:"<< (float)(total)/1024.0f/1024.0f/1024.0f << "GB" << std::endl;
        availGPUTxt <<"GPU 剩余可用显存:"<< (float)(available)/1024.0f/1024.0f/1024.0f << "GB" << std::endl;
        availGPUTxt << "-----------------------------------------------------------" << std::endl;
    }

    std::string fileFitBetaName = "E:\\test\\availGPUTest.txt";
    std::ofstream fileFitBetaInfo(fileFitBetaName, std::ios::out|std::ios::binary|std::ios::ate);
    fileFitBetaInfo.write((char*)availGPUTxt.str().c_str(), (int)availGPUTxt.str().length());
    fileFitBetaInfo.close();

    return 0;
}

在本地的输出结果为:
在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值