PerfSystemMetrics
Navigation: Programming with ADLX → ADLX Samples → C++ Samples → Performance Monitoring
Demonstrates how to control system metrics when programming with ADLX.
Command Prompts
Command Prompt | Description |
---|---|
1 | Show current system metrics. |
2 | Show historical system metrics. |
M/m | Show this menu. |
Q/q | Quit. |
Sample Path
/Samples/CPP/PerformanceMonitoring/PerfSystemMetrics
C++
Code
C++
//// Copyright Advanced Micro Devices, Inc. All rights reserved.////-------------------------------------------------------------------------------------------------
/// \file mainPerfSystemMetrics.cpp/// \brief Demonstrates how to control system metrics when programming with ADLX.
#include "SDK/ADLXHelper/Windows/Cpp/ADLXHelper.h"#include "SDK/Include/IPerformanceMonitoring1.h"#include <iostream>
// Use ADLX namespaceusing namespace adlx;
// ADLXHelper instance// No outstanding interfaces from ADLX must exist when ADLX is destroyed.// Use global variables to ensure validity of the interface.static ADLXHelper g_ADLXHelp;
// Main menuvoid MainMenu();
// Menu action controlvoid MenuControl(IADLXPerformanceMonitoringServicesPtr perfMonitoringServices);
// Wait for exit with error messageint WaitAndExit(const char* msg, const int retCode);
// Display system metrics rangevoid ShowSystemMetricsRange(IADLXPerformanceMonitoringServicesPtr perfMonitoringServices);
/* * If the app only requires the current metric set, metrics tracking can be omitted in favor of calling the more efficient GetCurrent function. * If the app also requires metrics history, GetHistory retrieves the required accumulated history buffer, that may also include the current metric set. */// Display current system metricsvoid ShowCurrentSystemMetrics(IADLXPerformanceMonitoringServicesPtr perfMonitoringServices);
// Display historical system metricsvoid ShowHistoricalSystemMetrics(IADLXPerformanceMonitoringServicesPtr perfMonitoringServices);
int main(){ ADLX_RESULT res = ADLX_FAIL;
// Initialize ADLX res = g_ADLXHelp.Initialize();
if (ADLX_SUCCEEDED(res)) { // Get Performance Monitoring services IADLXPerformanceMonitoringServicesPtr perfMonitoringServices; res = g_ADLXHelp.GetSystemServices()->GetPerformanceMonitoringServices(&perfMonitoringServices); if (ADLX_SUCCEEDED(res)) { // Display main menu options MainMenu(); // Get and execute the choice MenuControl(perfMonitoringServices); } else std::cout << "\tGet performance monitoring services failed" << std::endl; } else return WaitAndExit("\tg_ADLXHelp initialize failed", 0);
// Destroy ADLX res = g_ADLXHelp.Terminate(); std::cout << "Destroy ADLX result: " << res << std::endl;
// Pause to see the print out system("pause");
return 0;}
// Main menuvoid MainMenu(){ std::cout << "\tChoose one from the following options" << std::endl;
std::cout << "\t->Press 1 to display the system metrics range" << std::endl; std::cout << "\t->Press 2 to display the current system metrics" << std::endl; std::cout << "\t->Press 3 to display the historical system metrics" << std::endl;
std::cout << "\t->Press Q/q to terminate the application" << std::endl; std::cout << "\t->Press M/m to display the main menu options" << std::endl;}
// Menu action controlvoid MenuControl(IADLXPerformanceMonitoringServicesPtr perfMonitoringServices){ int num = 0; while ((num = getchar()) != 'q' && num != 'Q') { switch (num) { // Display system metrics range case '1': ShowSystemMetricsRange(perfMonitoringServices); break;
// Display current metrics case '2': ShowCurrentSystemMetrics(perfMonitoringServices); break;
// Display historical metrics case '3': ShowHistoricalSystemMetrics(perfMonitoringServices); 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){ // Printout the message and pause to see it before returning the desired code if (nullptr != msg) std::cout << msg << std::endl;
system("pause"); return retCode;}
// Display system metrics rangevoid ShowSystemMetricsRange(IADLXPerformanceMonitoringServicesPtr perfMonitoringServices){ // Get system metrics support IADLXSystemMetricsSupportPtr systemMetricsSupport; ADLX_RESULT res = perfMonitoringServices->GetSupportedSystemMetrics(&systemMetricsSupport); if (ADLX_SUCCEEDED(res)) { adlx_int minValue = 0, maxValue = 0;
// Get CPU usage range res = systemMetricsSupport->GetCPUUsageRange(&minValue, &maxValue); if (ADLX_SUCCEEDED(res)) std::cout << "The CPU usage range between " << minValue << "% and " << maxValue << "%" << std::endl; else if (res == ADLX_NOT_SUPPORTED) std::cout << "Don't support CPU usage range" << std::endl;
// Get system RAM range res = systemMetricsSupport->GetSystemRAMRange(&minValue, &maxValue); if (ADLX_SUCCEEDED(res)) std::cout << "The system RAM range between " << minValue << "MB and " << maxValue << "MB" << std::endl; else if (res == ADLX_NOT_SUPPORTED) std::cout << "Don't support system RAM range" << std::endl;
// Get SmartShift range res = systemMetricsSupport->GetSmartShiftRange(&minValue, &maxValue); if (ADLX_SUCCEEDED(res)) std::cout << "The smart shift range between " << minValue << " and " << maxValue << std::endl; else if (res == ADLX_NOT_SUPPORTED) std::cout << "Don't support smart shift range" << std::endl; }}
// Display the system time stamp (in ms)void GetTimeStamp(IADLXSystemMetricsPtr systemMetrics){ adlx_int64 timeStamp = 0; ADLX_RESULT res = systemMetrics->TimeStamp(&timeStamp); if (ADLX_SUCCEEDED(res)) std::cout << "The system time stamp is: " << timeStamp << "ms" << std::endl;}
// Show CPU usage (in %)void ShowCPUUsage(IADLXSystemMetricsSupportPtr systemMetricsSupport, IADLXSystemMetricsPtr systemMetrics){ adlx_bool supported = false; // Display CPU usage support status ADLX_RESULT res = systemMetricsSupport->IsSupportedCPUUsage(&supported); if (ADLX_SUCCEEDED(res)) { std::cout << "CPU usage support status: " << supported << std::endl; if (supported) { adlx_double cpuUsage = 0; res = systemMetrics->CPUUsage(&cpuUsage); if (ADLX_SUCCEEDED(res)) std::cout << "The CPU usage is: " << cpuUsage << "%" << std::endl; } }}
// Display system RAM (in MB)void ShowSystemRAM(IADLXSystemMetricsSupportPtr systemMetricsSupport, IADLXSystemMetricsPtr systemMetrics){ adlx_bool supported = false; // Display system RAM usage support status ADLX_RESULT res = systemMetricsSupport->IsSupportedSystemRAM(&supported); if (ADLX_SUCCEEDED(res)) { std::cout << "System RAM usage support status: " << supported << std::endl; if (supported) { adlx_int systemRAM = 0; res = systemMetrics->SystemRAM(&systemRAM); if (ADLX_SUCCEEDED(res)) std::cout << "The system RAM is: " << systemRAM << "MB" << std::endl; } }}
// Show SmartShiftvoid ShowSmartShift(IADLXSystemMetricsSupportPtr systemMetricsSupport, IADLXSystemMetricsPtr systemMetrics){ adlx_bool supported = false; // Display SmartShift support status ADLX_RESULT res = systemMetricsSupport->IsSupportedSmartShift(&supported); if (ADLX_SUCCEEDED(res)) { std::cout << "SmartShift support status: " << supported << std::endl; if (supported) { adlx_int smartShift; res = systemMetrics->SmartShift(&smartShift); if (ADLX_SUCCEEDED(res)) std::cout << "The SmartShift is: " << smartShift << std::endl; } }}
// Show SmartShift Maxvoid ShowSmartShiftMax(IADLXSystemMetricsSupportPtr systemMetricsSupport, IADLXSystemMetricsPtr systemMetrics){ adlx_bool supported = false; IADLXSystemMetricsSupport1Ptr sysMetricsSupport1(systemMetricsSupport); IADLXSystemMetrics1Ptr sysMetrics1(systemMetrics); if (!sysMetricsSupport1) { std::cout << "\tGet IADLXSystemMetricsSupport1Ptr failed" << std::endl; return; } if (!sysMetrics1) { std::cout << "\tGet IADLXSystemMetrics1Ptr failed" << std::endl; return; }
// Display power distribution support status ADLX_RESULT res = sysMetricsSupport1->IsSupportedPowerDistribution(&supported); if (ADLX_SUCCEEDED(res)) { std::cout << "PowerDistribution support status: " << supported << std::endl; if (supported) { int apuShiftValue, gpuShiftValue, apuShiftLimit, gpuShiftLimit, totalShiftLimit; res = sysMetrics1->PowerDistribution(&apuShiftValue, &gpuShiftValue, &apuShiftLimit, &gpuShiftLimit, &totalShiftLimit); if (ADLX_SUCCEEDED(res)) std::cout << "The PowerDistribution is:\n" << " apuShiftValue: " << apuShiftValue << " ,gpuShiftValue: " << gpuShiftValue << " ,apuShiftLimit: " << apuShiftLimit << " ,gpuShiftLimit: " << gpuShiftLimit << " ,totalShiftLimit: " << totalShiftLimit << std::endl; } }}
// Display current system metricsvoid ShowCurrentSystemMetrics(IADLXPerformanceMonitoringServicesPtr perfMonitoringServices){ // Get system metrics support IADLXSystemMetricsSupportPtr systemMetricsSupport; ADLX_RESULT res1 = perfMonitoringServices->GetSupportedSystemMetrics(&systemMetricsSupport);
// Accumulate and display current metrics for each of the 10 loops IADLXSystemMetricsPtr systemMetrics; for (int i = 0; i < 10; ++i) { // Clear screen system("cls"); // Get current system metrics ADLX_RESULT res2 = perfMonitoringServices->GetCurrentSystemMetrics(&systemMetrics);
// Display timestamp, CPU usage, system RAM, and SmartShift if (ADLX_SUCCEEDED(res1) && ADLX_SUCCEEDED(res2)) { std::cout << "The current system metrics: " << std::endl; std::cout << std::boolalpha; // Display boolean variable as true or false GetTimeStamp(systemMetrics); ShowCPUUsage(systemMetricsSupport, systemMetrics); ShowSystemRAM(systemMetricsSupport, systemMetrics); ShowSmartShift(systemMetricsSupport, systemMetrics); ShowSmartShiftMax(systemMetricsSupport, systemMetrics); std::cout << std::noboolalpha; } Sleep(1000); }
MainMenu();}
// Display historical system metricsvoid ShowHistoricalSystemMetrics(IADLXPerformanceMonitoringServicesPtr perfMonitoringServices){ // Clear historical performance metrics data ADLX_RESULT res = perfMonitoringServices->ClearPerformanceMetricsHistory(); if (ADLX_FAILED(res)) { std::cout << "Clear historical data failed" << std::endl; return; }
// Get current max historical size (in s) adlx_int maxHistorySize = 0; res = perfMonitoringServices->GetMaxPerformanceMetricsHistorySize(&maxHistorySize); if (ADLX_SUCCEEDED(res)) std::cout << "The current max historical size is: " << maxHistorySize << "s" << std::endl; // Get the configurable maximum historical size range ADLX_IntRange range; res = perfMonitoringServices->GetMaxPerformanceMetricsHistorySizeRange(&range); if (ADLX_SUCCEEDED(res)) std::cout << "The range of max historical size is: (" << range.minValue << ", " << range.maxValue << ")s" << std::endl; // Change max historical size to minimum value res = perfMonitoringServices->SetMaxPerformanceMetricsHistorySize(range.minValue); if (ADLX_SUCCEEDED(res)) { perfMonitoringServices->GetMaxPerformanceMetricsHistorySize(&maxHistorySize); std::cout << "Set max historical size to minimum value successfully, the current max historical is: " << maxHistorySize << "s" << std::endl; }
// Get current sampling interval (in ms) adlx_int samplingInterval = 0; res = perfMonitoringServices->GetSamplingInterval(&samplingInterval); if (ADLX_SUCCEEDED(res)) std::cout << "The current sampling interval is: " << samplingInterval << "ms" << std::endl; // Get the sampling interval range. The sampling interval must be set within this range. res = perfMonitoringServices->GetSamplingIntervalRange(&range); if (ADLX_SUCCEEDED(res)) std::cout << "The range of sampling interval is: (" << range.minValue << ", " << range.maxValue << ")ms" << std::endl; // Change sampling interval to minimum value res = perfMonitoringServices->SetSamplingInterval(range.minValue); if (ADLX_SUCCEEDED(res)) { perfMonitoringServices->GetSamplingInterval(&samplingInterval); std::cout << "Set sampling interval to minimum value successfully, the current sampling interval is: " << samplingInterval << "ms" << std::endl; }
// Start tracking performance metrics res = perfMonitoringServices->StartPerformanceMetricsTracking(); if (ADLX_FAILED(res)) { std::cout << "Start tracking performance metrics failed" << std::endl; return; }
// Wait for 10 seconds to accumulate metrics std::cout << "Wait for 10 seconds to accumulate metrics..." << std::endl; Sleep(10000);
// Check the current performance metrics historical size (in s) upon accumulation adlx_int currentHistorySize = 0; res = perfMonitoringServices->GetCurrentPerformanceMetricsHistorySize(¤tHistorySize); if (ADLX_SUCCEEDED(res)) std::cout << "The current historical size is: " << currentHistorySize << "s" << std::endl;
// Get system metrics history from 10 seconds ago(10000 ms: the first parameter) to the present time(0 ms: the second parameter) IADLXSystemMetricsListPtr systemMetricsList; res = perfMonitoringServices->GetSystemMetricsHistory(10000, 0, &systemMetricsList); if (ADLX_SUCCEEDED(res)) { // Get the system metrics support IADLXSystemMetricsSupportPtr systemMetricsSupport; ADLX_RESULT res1 = perfMonitoringServices->GetSupportedSystemMetrics(&systemMetricsSupport);
// Display all the system metrics in the list IADLXSystemMetricsPtr systemMetrics; for (int i = systemMetricsList->Begin(); i != systemMetricsList->End(); ++i) { std::cout << "********** historical system metrics " << i + 1 << ": **********" << std::endl; ADLX_RESULT res2 = systemMetricsList->At(i, &systemMetrics); // Display first system metrics time stamp, CPU usage, system RAM, and SmartShift if (ADLX_SUCCEEDED(res1) && ADLX_SUCCEEDED(res2)) { std::cout << std::boolalpha; // Display boolean variable as true or false GetTimeStamp(systemMetrics); ShowCPUUsage(systemMetricsSupport, systemMetrics); ShowSystemRAM(systemMetricsSupport, systemMetrics); ShowSmartShift(systemMetricsSupport, systemMetrics); ShowSmartShiftMax(systemMetricsSupport, systemMetrics); std::cout << std::noboolalpha; } std::cout << std::endl; } }
// Stop tracking performance metrics res = perfMonitoringServices->StopPerformanceMetricsTracking(); if (ADLX_FAILED(res)) { std::cout << "Stop tracking performance metrics failed" << std::endl; return; }}