DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (31ec81b5d7bb)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
/*
 * Copyright 2013, Intel Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Author: Joe Olivas <joseph.k.olivas@intel.com>
 */

#ifndef profiler_IntelPowerGadget_h
#define profiler_IntelPowerGadget_h

#ifdef _MSC_VER
typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
#else
#include <stdint.h>
#endif
#include "prlink.h"

typedef int (*IPGInitialize) ();
typedef int (*IPGGetNumNodes) (int *nNodes);
typedef int (*IPGGetNumMsrs) (int *nMsr);
typedef int (*IPGGetMsrName) (int iMsr, wchar_t *szName);
typedef int (*IPGGetMsrFunc) (int iMsr, int *pFuncID);
typedef int (*IPGReadMSR) (int iNode, unsigned int address, uint64_t *value);
typedef int (*IPGWriteMSR) (int iNode, unsigned int address, uint64_t value);
typedef int (*IPGGetIAFrequency) (int iNode, int *freqInMHz);
typedef int (*IPGGetTDP) (int iNode, double *TDP);
typedef int (*IPGGetMaxTemperature) (int iNode, int *degreeC);
typedef int (*IPGGetThresholds) (int iNode, int *degree1C, int *degree2C);
typedef int (*IPGGetTemperature) (int iNode, int *degreeC);
typedef int (*IPGReadSample) ();
typedef int (*IPGGetSysTime) (void *pSysTime);
typedef int (*IPGGetRDTSC) (uint64_t *pTSC);
typedef int (*IPGGetTimeInterval) (double *pOffset);
typedef int (*IPGGetBaseFrequency) (int iNode, double *pBaseFrequency);
typedef int (*IPGGetPowerData) (int iNode, int iMSR, double *pResult, int *nResult);
typedef int (*IPGStartLog) (wchar_t *szFileName);
typedef int (*IPGStopLog) ();

#if defined(__x86_64__) || defined(__x86_64) || defined(_M_AMD64)
#define PG_LIBRARY_NAME "EnergyLib64"
#else
#define PG_LIBRARY_NAME "EnergyLib32"
#endif


class IntelPowerGadget
{
public:

    IntelPowerGadget();
    ~IntelPowerGadget();

    // Fails if initialization is incomplete
    bool Init();

    // Returns the number of packages on the system
    int GetNumberNodes();

    // Returns the number of MSRs being tracked
    int GetNumberMsrs();

    // Given a node, returns the temperature
    int GetCPUFrequency(int);

    // Returns the TDP of the given node
    double GetTdp(int);

    // Returns the maximum temperature for the given node
    int GetMaxTemp(int);

    // Returns the current temperature in degrees C
    // of the given node
    int GetTemp(int);

    // Takes a sample of data. Must be called before
    // any current data is retrieved.
    int TakeSample();

    // Gets the timestamp of the most recent sample
    uint64_t GetRdtsc();

    // returns number of seconds between the last
    // two samples
    double GetInterval();

    // Returns the base frequency for the given node
    double GetCPUBaseFrequency(int node);

    // Returns the combined package power for all
    // packages on the system for the last sample.
    double GetTotalPackagePowerInWatts();
    double GetPackagePowerInWatts(int node);

    // Returns the combined CPU power for all
    // packages on the system for the last sample.
    // If the reading is not available, returns 0.0
    double GetTotalCPUPowerInWatts();
    double GetCPUPowerInWatts(int node);

    // Returns the combined GPU power for all
    // packages on the system for the last sample.
    // If the reading is not available, returns 0.0
    double GetTotalGPUPowerInWatts();
    double GetGPUPowerInWatts(int node);

private:

    PRLibrary *libpowergadget;
    IPGInitialize Initialize;
    IPGGetNumNodes GetNumNodes;
    IPGGetNumMsrs GetNumMsrs;
    IPGGetMsrName GetMsrName;
    IPGGetMsrFunc GetMsrFunc;
    IPGReadMSR ReadMSR;
    IPGWriteMSR WriteMSR;
    IPGGetIAFrequency GetIAFrequency;
    IPGGetTDP GetTDP;
    IPGGetMaxTemperature GetMaxTemperature;
    IPGGetThresholds GetThresholds;
    IPGGetTemperature GetTemperature;
    IPGReadSample ReadSample;
    IPGGetSysTime GetSysTime;
    IPGGetRDTSC GetRDTSC;
    IPGGetTimeInterval GetTimeInterval;
    IPGGetBaseFrequency GetBaseFrequency;
    IPGGetPowerData GetPowerData;
    IPGStartLog StartLog;
    IPGStopLog StopLog;

    int packageMSR;
    int cpuMSR;
    int freqMSR;
    int tempMSR;
};

#endif // profiler_IntelPowerGadget_h