mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-10 07:55:35 +00:00
101 lines
2.6 KiB
C
101 lines
2.6 KiB
C
|
#ifndef _GRID_STAT_H
|
||
|
#define _GRID_STAT_H
|
||
|
|
||
|
#ifdef AVX512
|
||
|
#define _KNIGHTS_LANDING_
|
||
|
#endif
|
||
|
|
||
|
#ifdef _KNIGHTS_LANDING_
|
||
|
|
||
|
#define NMC 6
|
||
|
#define NEDC 8
|
||
|
namespace Grid {
|
||
|
struct ctrs
|
||
|
{
|
||
|
uint64_t mcrd[NMC];
|
||
|
uint64_t mcwr[NMC];
|
||
|
uint64_t edcrd[NEDC];
|
||
|
uint64_t edcwr[NEDC];
|
||
|
uint64_t edchite[NEDC];
|
||
|
uint64_t edchitm[NEDC];
|
||
|
uint64_t edcmisse[NEDC];
|
||
|
uint64_t edcmissm[NEDC];
|
||
|
};
|
||
|
// Peter/Azusa:
|
||
|
// Our modification of a code provided by Larry Meadows from Intel
|
||
|
// Verified by email exchange non-NDA, ok for github. Should be as uses /sys/devices/ FS
|
||
|
// so is already public and in the linux kernel for KNL.
|
||
|
struct knl_gbl_
|
||
|
{
|
||
|
int mc_rd[NMC];
|
||
|
int mc_wr[NMC];
|
||
|
int edc_rd[NEDC];
|
||
|
int edc_wr[NEDC];
|
||
|
int edc_hite[NEDC];
|
||
|
int edc_hitm[NEDC];
|
||
|
int edc_misse[NEDC];
|
||
|
int edc_missm[NEDC];
|
||
|
};
|
||
|
#endif
|
||
|
|
||
|
class PmuStat
|
||
|
{
|
||
|
const char *name;
|
||
|
__declspec(align(64)) uint64_t counters[8][256];
|
||
|
#ifdef _KNIGHTS_LANDING_
|
||
|
static struct knl_gbl_ gbl;
|
||
|
#endif
|
||
|
|
||
|
uint64_t reads; // memory reads
|
||
|
uint64_t writes; // memory writes
|
||
|
uint64_t mrstart; // memory read counter at start of parallel region
|
||
|
uint64_t mrend; // memory read counter at end of parallel region
|
||
|
uint64_t mwstart; // memory write counter at start of parallel region
|
||
|
uint64_t mwend; // memory write counter at end of parallel region
|
||
|
|
||
|
// cumulative counters
|
||
|
uint64_t count; // number of invocations
|
||
|
uint64_t tregion; // total time in parallel region (from thread 0)
|
||
|
uint64_t tcycles; // total cycles inside parallel region
|
||
|
uint64_t inst, ref, cyc; // fixed counters
|
||
|
uint64_t pmc0, pmc1;// pmu
|
||
|
// add memory counters here
|
||
|
// temp variables
|
||
|
uint64_t tstart; // tsc at start of parallel region
|
||
|
uint64_t tend; // tsc at end of parallel region
|
||
|
// map for ctrs values
|
||
|
// 0 pmc0 start
|
||
|
// 1 pmc0 end
|
||
|
// 2 pmc1 start
|
||
|
// 3 pmc1 end
|
||
|
// 4 tsc start
|
||
|
// 5 tsc end
|
||
|
static bool pmu_initialized;
|
||
|
public:
|
||
|
static bool is_init(void){ return pmu_initialized;}
|
||
|
static void pmu_init(void);
|
||
|
static void pmu_fini(void);
|
||
|
static void pmu_start(void);
|
||
|
static void pmu_stop(void);
|
||
|
void accum(int nthreads);
|
||
|
static void xmemctrs(uint64_t *mr, uint64_t *mw);
|
||
|
void start(void);
|
||
|
void enter(int t);
|
||
|
void exit(int t);
|
||
|
void print(void);
|
||
|
void init(const char *regname);
|
||
|
void clear(void);
|
||
|
#ifdef _KNIGHTS_LANDING_
|
||
|
static void KNLsetup(void);
|
||
|
static uint64_t KNLreadctr(int fd);
|
||
|
static void KNLreadctrs(ctrs &c);
|
||
|
static void KNLevsetup(const char *ename, int &fd, int event, int umask);
|
||
|
#endif
|
||
|
|
||
|
};
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|