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"
36 HMODULE g_hModule
= NULL
;
38 static bool split(const wstring
& s
, wstring
&path
)
41 vector
<wstring
> output
;
43 wstring::size_type prev_pos
= 0, pos
= 0;
45 while((pos
= s
.find(L
';', pos
)) != wstring::npos
)
47 wstring
substring( s
.substr(prev_pos
, pos
-prev_pos
) );
48 if (substring
.find(L
"Power Gadget 2.") != wstring::npos
)
59 wstring
substring(s
.substr(prev_pos
, pos
-prev_pos
));
61 if (substring
.find(L
"Power Gadget 2.") != wstring::npos
)
70 basic_string
<char>::size_type pos
= path
.rfind(L
" ");
71 wstring version
= path
.substr(pos
+1, path
.length());
72 double fVer
= _wtof(version
.c_str());
80 static bool GetLibraryLocation(wstring
& strLocation
)
82 TCHAR
*pszPath
= _wgetenv(L
"IPG_Dir");
83 if (pszPath
== NULL
|| wcslen(pszPath
) == 0)
86 TCHAR
*pszVersion
= _wgetenv(L
"IPG_Ver");
87 if (pszVersion
== NULL
|| wcslen(pszVersion
) == 0)
90 int version
= _wtof(pszVersion
) * 100;
94 strLocation
= wstring(pszPath
) + L
"\\EnergyLib64.dll";
96 strLocation
= wstring(pszPath
) + L
"\\EnergyLib32.dll";
104 CIntelPowerGadgetLib::CIntelPowerGadgetLib(void) :
110 pGetIAFrequency(NULL
),
112 pGetMaxTemperature(NULL
),
113 pGetTemperature(NULL
),
117 pGetTimeInterval(NULL
),
118 pGetBaseFrequency(NULL
),
124 if (GetLibraryLocation(strLocation
) == false)
126 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";
130 g_hModule
= LoadLibrary(strLocation
.c_str());
131 if (g_hModule
== NULL
)
133 g_lastError
= "LoadLibrary failed";
137 pInitialize
= (IPGInitialize
) GetProcAddress(g_hModule
, "IntelEnergyLibInitialize");
138 pGetNumNodes
= (IPGGetNumNodes
) GetProcAddress(g_hModule
, "GetNumNodes");
139 pGetMsrName
= (IPGGetMsrName
) GetProcAddress(g_hModule
, "GetMsrName");
140 pGetMsrFunc
= (IPGGetMsrFunc
) GetProcAddress(g_hModule
, "GetMsrFunc");
141 pGetIAFrequency
= (IPGGetIAFrequency
) GetProcAddress(g_hModule
, "GetIAFrequency");
142 pGetTDP
= (IPGGetTDP
) GetProcAddress(g_hModule
, "GetTDP");
143 pGetMaxTemperature
= (IPGGetMaxTemperature
) GetProcAddress(g_hModule
, "GetMaxTemperature");
144 pGetTemperature
= (IPGGetTemperature
) GetProcAddress(g_hModule
, "GetTemperature");
145 pReadSample
= (IPGReadSample
) GetProcAddress(g_hModule
, "ReadSample");
146 pGetSysTime
= (IPGGetSysTime
) GetProcAddress(g_hModule
, "GetSysTime");
147 pGetRDTSC
= (IPGGetRDTSC
) GetProcAddress(g_hModule
, "GetRDTSC");
148 pGetTimeInterval
= (IPGGetTimeInterval
) GetProcAddress(g_hModule
, "GetTimeInterval");
149 pGetBaseFrequency
= (IPGGetBaseFrequency
) GetProcAddress(g_hModule
, "GetBaseFrequency");
150 pGetPowerData
= (IPGGetPowerData
) GetProcAddress(g_hModule
, "GetPowerData");
151 pStartLog
= (IPGStartLog
) GetProcAddress(g_hModule
, "StartLog");
152 pStopLog
= (IPGStopLog
) GetProcAddress(g_hModule
, "StopLog");
153 pGetNumMsrs
= (IPGGetNumMsrs
) GetProcAddress(g_hModule
, "GetNumMsrs");
157 CIntelPowerGadgetLib::~CIntelPowerGadgetLib(void)
159 if (g_hModule
!= NULL
)
160 FreeLibrary(g_hModule
);
165 string
CIntelPowerGadgetLib::GetLastError()
170 bool CIntelPowerGadgetLib::IntelEnergyLibInitialize(void)
172 if (pInitialize
== NULL
)
175 bool bSuccess
= pInitialize();
178 g_lastError
= "Initializing the energy library failed";
186 bool CIntelPowerGadgetLib::GetNumNodes(int * nNodes
)
188 return pGetNumNodes(nNodes
);
191 bool CIntelPowerGadgetLib::GetNumMsrs(int * nMsrs
)
193 return pGetNumMsrs(nMsrs
);
196 bool CIntelPowerGadgetLib::GetMsrName(int iMsr
, wchar_t *pszName
)
198 return pGetMsrName(iMsr
, pszName
);
201 bool CIntelPowerGadgetLib::GetMsrFunc(int iMsr
, int *funcID
)
203 return pGetMsrFunc(iMsr
, funcID
);
206 bool CIntelPowerGadgetLib::GetIAFrequency(int iNode
, int *freqInMHz
)
208 return pGetIAFrequency(iNode
, freqInMHz
);
211 bool CIntelPowerGadgetLib::GetTDP(int iNode
, double *TDP
)
213 return pGetTDP(iNode
, TDP
);
216 bool CIntelPowerGadgetLib::GetMaxTemperature(int iNode
, int *degreeC
)
218 return pGetMaxTemperature(iNode
, degreeC
);
221 bool CIntelPowerGadgetLib::GetTemperature(int iNode
, int *degreeC
)
223 return pGetTemperature(iNode
, degreeC
);
226 bool CIntelPowerGadgetLib::ReadSample()
228 bool bSuccess
= pReadSample();
229 if (bSuccess
== false)
230 g_lastError
= "MSR overflowed. You can safely discard this sample";
234 bool CIntelPowerGadgetLib::GetSysTime(SYSTEMTIME
*sysTime
)
236 return pGetSysTime(sysTime
);
239 bool CIntelPowerGadgetLib::GetRDTSC(UINT64
*TSC
)
241 return pGetRDTSC(TSC
);
244 bool CIntelPowerGadgetLib::GetTimeInterval(double *offset
)
246 return pGetTimeInterval(offset
);
249 bool CIntelPowerGadgetLib::GetBaseFrequency(int iNode
, double *baseFrequency
)
251 return pGetBaseFrequency(iNode
, baseFrequency
);
254 bool CIntelPowerGadgetLib::GetPowerData(int iNode
, int iMSR
, double *results
, int *nResult
)
256 return pGetPowerData(iNode
, iMSR
, results
, nResult
);
259 bool CIntelPowerGadgetLib::StartLog(wchar_t *szFilename
)
261 return pStartLog(szFilename
);
264 bool CIntelPowerGadgetLib::StopLog()