GPU温度の取得
// 物理GPUハンドルは取得済みであるものとする
NvPhysicalGpuHandle hPhysicalGpu = ...
NvS32 temperature = 0;
NvAPI_Status nv_status = NVAPI_OK;
NV_GPU_THERMAL_SETTINGS thermal = {0,};
thermal.version = NV_GPU_THERMAL_SETTINGS_VER;
nv_status = NvAPI_GPU_GetThermalSettings( hPhysicalGpu, 0, &thermal );
if ( nv_status == NVAPI_OK ) {
if ( temp != NULL ) {
for ( size_t i=0; i<NVAPI_MAX_THERMAL_SENSORS_PER_GPU; i++ ) {
// targetがNVAPI_THERMAL_TARGET_GPUかどうかチェック
if ( thermal.sensor[i].target == NVAPI_THERMAL_TARGET_GPU ) {
temperature = thermal.sensor[i].currentTemp;
break;
}
}
}
}
GPU使用率の取得
// 物理GPUハンドルは取得済みであるものとする
NvPhysicalGpuHandle hPhysicalGpu = ...
NvAPI_Status nv_status = NVAPI_OK;
// 現在のGPU使用率の取得
NvU32 act_pct = 0;
NV_GPU_DYNAMIC_PSTATES_INFO_EX info = {0,};
info.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
nv_status = NvAPI_GPU_GetDynamicPstatesInfoEx( m_handle, &info );
if ( nv_status == NVAPI_OK ) {
// ドキュメントにはutilization[NVAPI_GPU_UTILIZATION_DOMAIN_GPU]で
// 参照できると書いてあるが、ヘッダにはNVAPI_GPU_UTILIZATION_DOMAIN_GPUの
// 定義が見当たらない。
// おそらく GPU FB VID BUS と並んでいるので0番の要素を参照する。
if ( info.utilization[0].bIsPresent > 0 ) {
// 単位は[%]
act_pct = info.utilization[0].percentage;
}
}
コアクロックの取得
// 物理GPUハンドルは取得済みであるものとする
NvPhysicalGpuHandle hPhysicalGpu = ...
NvAPI_Status nv_status = NVAPI_OK;
// 最大クロックの取得
NvU32 max_clock = 0;
NV_GPU_CLOCK_FREQUENCIES freqs = {0,};
freqs.version = NV_GPU_CLOCK_FREQUENCIES_VER;
freqs.ClockType = NV_GPU_CLOCK_FREQUENCIES_BOOST_CLOCK;
nv_status = NvAPI_GPU_GetAllClockFrequencies( hPhysicalGpu, &freqs );
if ( nv_status == NVAPI_OK ) {
if ( freqs.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].bIsPresent > 0 ) {
// 単位はkHz
max_clock = freqs.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].frequency;
}
}
// 現在のクロックの取得
NvS32 cur_clock = 0;
// ここではfreqs構造体を使いまわしている
// 現在のクロックを取得する場合はClockTypeをNV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQにする
freqs.ClockType = NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ;
nv_status = NvAPI_GPU_GetAllClockFrequencies( hPhysicalGpu, &freqs );
if ( nv_status == NVAPI_OK ) {
if ( freqs.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].bIsPresent > 0 ) {
cur_clock = freqs.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].frequency;
}
}
GPUファン速度の取得
※GPUモデルによっては取得できない場合がある
// 物理GPUハンドルは取得済みであるものとする
NvPhysicalGpuHandle hPhysicalGpu = ...
NvAPI_Status nv_status = NVAPI_OK;
// 最大回転数の取得
NvU32 cur_rpm = 0;
nv_status = NvAPI_GPU_GetTachReading( hPhysicalGpu , &cur_rpm );
if ( nv_status == NVAPI_OK ) {
// OK
}