搭載メモリ量であれば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();
}
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デバイスが存在する
}
でないですかね? 大文字小文字が違っているかなと