1. C++代码
#include <iostream>
#include <unistd.h>
#include <cstdio>
#include <nvml.h>
// 来源 https://gist.github.com/sakamoto-poteko/44d6cd19552fa7721b99
// https://github.com/CFSworks/nvml_fix/issues/16
//#pragma comment(lib, "nvml")
struct Arg {
    Arg(int c, int i):count(c), itvl(i) {};
    int count;
    int itvl;
};
Arg parse_arg(int argc, char* argv[]) {
    Arg a(1, 1);
    for(int i = 1; i < argc; i++) {
        auto ar = std::string(argv[i]);
        if(ar == "-x" && i + 1 < argc && argv[i + 1][0] != '-') {
            a.itvl = std::atoi(argv[i + 1]);
            i++;
            continue;
        }
        if(ar == "-c" && i + 1 < argc && argv[i + 1][0] != '-') {
            a.count = std::atoi(argv[i + 1]);
            i++;
            continue;
        }
    }
    return a;
}
int showGPUUtilization(){
    nvmlReturn_t result;
    unsigned int device_count;
    result = nvmlDeviceGetCount(&device_count);
    if (result != NVML_SUCCESS)
        return 2;
    for (int i = 0; i < device_count; ++i) {
        nvmlDevice_t device;
        result = nvmlDeviceGetHandleByIndex(i, &device);
        if (result != NVML_SUCCESS)
            return 3;
        char device_name[NVML_DEVICE_NAME_BUFFER_SIZE];
        result = nvmlDeviceGetName(device, device_name, NVML_DEVICE_NAME_BUFFER_SIZE);
        if (result != NVML_SUCCESS)
            return 4;
        //std::printf("Device %d: %s\n", i, device_name);
        nvmlUtilization_st device_utilization;
        result = nvmlDeviceGetUtilizationRates(device, &device_utilization);
        if (result != NVML_SUCCESS)
            return 5;
        std::printf("GPU%d Util: %u\n", i, device_utilization.gpu);
        std::printf("GPU%d Mem Util: %u\n", i, device_utilization.memory);
    }
    return 0;
}
int main(int argc, char* argv[])
{
    auto a = parse_arg(argc, argv);
    nvmlReturn_t result;
    result = nvmlInit();
    if (result != NVML_SUCCESS)
        return 1;
    for(int i = 0 ; (a.count < 0) || (a.count > 0 && i < a.count); i++) {
        showGPUUtilization();
        if(i + 1 < a.count) {
            sleep(a.itvl);
        }
    }
    nvmlShutdown();
    return 0;
}
2. CMakeLists.txt 代码
PROJECT (device_info LANGUAGES CXX CUDA)
SET(CMAKE_VERBOSE_MAKEFILE ON)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
FIND_PACKAGE (CUDAToolkit)
INCLUDE_DIRECTORIES (${CUDAToolkit_INCLUDE_DIRS})
LINK_DIRECTORIES(${CUDAToolkit_LIBRARY_DIR})
ADD_EXECUTABLE (gpu-utilization gpu-utilization.cc)
TARGET_LINK_LIBRARIES (gpu-utilization nvidia-ml)