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