간단한 것 같은데, 막상 찾으면 방법이 잘 안 나와서 정리. 예전에는 cudaMemGetInfo 를 이용해서 GPU 사용량을 확인했는데, 이걸로는 4gb 이상인 GPU에서는 제대로 안 된다는 것 같다. 실제로 3090에서 값이 제대로 안나와서 찾아보니 nmvl 을 이용해야 한다고 나옴.
nvml.lib 참조 추가
CUDA를 이용해서 GPU 사용량을 측정하기 위해 nvml.lib 파일을 프로젝트 참조에 추가해야 한다. CUDA를 프로젝트에 참조하는 방법은 아래 링크 글 참조.
5번 항목에서 lib 파일을 추가할 때 ‘nvml.lib’ 파일을 추가해 주면 된다. 추가한 lib 파일을 사용하려면 #include <nvml.h> 를 하면 된다.
GPU Usage 측정
GPU 사용량을 측정하는 코드는 아래와 같다.
// GpuUsage는 total, free, used를 멤버로 갖는 클래스이다.
GpuUsage GetGpuUsage()
{
// 우선 nvmlInit을 한다.
if (nvmlInit() == NVML_SUCCESS)
{
unsigned int nDev;
// 현재 컴퓨터에 달린 그래픽카드의 개수를 가져온다.
if (nvmlDeviceGetCount(&nDev) == NVML_SUCCESS)
{
size_t total = 0;
size_t free = 0;
size_t used = 0;
// 그래픽카드 개수만큼 반복
for (int i = 0; i < nDev; i++)
{
nvmlDevice_t device;
// index를 이용해서 우선 device를 가져온다.
if (nvmlDeviceGetHandleByIndex_v2(i, &device) == NVML_SUCCESS)
{
nvmlMemory_t memInfo;
// device의 memory usage를 가져온다. memInfo에는 total, free, used가 담겨 있다.
if (nvmlDeviceGetMemoryInfo(device, &memInfo) == NVML_SUCCESS)
{
total += memInfo.total;
free += memInfo.free;
used += memInfo.used;
}
}
}
return GpuUsage(total, free, used);
}
return GpuUsage();
}
}
C++
복사