// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "stdafx.h" #include "power_sampler.h" // These correspond to the funcID values returned by GetMsrFunc const int MSR_FUNC_FREQ = 0; const int MSR_FUNC_POWER = 1; const int MSR_FUNC_TEMP = 2; const int MSR_FUNC_MAX_POWER = 3; /* ????? */ void PowerSampler::SampleCPUPowerState() { if (!IntelEnergyLibInitialize || !GetNumMsrs || !GetMsrName || !GetMsrFunc || !GetPowerData || !ReadSample) { return; } int num_MSRs = 0; GetNumMsrs(&num_MSRs); ReadSample(); for (int i = 0; i < num_MSRs; ++i) { int func_id; wchar_t MSR_name[1024]; GetMsrFunc(i, &func_id); int nData; double data[3] = {}; GetPowerData(0, i, data, &nData); if (func_id == MSR_FUNC_POWER) { // data[0] is Power (W) // data[1] is Energy (J) // data[2] is Energy (mWh) // Round to nearest .0001 to avoid distracting excess precision. GetMsrName(i, MSR_name); power_[MSR_name] = round(data[0] * 10000) / 10000; } } } PowerSampler::PowerSampler() { // If Intel Power Gadget is installed then use it to get CPU power data. #if _M_X64 PCWSTR dllName = L"\\EnergyLib64.dll"; #else PCWSTR dllName = L"\\EnergyLib32.dll"; #endif #pragma warning(disable : 4996) PCWSTR powerGadgetDir = _wgetenv(L"IPG_Dir"); if (powerGadgetDir) energy_lib_ = LoadLibrary((std::wstring(powerGadgetDir) + dllName).c_str()); if (energy_lib_) { IntelEnergyLibInitialize = (IntelEnergyLibInitialize_t)GetProcAddress( energy_lib_, "IntelEnergyLibInitialize"); GetNumMsrs = (GetNumMsrs_t)GetProcAddress(energy_lib_, "GetNumMsrs"); GetMsrName = (GetMsrName_t)GetProcAddress(energy_lib_, "GetMsrName"); GetMsrFunc = (GetMsrFunc_t)GetProcAddress(energy_lib_, "GetMsrFunc"); GetPowerData = (GetPowerData_t)GetProcAddress(energy_lib_, "GetPowerData"); ReadSample = (ReadSample_t)GetProcAddress(energy_lib_, "ReadSample"); if (IntelEnergyLibInitialize && ReadSample) { IntelEnergyLibInitialize(); ReadSample(); } } } PowerSampler::~PowerSampler() { if (energy_lib_) FreeLibrary(energy_lib_); }