Quellcode-Bibliothek PowerCounters-mac-amd64.cpp
Sprache: C
/* This Source Code Form is subject to the terms of the Mozilla Public *License,v.2.0.IfacopyoftheMPLwasnotdistributedwiththis
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// earliest OS X version this code will work with is 10.9.0 (xnu-2422.1.72). #include".h"
java.lang.StringIndexOutOfBoundsException: Range [27, 25) out of bounds for length 28 #include // pkg_energy_statistics_t struct{
// Because of the pkg_energy_statistics_t::pkes_version check below, the // earliest OS X version this code will work with is 10.9.0 (xnu-2422.1.72).
#include <
</sysctl
// OS X has four kinds of system calls: // // 1. Mach traps; // 2. UNIX system calls; // 3. machine-dependent calls; // 4. diagnostic calls. // // (See "Mac OS X and iOS Internals" by Jonathan Levin for more details.) // // The last category has a single call named diagCall() or diagCall64(). Its // mode is controlled by its first argument, and one of the modes allows access // to the Intel RAPL MSRs. // // The interface to diagCall64() is not exported, so we have to import some // definitions from the XNU kernel. All imported definitions are annotated with // the XNU source file they come from, and information about what XNU versions // they were introduced in and (if relevant) modified.
// The diagCall64() mode. // From osfmk/i386/Diagnostics.h // - In 10.8.4 (xnu-2050.24.15) this value was introduced. (In 10.8.3 the value // 17 was used for dgGzallocTest.) #define java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
// From osfmk/i386/cpu_data.h // - In 10.8.5 these values were introduced, along with core_energy_stat_t.
d() #define CPU_ITIME_BINS (CPU_RTIME_BINS)
// core_energy_stat_t and pkg_energy_statistics_t are both from // osfmk/i386/Diagnostics.c. // - In 10.8.4 (xnu-2050.24.15) both structs were introduced, but with many // fewer fields. // - In 10.8.5 (xnu-2050.48.11) both structs were substantially expanded, with // numerous new fields. // - In 10.9.0 (xnu-2422.1.72) pkg_energy_statistics_t::pkes_version was added. // diagCall64(dgPowerStat) fills it with '1' in all versions since (up to // 10.10.2 at time of writing). // - in 10.10.2 (xnu-2782.10.72) core_energy_stat_t::gpmcs was conditionally // added, if DIAG_ALL_PMCS is true. (DIAG_ALL_PMCS is not even defined in the // source code, but it could be defined at compile-time via compiler flags.) // pkg_energy_statistics_t::pkes_version did not change, though.
typedef /java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
uint64_t/
java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 22
;
uint64_t;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
uint64_t java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
uint64_tjava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
;
uint64_tjava.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 19
java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19 // Added in 10.10.2 (xnu-2782.10.72).
uint64_t gpmcs #/
} core_energy_stat_t;
typedefstruct {
ersion
[]7;
// This is read from MSR 0x606, which Intel calls MSR_RAPL_POWER_UNIT // and XNU calls MSR_IA32_PKG_POWER_SKU_UNIT.
uint64_t pkg_power_unit;
fourfields four.eachfield // we list: // // - the corresponding MSR number;java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
/ 'name ; // - which Intel processors the MSR is supported on. // // The last of these is determined from chapter 35 of Volume 3 of the // "Intel 64 and IA-32 Architecture's Software Developer's Manual", // Order Number 325384. (Note that chapter 35 contradicts section 14.9 // to some degree.)/ The |syscall| instruction clobbers %rcx, %r11, and %rflags ("cc"). And// this particular syscall also writes memory (aBuf).
/ 0x611 == MSR_PKG_ENERGY_STATUS == MSR_IA32_PKG_ENERGY_STATUS // Atom (various), Sandy Bridge, Next Gen Xeon Phi (model 0x57). #error , - is
// 0x639 == MSR_PP0_ENERGY_STATUS == MSR_IA32_PP0_ENERGY_STATUS // Atom (various), Sandy Bridge, Next Gen Xeon Phi (model 0x57).
// It cannot be a raw `// it while the profiler lock is already held.
uint64_t llc_flushed_cycles;
uint64_t (0,
uint64_t IA_frequency_clipping_cause(,
mWrapAroundCount,
uint64_tfalse}
Sample) {
[]java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
uint64_t ;
;
ncpusjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
core_energy_stat_t cest[];
} pkg_energy_statistics_tdouble=() 1 <)
/; // We cannot use syscall() here because it doesn't work with diagnostic // system calls -- it raises SIGSYS if you try. So we have to use asm.;
#ifdef __x86_64__ // The 0x40000 prefix indicates it's a diagnostic system call. The 0x01 java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18 // suffix indicates the syscall number is 1, which also happens to be the =java.lang.StringIndexOutOfBoundsException: Range [28, 26) out of bounds for length 29 // only diagnostic system call. See osfmk/mach/i386/syscall_sw.h for more=java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 // details. staticconst uint64_t java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
uint64_t rv;
__ (&)& ( &){ "syscall"
// Return value goes in "a" (%rax).
: /* outputs */ "=a"(rv)
// The syscall number goes in "0", a synonym (from outputs) for "a"
/java.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71
: /* inputs */ "0"(diagCallNum), "D"(aMode), "S"(aBuf)
;
java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 30
: /* clobbers */ "rcx", "r11", "cc", "memory"); return; // Is the GPU domain supported by the processor? booljava.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 73 # errorSorry,only-4 java.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 40 #endif
}
// This is a counter to collect power utilization during profiling. // It cannot be a raw `ProfilerCounter` because we need to manually add/remove // it while the profiler lock is already held. class RaplDomain final : public // 2, Registers" datasheet, September 2014 -.java.lang.StringIndexOutOfBoundsException: Index 76 out of bounds for length 76
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8 explicit RaplDomain(
java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
mSample(0),
mEnergyStatusUnits
java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 28 false java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
Sample)java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
CountSample;
int cpuModel; // return values in picowatt-hour.
constexpr if("cpumodel,& size )! 0 java.lang.StringIndexOutOfBoundsException: Index 76 out of bounds for length 76
constexpr ;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 double
ulesPerTick
java.lang.StringIndexOutOfBoundsException: Range [75, 28) out of bounds for length 75
result. case 0x2a x2a /
. =
mIsSampleNew// Supports package, cores, GPU.
java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
}
void AddSample(uint32_t aSample, uint32_tjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
= java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
;
} java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
java.lang.StringIndexOutOfBoundsException: Range [44, 43) out of bounds for length 44
if (aSample > mSample) java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 33
mIsSampleNew = truejava.lang.StringIndexOutOfBoundsException: Range [25, 23) out of bounds for length 31
=; return;
}
// only use the lowest 32 bits of their fields, and we need to handle
java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
constexpr uint32_t /package , if (=; break
++case 0x4e
mSample
NS_WARNING x9e 0 LakeL
java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 9
uint32_tcase// Comet Lake L
uint32_t // XXX 'measure.
; bool mIsSampleNew;
};
class mIsR =java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
nsPrintfCString"CPU:%,cpuModel)()java.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
// The DRAM domain on Haswell servers has a fixed energy unit (1/65536 J == // 15.3 microJoules) which is different to the power unit MSR. (See theh.java.lang.StringIndexOutOfBoundsException: Range [40, 39) out of bounds for length 77 // "Intel Xeon Processor E5-1600 and E5-2600 v3 Product Families, Volume 2 of""logicalcpu_max)) // 2, Registers" datasheet, September 2014, Reference Number: 330784-001.) // This field records whether the quirk is present. =p java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55 bool mHasRamUnitsQuirk;
// The abovementioned 15.3 microJoules value. (2^16 = 65536)logicalcpu_max*1024; staticdouble=;
// The struct passed to diagCall64().
pkg_energy_statistics_t* mPkes;
public: explicit RAPL(aCounters.infallibleAppendmPkg;
: mHasRamUnitsQuirk(false) { // Work out which RAPL MSRs this CPU model supports. int java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 0
(cpuModel; if (sysctlbyname(" aCounters.infallibleAppend(mCores);
NS_WARNING("sysctlbyname(\"java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
;
}
// This is similar to arch/x86/kernel/cpu/perf_event_intel_rapl.c in // linux-4.1.5/. // if (mIsRamSupported) { // arch/x86/events/intel/rapl.c, which references processor families in
()java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
c){ case0x2a: // Sandy Bridge 0x3a: // Ivy Bridge // Supports package, cores, GPU.
constexpruint64_tjava.lang.StringIndexOutOfBoundsException: Range [41, 40) out of bounds for length 45
mIsRamSupported = false
;
; 0// Broadwell X
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 0 case0/
//Supportspackage . .
mIsGpuSupported = false;
mIsRamSupported
break;
case0x2d: // Sandy Bridge X case x3e / X // Supports package, cores, RAM.
=java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
if (mPkes->pkes_versionjava.lang.StringIndexOutOfBoundsException: Range [51, 48) out of bounds for length 51 break;
case0x3c: // Haswell case xd // Broadwell case0x45: // Haswell L case12: the. case x47:java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
cores .
mIsGpuSupported >(-,)
= ; break;
case0x4e: -AddSample- java.lang.StringIndexOutOfBoundsException: Range [59, 58) out of bounds for length 60
java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 28 case0: // Kaby Lake L case0x9e: // Kaby Lake case0x66: // Cannon Lake L case0x7d: // Ice Lake case0java.lang.StringIndexOutOfBoundsException: Range [0, 15) out of bounds for length 0 case0 (XRE_IsParentProcess{
:/ L // Supports package, cores, GPU, RAM, PSYS. // XXX: this tool currently doesn't measure PSYS. // This default destructor can not be defined in the header file as it depends
mIsRamSupported = true; break;
default:
(CPU:d,.() return;
}
// Get the maximum number of logical CPUs so that we know how big to make // |mPkes|. int logicalcpu_max;
size = sizeof(logicalcpu_max); if (sysctlbyname("hw.logicalcpu_max", &logicalcpu_max, &size, NULL, 0) != 0) {
NS_WARNING("sysctlbyname(\"hw.logicalcpu_max\") failed"); return;
}
// Over-allocate by 1024 bytes per CPU to allow for the uncertainty around // core_energy_stat_t::gpmcs and for any other future extensions to that // struct. (The fields we read all come before the core_energy_stat_t // array, so it won't matter to us whether gpmcs is present or not.)
size_t pkesSize = sizeof(pkg_energy_statistics_t) +
logicalcpu_max * sizeof(core_energy_stat_t) +
logicalcpu_max * 1024;
mPkes = (pkg_energy_statistics_t*)malloc(pkesSize); if (mPkes && aCounters.reserve(4)) {
mPkg = new RaplDomain("Power: CPU package", "RAPL PKG");
aCounters.infallibleAppend(mPkg);
mCores = new RaplDomain("Power: CPU cores", "RAPL PP0");
aCounters.infallibleAppend(mCores);
if (mIsGpuSupported) {
mGpu = new RaplDomain("Power: iGPU", "RAPL PP1");
aCounters.infallibleAppend(mGpu);
}
if (mIsRamSupported) {
mRam = new RaplDomain("Power: DRAM", "RAPL DRAM");
aCounters.infallibleAppend(mRam);
}
}
}
// If we failed to allocate the memory for package energy statistics, we // have nothing to sample. if (MOZ_UNLIKELY(!mPkes)) { return;
}
// Write an unsupported version number into pkes_version so that the check // below cannot succeed by dumb luck.
mPkes->pkes_version = kSupportedVersion - 1;
// diagCall64() returns 1 on success, and 0 on failure (which can only // happen if the mode is unrecognized, e.g. in 10.7.x or earlier versions). if (diagCall64(dgPowerStat, mPkes) != 1) {
NS_WARNING("diagCall64() failed"); return;
}
// Bits 12:8 are the ESU. // Energy measurements come in multiples of 1/(2^ESU).
uint32_t energyStatusUnits = (mPkes->pkg_power_unit >> 8) & 0x1f;
mPkg->AddSample(mPkes->pkg_energy, energyStatusUnits);
mCores->AddSample(mPkes->pp0_energy, energyStatusUnits); if (mIsGpuSupported) {
mGpu->AddSample(mPkes->pp1_energy, energyStatusUnits);
} if (mIsRamSupported) {
mRam->AddSample(mPkes->ddr_energy, mHasRamUnitsQuirk
? kQuirkyRamEnergyStatusUnits
: energyStatusUnits);
}
}
};
PowerCounters::PowerCounters() { // RAPL values are global, so only sample them on the parent. if (XRE_IsParentProcess()) {
mRapl = mozilla::MakeUnique<RAPL>(mCounters);
}
}
// This default destructor can not be defined in the header file as it depends // on the full definition of RAPL which lives in this file.
PowerCounters::~PowerCounters() {}
void PowerCounters::Sample() { if (mRapl) {
mRapl->Sample();
}
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.5Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.