手动风扇调速
导航: 使用 ADLX 进行编程 → ADLX 示例 → C 示例 → GPU 调优
演示了在使用 ADLX 进行编程时如何控制手动风扇调优。
命令提示符
| 命令提示符 | 描述 |
|---|---|
| 1 | 获取和设置风扇设置。 |
| 2 | 获取和设置 ZeroRPM 设置。 |
| 3 | 获取和设置 MinAcoustic 设置。 |
| 4 | 获取和设置 MinFanSpeed 设置。 |
| 5 | 获取和设置 TargetFanSpeed 设置。 |
| M/m | 显示此菜单。 |
| Q/q | 退出。 |
示例路径
/Samples/C/GPUTuning/ManualFanTuning
C
代码
C
//// Copyright Advanced Micro Devices, Inc. All rights reserved.////-------------------------------------------------------------------------------------------------
/// \file mainManualFanTuning.c/// \brief Demonstrates how to control manual fan tuning when programming with ADLX.
#include "SDK/ADLXHelper/Windows/C/ADLXHelper.h"#include "SDK/Include/IGPUManualFanTuning.h"#include "SDK/Include/IGPUTuning.h"
// Main menuvoid MainMenu ();
// Menu action controlvoid MenuControl (IADLXManualFanTuning* manualFanTuning);
// Wait for exit with error messageint WaitAndExit (const char* msg, const int retCode, IADLXGPUTuningServices* gpuTuningService, IADLXGPUList* gpus, IADLXGPU* oneGPU, IADLXInterface* manualFanTuningIfc, IADLXManualFanTuning* manualFanTuning);
// Display and set fan settingsvoid ShowGetAndSetFan (IADLXManualFanTuning* manualFanTuning);
// Display and set ZeroRPM settingsvoid ShowGetAndSetZeroRPM (IADLXManualFanTuning* manualFanTuning);
// Display and set MinAcoustic settingsvoid ShowGetAndSetMinAcoustic (IADLXManualFanTuning* manualFanTuning);
// Display and set MinFanSpeed settingsvoid ShowGetAndSetMinFanSpeed (IADLXManualFanTuning* manualFanTuning);
// Display and set TargetFanSpeed settingsvoid ShowGetAndSetTargetFanSpeed (IADLXManualFanTuning* manualFanTuning);
int main (){ ADLX_RESULT res = ADLX_FAIL;
// Initialize ADLX res = ADLXHelper_Initialize ();
if (ADLX_SUCCEEDED (res)) { IADLXSystem* sys = ADLXHelper_GetSystemServices (); IADLXGPUTuningServices* gpuTuningService = NULL; IADLXGPUList* gpus = NULL; IADLXGPU* oneGPU = NULL; IADLXInterface* manualFanTuningIfc = NULL; IADLXManualFanTuning* manualFanTuning = NULL;
res = sys->pVtbl->GetGPUTuningServices (sys, &gpuTuningService); if (ADLX_FAILED (res)) return WaitAndExit ("\tGet GPU tuning services failed", 0, gpuTuningService, gpus, oneGPU, manualFanTuningIfc, manualFanTuning);
res = sys->pVtbl->GetGPUs (sys, &gpus); if (ADLX_FAILED (res)) return WaitAndExit ("\tGet GPU list failed", 0, gpuTuningService, gpus, oneGPU, manualFanTuningIfc, manualFanTuning);
res = gpus->pVtbl->At_GPUList (gpus, 0, &oneGPU); if (ADLX_FAILED (res) || oneGPU == NULL) return WaitAndExit ("\tGet GPU failed", 0, gpuTuningService, gpus, oneGPU, manualFanTuningIfc, manualFanTuning);
adlx_bool supported = false; res = gpuTuningService->pVtbl->IsSupportedManualFanTuning (gpuTuningService, oneGPU, &supported); if (ADLX_FAILED (res) || supported == false) return WaitAndExit ("\tThis GPU does not support manual fan tuning", 0, gpuTuningService, gpus, oneGPU, manualFanTuningIfc, manualFanTuning);
res = gpuTuningService->pVtbl->GetManualFanTuning (gpuTuningService, oneGPU, &manualFanTuningIfc); if (ADLX_FAILED (res) || manualFanTuningIfc == NULL) return WaitAndExit ("\tGet manual fan tuning interface failed", 0, gpuTuningService, gpus, oneGPU, manualFanTuningIfc, manualFanTuning);
manualFanTuningIfc->pVtbl->QueryInterface (manualFanTuningIfc, IID_IADLXManualFanTuning (), (void**)&manualFanTuning); if (manualFanTuning == NULL) return WaitAndExit ("\tGet manual fan tuning failed", 0, gpuTuningService, gpus, oneGPU, manualFanTuningIfc, manualFanTuning);
// Display main menu options MainMenu ();
// Get and execute the choice MenuControl (manualFanTuning);
// Release the manualFanTuning interface if (manualFanTuning != NULL) { manualFanTuning->pVtbl->Release (manualFanTuning); manualFanTuning = NULL; } if (manualFanTuningIfc != NULL) { manualFanTuningIfc->pVtbl->Release (manualFanTuningIfc); manualFanTuningIfc = NULL; } if (oneGPU != NULL) { oneGPU->pVtbl->Release (oneGPU); oneGPU = NULL; } if (gpus != NULL) { gpus->pVtbl->Release (gpus); gpus = NULL; } if (gpuTuningService != NULL) { gpuTuningService->pVtbl->Release (gpuTuningService); gpuTuningService = NULL; } } else { printf ("\tg_ADLXHelp initialize failed\n"); system ("pause"); return 0; }
// Destroy ADLX res = ADLXHelper_Terminate (); printf ("Destroy ADLX res: %d\n", res);
// Pause to see the print out system ("pause");
return 0;}
// Main menuvoid MainMenu (){ printf ("\tChoose from the following options:\n");
printf ("\t->Press 1 to display and set fan setting\n"); printf ("\t->Press 2 to display and set ZeroRPM setting\n"); printf ("\t->Press 3 to display and set MinAcoustic setting\n"); printf ("\t->Press 4 to display and set MinFanSpeed setting\n"); printf ("\t->Press 5 to display and set TargetFanSpeed setting\n");
printf ("\t->Press Q/q to terminate the application\n"); printf ("\t->Press M/m to display main menu options\n");}
// Menu action controlvoid MenuControl (IADLXManualFanTuning* manualFanTuning){ int num = 0; while ((num = getchar ()) != 'q' && num != 'Q') { switch (num) { // Display and set fan settings case '1': ShowGetAndSetFan (manualFanTuning); break;
// Display and set ZeroRPM settings case '2': ShowGetAndSetZeroRPM (manualFanTuning); break;
// Display and set MinAcoustic settings case '3': ShowGetAndSetMinAcoustic (manualFanTuning); break;
// Display and set MinFanSpeed settings case '4': ShowGetAndSetMinFanSpeed (manualFanTuning); break;
// Display and set TargetFanSpeed settings case '5': ShowGetAndSetTargetFanSpeed (manualFanTuning); break;
// Display menu options case 'm': case 'M': MainMenu (); break; default: break; } }}
// Wait for exit with error messageint WaitAndExit (const char* msg, const int retCode, IADLXGPUTuningServices* gpuTuningService, IADLXGPUList* gpus, IADLXGPU* oneGPU, IADLXInterface* manualFanTuningIfc, IADLXManualFanTuning* manualFanTuning){ // Printout the message and pause to see it before returning the desired code if (NULL != msg) printf ("%s\n", msg);
// Release the manualFanTuning interface if (manualFanTuning != NULL) { manualFanTuning->pVtbl->Release (manualFanTuning); manualFanTuning = NULL; } if (manualFanTuningIfc != NULL) { manualFanTuningIfc->pVtbl->Release (manualFanTuningIfc); manualFanTuningIfc = NULL; } if (oneGPU != NULL) { oneGPU->pVtbl->Release (oneGPU); oneGPU = NULL; } if (gpus != NULL) { gpus->pVtbl->Release (gpus); gpus = NULL; } if (gpuTuningService != NULL) { gpuTuningService->pVtbl->Release (gpuTuningService); gpuTuningService = NULL; } // Destroy ADLX ADLX_RESULT res = ADLXHelper_Terminate (); printf ("Destroy ADLX res: %d\n", res);
system ("pause"); return retCode;}
// Display and set fan settingsvoid ShowGetAndSetFan (IADLXManualFanTuning* manualFanTuning){ // Display manual fan tuning ranges (speed, temperature) ADLX_IntRange fanSpeedRange, fanTemperatureRange; ADLX_RESULT res = manualFanTuning->pVtbl->GetFanTuningRanges (manualFanTuning, &fanSpeedRange, &fanTemperatureRange); printf ("\tFan speed range: (%d, %d)\n", fanSpeedRange.minValue, fanSpeedRange.maxValue); printf ("\tFan temperature range: (%d, %d)\n", fanTemperatureRange.minValue, fanTemperatureRange.maxValue); printf ("\tReturn code is: %d(0 means success)\n", res);
// Display current fan tuning states IADLXManualFanTuningStateList* states; IADLXManualFanTuningState* oneState; res = manualFanTuning->pVtbl->GetFanTuningStates (manualFanTuning, &states); if (ADLX_SUCCEEDED (res)) { for (adlx_uint crt = states->pVtbl->Begin (states); crt != states->pVtbl->End (states); ++crt) { res = states->pVtbl->At_ManualFanTuningStateList (states, crt, &oneState); adlx_int speed = 0, temperature = 0; oneState->pVtbl->GetFanSpeed (oneState, &speed); oneState->pVtbl->GetTemperature (oneState, &temperature); printf ("\tThe current %d state: speed is %d temperature is %d\n", crt, speed, temperature); if (oneState != NULL) { oneState->pVtbl->Release (oneState); oneState = NULL; } } if (states != NULL) { states->pVtbl->Release (states); states = NULL; } } // Display default fan tuning states IADLXManualFanTuning1* manualFanTuning1; manualFanTuning->pVtbl->QueryInterface(manualFanTuning, IID_IADLXManualFanTuning1(), (void**)&manualFanTuning1); if (manualFanTuning1) { res = manualFanTuning1->pVtbl->GetDefaultFanTuningStates(manualFanTuning1, &states); if (ADLX_SUCCEEDED(res)) { for (adlx_uint crt = states->pVtbl->Begin(states); crt != states->pVtbl->End(states); ++crt) { res = states->pVtbl->At_ManualFanTuningStateList(states, crt, &oneState); adlx_int speed = 0, temperature = 0; oneState->pVtbl->GetFanSpeed(oneState, &speed); oneState->pVtbl->GetTemperature(oneState, &temperature); printf("\tThe default %d state: speed is %d temperature is %d\n", crt, speed, temperature); if (oneState != NULL) { oneState->pVtbl->Release(oneState); oneState = NULL; } } if (states != NULL) { states->pVtbl->Release(states); states = NULL; } } manualFanTuning1->pVtbl->Release(manualFanTuning1); manualFanTuning1 = NULL; }
// Set empty fan tuning states res = manualFanTuning->pVtbl->GetEmptyFanTuningStates (manualFanTuning, &states); if (ADLX_SUCCEEDED (res)) { for (adlx_uint crt = states->pVtbl->Begin (states); crt != states->pVtbl->End (states); ++crt) { res = states->pVtbl->At_ManualFanTuningStateList (states, crt, &oneState); adlx_int speed = 0, temperature = 0; int fanSpeedStep = (fanSpeedRange.maxValue - fanSpeedRange.minValue) / states->pVtbl->Size (states); int fanTemperatureStep = (fanTemperatureRange.maxValue - fanTemperatureRange.minValue) / states->pVtbl->Size (states); oneState->pVtbl->SetFanSpeed (oneState, fanSpeedRange.minValue + fanSpeedStep * crt); oneState->pVtbl->GetFanSpeed (oneState, &speed); oneState->pVtbl->SetTemperature (oneState, fanTemperatureRange.minValue + fanTemperatureStep * crt); oneState->pVtbl->GetTemperature (oneState, &temperature); printf ("\tSet empty %d state: speed is %d temperature is %d\n", crt, speed, temperature); if (oneState != NULL) { oneState->pVtbl->Release (oneState); oneState = NULL; } } }
// Set empty fan tuning states to current fan tuning states adlx_int errorIndex; res = manualFanTuning->pVtbl->IsValidFanTuningStates (manualFanTuning, states, &errorIndex); printf ("\tIsValidGPUTuningStates, errorIndex is : %d\n", errorIndex); if (ADLX_SUCCEEDED (res)) { manualFanTuning->pVtbl->SetFanTuningStates (manualFanTuning, states); } if (states != NULL) { states->pVtbl->Release (states); states = NULL; } res = manualFanTuning->pVtbl->GetFanTuningStates (manualFanTuning, &states); if (ADLX_SUCCEEDED (res)) { printf ("\tAfter setting:\n"); for (adlx_uint crt = states->pVtbl->Begin (states); crt != states->pVtbl->End (states); ++crt) { res = states->pVtbl->At_ManualFanTuningStateList (states, crt, &oneState); adlx_int speed = 0, temperature = 0; oneState->pVtbl->GetFanSpeed (oneState, &speed); oneState->pVtbl->GetTemperature (oneState, &temperature); printf ("\tThe current %d state: speed is %d temperature is %d\n", crt, speed, temperature); if (oneState != NULL) { oneState->pVtbl->Release (oneState); oneState = NULL; } } if (states != NULL) { states->pVtbl->Release (states); states = NULL; } }}
// Display and set ZeroRPM settingsvoid ShowGetAndSetZeroRPM (IADLXManualFanTuning* manualFanTuning){ adlx_bool supported = false; ADLX_RESULT res = manualFanTuning->pVtbl->IsSupportedZeroRPM (manualFanTuning, &supported); printf ("\tIs support ZeroRPM: %d\n", supported); if (ADLX_FAILED (res) || !supported) return; adlx_bool isZeroRPMStateSet = false; res = manualFanTuning->pVtbl->SetZeroRPMState (manualFanTuning, true); printf ("\tSet ZeroRPM state, return code is: %d(0 means success)\n", res); res = manualFanTuning->pVtbl->GetZeroRPMState (manualFanTuning, &isZeroRPMStateSet); printf ("\tIs ZeroRPM state set: %d, return code is: %d(0 means success)\n", isZeroRPMStateSet, res); res = manualFanTuning->pVtbl->SetZeroRPMState (manualFanTuning, false); printf ("\tReset ZeroRPM state, return code is: %d(0 means success)\n", res); res = manualFanTuning->pVtbl->GetZeroRPMState (manualFanTuning, &isZeroRPMStateSet); printf ("\tIs ZeroRPM state set: %d, return code is: %d(0 means success)\n", isZeroRPMStateSet, res); IADLXManualFanTuning1* manualFanTuning1; manualFanTuning->pVtbl->QueryInterface(manualFanTuning, IID_IADLXManualFanTuning1(), (void**)&manualFanTuning1); if (manualFanTuning1) { res = manualFanTuning1->pVtbl->GetDefaultZeroRPMState(manualFanTuning1, &isZeroRPMStateSet); printf("\tDefault ZeroRPM state is: %d, return code is: %d(0 means success)\n", isZeroRPMStateSet, res); // release manualFanTuning1 manualFanTuning1->pVtbl->Release(manualFanTuning1); manualFanTuning1 = NULL; }}
// Display and set MinAcoustic settingsvoid ShowGetAndSetMinAcoustic (IADLXManualFanTuning* manualFanTuning){ adlx_bool supported = false; ADLX_RESULT res = manualFanTuning->pVtbl->IsSupportedMinAcousticLimit (manualFanTuning, &supported); printf ("\tIs MinAcousticLimit supported: %d\n", supported); if (ADLX_FAILED (res) || !supported) return;
ADLX_IntRange tuningRange; res = manualFanTuning->pVtbl->GetMinAcousticLimitRange (manualFanTuning, &tuningRange); printf ("\tMinAcoustic limit range: (%d, %d), return code is: %d(0 means success)\n", tuningRange.minValue, tuningRange.maxValue, res);
adlx_int minAcousticLimit; res = manualFanTuning->pVtbl->GetMinAcousticLimit (manualFanTuning, &minAcousticLimit); printf ("\tCurrent min acoustic limit: %d, return code is: %d(0 means success)\n", minAcousticLimit, res); res = manualFanTuning->pVtbl->SetMinAcousticLimit (manualFanTuning, tuningRange.minValue + (tuningRange.maxValue - tuningRange.minValue) / 2); res = manualFanTuning->pVtbl->GetMinAcousticLimit (manualFanTuning, &minAcousticLimit); printf ("\tSet current min acoustic limit to: %d, return code is: %d(0 means success)\n", minAcousticLimit, res);
IADLXManualFanTuning1* manualFanTuning1; manualFanTuning->pVtbl->QueryInterface(manualFanTuning, IID_IADLXManualFanTuning1(), (void**)&manualFanTuning1); if (manualFanTuning1) { res = manualFanTuning1->pVtbl->GetMinAcousticLimitDefault(manualFanTuning1, &minAcousticLimit); printf("\tDefault min acoustic limit is: %d, return code is: %d(0 means success)\n", minAcousticLimit, res); // release manualFanTuning1 manualFanTuning1->pVtbl->Release(manualFanTuning1); manualFanTuning1 = NULL; }}
// Display and set MinFanSpeed settingsvoid ShowGetAndSetMinFanSpeed (IADLXManualFanTuning* manualFanTuning){ adlx_bool supported = false; ADLX_RESULT res = manualFanTuning->pVtbl->IsSupportedMinFanSpeed (manualFanTuning, &supported); printf ("\tIs MinFanSpeed supported: %d\n", supported); if (ADLX_FAILED (res) || !supported) return;
ADLX_IntRange tuningRange; res = manualFanTuning->pVtbl->GetMinFanSpeedRange (manualFanTuning, &tuningRange); printf ("\tMinFanSpeed range: (%d, %d), return code is: %d(0 means success)\n", tuningRange.minValue, tuningRange.maxValue, res);
adlx_int minFanSpeed = 0; res = manualFanTuning->pVtbl->GetMinFanSpeed (manualFanTuning, &minFanSpeed); printf ("\tCurrent MinFanSpeed: %d, return code is: %d(0 means success)\n", minFanSpeed, res); res = manualFanTuning->pVtbl->SetMinFanSpeed (manualFanTuning, tuningRange.minValue + (tuningRange.maxValue - tuningRange.minValue) / 2); res = manualFanTuning->pVtbl->GetMinFanSpeed (manualFanTuning, &minFanSpeed); printf ("\tSet current MinFanSpeed to: %d, return code is: %d(0 means success)\n", minFanSpeed, res);
IADLXManualFanTuning1* manualFanTuning1; manualFanTuning->pVtbl->QueryInterface(manualFanTuning, IID_IADLXManualFanTuning1(), (void**)&manualFanTuning1); if (manualFanTuning1) { res = manualFanTuning1->pVtbl->GetMinFanSpeedDefault(manualFanTuning1, &minFanSpeed); printf("\tDefault MinFanSpeed is: %d, return code is: %d(0 means success)\n", minFanSpeed, res); // release manualFanTuning1 manualFanTuning1->pVtbl->Release(manualFanTuning1); manualFanTuning1 = NULL; }}
// Display and set TargetFanSpeed settingsvoid ShowGetAndSetTargetFanSpeed (IADLXManualFanTuning* manualFanTuning){ adlx_bool supported = false; ADLX_RESULT res = manualFanTuning->pVtbl->IsSupportedTargetFanSpeed (manualFanTuning, &supported); printf ("\tIs TargetFanSpeed supported: %d\n", supported); if (ADLX_FAILED (res) || !supported) return;
ADLX_IntRange tuningRange; res = manualFanTuning->pVtbl->GetTargetFanSpeedRange (manualFanTuning, &tuningRange); printf ("\tTargetFanSpeed range: (%d, %d), return code is: %d(0 means success)\n", tuningRange.minValue, tuningRange.maxValue, res);
adlx_int targetFanSpeed; res = manualFanTuning->pVtbl->GetTargetFanSpeed (manualFanTuning, &targetFanSpeed); printf ("\tCurrent TargetFanSpeed: %d, return code is: %d(0 means success)\n", targetFanSpeed, res); res = manualFanTuning->pVtbl->SetTargetFanSpeed (manualFanTuning, tuningRange.minValue + (tuningRange.maxValue - tuningRange.minValue) / 2); res = manualFanTuning->pVtbl->GetTargetFanSpeed (manualFanTuning, &targetFanSpeed); printf ("\tSet current TargetFanSpeed to: %d, return code is: %d(0 means success)\n", targetFanSpeed, res);
IADLXManualFanTuning1* manualFanTuning1; manualFanTuning->pVtbl->QueryInterface(manualFanTuning, IID_IADLXManualFanTuning1(), (void**)&manualFanTuning1); if (manualFanTuning1) { res = manualFanTuning1->pVtbl->GetTargetFanSpeedDefault(manualFanTuning1, &targetFanSpeed); printf("\Default TargetFanSpeed: %d, return code is: %d(0 means success)\n", targetFanSpeed, res); // release manualFanTuning1 manualFanTuning1->pVtbl->Release(manualFanTuning1); manualFanTuning1 = NULL; }
}