2015年5月24日日曜日

NVAPIを使ってGPUの使用メモリ量を求める

NVIDIA GPUで現在使用中のメモリ量を求めるにはNVAPIを使う。
搭載メモリ量であればOpenCLやOpenGLからも求めることができるが、メモリ使用量はNVAPIを使う必要がある。

NVAPI SDKを展開した場所をインクルードパスに追加し、nvapi.hをインクルードする。
#include "nvapi.h"
#if defined(_WIN32) && defined(_MSC_VER)
#if _M_AMD64
#pragma comment(lib,"amd64/nvapi64.lib")
#else
#pragma comment(lib,"x86/nvapi.lib")
#endif
#endif

NVAPIの初期化
NVIDIAドライバがインストールされた環境であればnvapi.dll/nvapi64.dllがシステムに存在しているはず。
  bool nvapi_initialized = false;
  NvAPI_Status ret = NVAPI_OK;
  ret = NvAPI_Initialize();
  if ( ret == NVAPI_OK ) {
    // OK
    nvapi_initialized = true;
  } else {
    // NG
  }

物理GPUの列挙
NVAPIには論理GPUと物理GPUという概念があるが、メモリ量などは物理GPUハンドルを用いて取得する。
  NvPhysicalGpuHandle  nvPhysicalGPUHandle[NVAPI_MAX_LOGICAL_GPUS] = {0,};
  NvU32 physicalGpuCount = 0;
  ret = NvAPI_EnumPhysicalGPUs( nvPhysicalGPUHandle, &physicalGpuCount );
  if ( ret == NVAPI_OK && pPhysicalGpuCount > 0 ) {
    // 1つ以上のGPUデバイスが存在する
  }

搭載メモリ量/使用メモリ量の取得
ここでは、1番目のデバイス(nvPhysicalGPUHandle[0])についてのみ取得している。
  // 搭載メモリ量の取得
  NvU32 mem_size = 0;
  ret = NvAPI_GPU_GetPhysicalFrameBufferSize( nvPhysicalGPUHandle[0], &mem_size );
  // 使用中メモリ量の取得
  Nv_U32 mem_usage = 0;
  // NVAPIには構造体で情報を受け取る関数がいくつか存在するが、だいたいこのように
  // あらかじめversionフィールドを初期化しておく必要がある。
  NV_DISPLAY_DRIVER_MEMORY_INFO info = {0,};
  info.version = NV_DISPLAY_DRIVER_MEMORY_INFO_VER;
  ret = NvAPI_GPU_GetMemoryInfo( nvPhysicalGPUHandle[0], &info );
  if ( nv_status == NVAPI_OK ) {
    mem_usage = info.dedicatedVideoMemory - info.curAvailableDedicatedVideoMemory;
  }

最後にNVAPIをUnloadする。
  if ( nvapi_initialized ) {
    NvAPI_Unload();
  }

1 件のコメント:

  1. NvPhysicalGpuHandle nvPhysicalGPUHandle[NVAPI_MAX_LOGICAL_GPUS] = {0,};
    NvU32 physicalGpuCount = 0;
    ret = NvAPI_EnumPhysicalGPUs( nvPhysicalGPUHandle, &physicalGpuCount );
    if ( ret == NVAPI_OK && physicalGpuCount > 0 ) { // pPhysicalGpuCount -> physicalGpuCount
    // 1つ以上のGPUデバイスが存在する
    }
    でないですかね? 大文字小文字が違っているかなと

    返信削除