16 std::cout<<
"initialising pmu"<<std::endl;
41 std::cout <<
"Reg "<<std::string(
name)<<
":\n";
42 std::cout <<
" region "<<
tregion<<std::endl;
43 std::cout <<
" cycles "<<
tcycles<<std::endl;
44 std::cout <<
" inst "<<
inst <<std::endl;
45 std::cout <<
" cyc "<<
cyc <<std::endl;
46 std::cout <<
" ref "<<
ref <<std::endl;
47 std::cout <<
" pmc0 "<<
pmc0 <<std::endl;
48 std::cout <<
" pmc1 "<<
pmc1 <<std::endl;
49 std::cout <<
" count "<<
count <<std::endl;
50 std::cout <<
" reads "<<
reads <<std::endl;
51 std::cout <<
" writes "<<
writes <<std::endl;
91 for (
int t = 0; t < nthreads; ++t) {
114#ifdef _KNIGHTS_LANDING_
120#ifdef _KNIGHTS_LANDING_
123 uint64_t emr = 0, emw = 0;
124 for (
int i = 0; i < NEDC; ++i)
136#ifdef _KNIGHTS_LANDING_
142void PmuStat::KNLevsetup(const char *ename, int &fd, int event, int umask)
145 snprintf(fname,
sizeof(fname),
"%s/type", ename);
146 FILE *fp = fopen(fname,
"r");
148 ::printf(
"open %s", fname);
152 int ret = fscanf(fp,
"%d", &type);
157 struct perf_event_attr hw = {};
158 hw.size =
sizeof(hw);
163 hw.config =
event | (umask << 8);
168 fd = perf_event_open(&hw, -1, cpu, -1, 0);
170 ::printf(
"CPU %d, box %s, event 0x%lx", cpu, ename, hw.config);
178void PmuStat::KNLsetup(
void){
184 for (
int mc = 0; mc < NMC; ++mc)
186 ::snprintf(fname,
sizeof(fname),
"/sys/devices/uncore_imc_%d",mc);
188 KNLevsetup(fname, gbl.mc_rd[mc], 0x1, 0x1);
190 KNLevsetup(fname, gbl.mc_wr[mc], 0x2, 0x1);
193 for (
int edc=0; edc < NEDC; ++edc)
195 ::snprintf(fname,
sizeof(fname),
"/sys/devices/uncore_edc_eclk_%d",edc);
197 KNLevsetup(fname, gbl.edc_rd[edc], 0x1, 0x1);
199 KNLevsetup(fname, gbl.edc_wr[edc], 0x2, 0x1);
202 for (
int edc=0; edc < NEDC; ++edc)
204 ::snprintf(fname,
sizeof(fname),
"/sys/devices/uncore_edc_uclk_%d", edc);
205 KNLevsetup(fname, gbl.edc_hite[edc], 0x2, 0x1);
206 KNLevsetup(fname, gbl.edc_hitm[edc], 0x2, 0x2);
207 KNLevsetup(fname, gbl.edc_misse[edc], 0x2, 0x4);
208 KNLevsetup(fname, gbl.edc_missm[edc], 0x2, 0x8);
212uint64_t PmuStat::KNLreadctr(
int fd)
215 size_t s = ::read(fd, &data,
sizeof(data));
216 if (s !=
sizeof(uint64_t)){
217 ::printf(
"read counter %lu", s);
223void PmuStat::KNLreadctrs(ctrs &c)
225 for (
int i = 0; i < NMC; ++i)
227 c.mcrd[i] = KNLreadctr(gbl.mc_rd[i]);
228 c.mcwr[i] = KNLreadctr(gbl.mc_wr[i]);
230 for (
int i = 0; i < NEDC; ++i)
232 c.edcrd[i] = KNLreadctr(gbl.edc_rd[i]);
233 c.edcwr[i] = KNLreadctr(gbl.edc_wr[i]);
235 for (
int i = 0; i < NEDC; ++i)
237 c.edchite[i] = KNLreadctr(gbl.edc_hite[i]);
238 c.edchitm[i] = KNLreadctr(gbl.edc_hitm[i]);
239 c.edcmisse[i] = KNLreadctr(gbl.edc_misse[i]);
240 c.edcmissm[i] = KNLreadctr(gbl.edc_missm[i]);
#define NAMESPACE_BEGIN(A)
static void pmu_fini(void)
uint64_t counters[8][256]
static void xmemctrs(uint64_t *mr, uint64_t *mw)
static bool pmu_initialized
static void pmu_stop(void)
void init(const char *regname)
static void pmu_init(void)
static void pmu_start(void)