1 // Copyright (c) 2014, Intel Corporation
2 // All rights reserved.
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
14 // * Neither the name of Intel Corporation nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include "PowerGadgetLib.h"
38 HMODULE g_hModule
= NULL
;
40 static bool split(const wstring
& s
, wstring
&path
)
43 vector
<wstring
> output
;
45 wstring::size_type prev_pos
= 0, pos
= 0;
47 while((pos
= s
.find(L
';', pos
)) != wstring::npos
)
49 wstring
substring( s
.substr(prev_pos
, pos
-prev_pos
) );
50 if (substring
.find(L
"Power Gadget 2.") != wstring::npos
)
61 wstring
substring(s
.substr(prev_pos
, pos
-prev_pos
));
63 if (substring
.find(L
"Power Gadget 2.") != wstring::npos
)
72 basic_string
<char>::size_type pos
= path
.rfind(L
" ");
73 wstring version
= path
.substr(pos
+1, path
.length());
74 double fVer
= _wtof(version
.c_str());
82 static bool GetLibraryLocation(wstring
& strLocation
)
84 TCHAR
*pszPath
= _wgetenv(L
"IPG_Dir");
85 if (pszPath
== NULL
|| wcslen(pszPath
) == 0)
88 TCHAR
*pszVersion
= _wgetenv(L
"IPG_Ver");
89 if (pszVersion
== NULL
|| wcslen(pszVersion
) == 0)
92 int version
= _wtof(pszVersion
) * 100;
96 strLocation
= wstring(pszPath
) + L
"\\EnergyLib64.dll";
98 strLocation
= wstring(pszPath
) + L
"\\EnergyLib32.dll";
106 CIntelPowerGadgetLib::CIntelPowerGadgetLib(void) :
111 pGetIAFrequency(NULL
),
113 pGetMaxTemperature(NULL
),
114 pGetTemperature(NULL
),
118 pGetTimeInterval(NULL
),
119 pGetBaseFrequency(NULL
),
126 if (GetLibraryLocation(strLocation
) == false)
128 g_lastError
= "Intel Power Gadget 2.7 or higher not found. If unsure, check if the path is in the user's path environment variable";
132 g_hModule
= LoadLibrary(strLocation
.c_str());
133 if (g_hModule
== NULL
)
135 g_lastError
= "LoadLibrary failed";
139 pInitialize
= (IPGInitialize
) GetProcAddress(g_hModule
, "IntelEnergyLibInitialize");
140 pGetNumNodes
= (IPGGetNumNodes
) GetProcAddress(g_hModule
, "GetNumNodes");
141 pGetMsrName
= (IPGGetMsrName
) GetProcAddress(g_hModule
, "GetMsrName");
142 pGetMsrFunc
= (IPGGetMsrFunc
) GetProcAddress(g_hModule
, "GetMsrFunc");
143 pGetIAFrequency
= (IPGGetIAFrequency
) GetProcAddress(g_hModule
, "GetIAFrequency");
144 pGetTDP
= (IPGGetTDP
) GetProcAddress(g_hModule
, "GetTDP");
145 pGetMaxTemperature
= (IPGGetMaxTemperature
) GetProcAddress(g_hModule
, "GetMaxTemperature");
146 pGetTemperature
= (IPGGetTemperature
) GetProcAddress(g_hModule
, "GetTemperature");
147 pReadSample
= (IPGReadSample
) GetProcAddress(g_hModule
, "ReadSample");
148 pGetSysTime
= (IPGGetSysTime
) GetProcAddress(g_hModule
, "GetSysTime");
149 pGetRDTSC
= (IPGGetRDTSC
) GetProcAddress(g_hModule
, "GetRDTSC");
150 pGetTimeInterval
= (IPGGetTimeInterval
) GetProcAddress(g_hModule
, "GetTimeInterval");
151 pGetBaseFrequency
= (IPGGetBaseFrequency
) GetProcAddress(g_hModule
, "GetBaseFrequency");
152 pGetPowerData
= (IPGGetPowerData
) GetProcAddress(g_hModule
, "GetPowerData");
153 pStartLog
= (IPGStartLog
) GetProcAddress(g_hModule
, "StartLog");
154 pStopLog
= (IPGStopLog
) GetProcAddress(g_hModule
, "StopLog");
155 pGetNumMsrs
= (IPGGetNumMsrs
) GetProcAddress(g_hModule
, "GetNumMsrs");
159 CIntelPowerGadgetLib::~CIntelPowerGadgetLib(void)
161 if (g_hModule
!= NULL
)
162 FreeLibrary(g_hModule
);
167 string
CIntelPowerGadgetLib::GetLastError()
172 bool CIntelPowerGadgetLib::IntelEnergyLibInitialize(void)
174 if (pInitialize
== NULL
)
177 bool bSuccess
= pInitialize();
180 g_lastError
= "Initializing the energy library failed";
188 bool CIntelPowerGadgetLib::GetNumNodes(int * nNodes
)
190 return pGetNumNodes(nNodes
);
193 bool CIntelPowerGadgetLib::GetNumMsrs(int * nMsrs
)
195 return pGetNumMsrs(nMsrs
);
198 bool CIntelPowerGadgetLib::GetMsrName(int iMsr
, wchar_t *pszName
)
200 return pGetMsrName(iMsr
, pszName
);
203 bool CIntelPowerGadgetLib::GetMsrFunc(int iMsr
, int *funcID
)
205 return pGetMsrFunc(iMsr
, funcID
);
208 bool CIntelPowerGadgetLib::GetIAFrequency(int iNode
, int *freqInMHz
)
210 return pGetIAFrequency(iNode
, freqInMHz
);
213 bool CIntelPowerGadgetLib::GetTDP(int iNode
, double *TDP
)
215 return pGetTDP(iNode
, TDP
);
218 bool CIntelPowerGadgetLib::GetMaxTemperature(int iNode
, int *degreeC
)
220 return pGetMaxTemperature(iNode
, degreeC
);
223 bool CIntelPowerGadgetLib::GetTemperature(int iNode
, int *degreeC
)
225 return pGetTemperature(iNode
, degreeC
);
228 bool CIntelPowerGadgetLib::ReadSample()
230 bool bSuccess
= pReadSample();
231 if (bSuccess
== false)
232 g_lastError
= "MSR overflowed. You can safely discard this sample";
236 bool CIntelPowerGadgetLib::GetSysTime(SYSTEMTIME
*sysTime
)
238 return pGetSysTime(sysTime
);
241 bool CIntelPowerGadgetLib::GetRDTSC(UINT64
*TSC
)
243 return pGetRDTSC(TSC
);
246 bool CIntelPowerGadgetLib::GetTimeInterval(double *offset
)
248 return pGetTimeInterval(offset
);
251 bool CIntelPowerGadgetLib::GetBaseFrequency(int iNode
, double *baseFrequency
)
253 return pGetBaseFrequency(iNode
, baseFrequency
);
256 bool CIntelPowerGadgetLib::GetPowerData(int iNode
, int iMSR
, double *results
, int *nResult
)
258 return pGetPowerData(iNode
, iMSR
, results
, nResult
);
261 bool CIntelPowerGadgetLib::StartLog(wchar_t *szFilename
)
263 return pStartLog(szFilename
);
266 bool CIntelPowerGadgetLib::StopLog()