icepick/include/icepick.h

111 lines
3.7 KiB
C

#ifndef ICEPICK_H
#define ICEPICK_H
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#define ICEPICK_E_NO_CAT (-1)
#define ICEPICK_E_PERMISSION (-2)
#define ICEPICK_E_NO_CLOS (-3)
#define ICEPICK_E_TOO_LARGE (-4)
#define ICEPICK_E_NUMA (-5)
#define ICEPICK_E_HUGEPAGE (-6)
#define ICEPICK_E_VERIFY (-7)
#define ICEPICK_E_INVALID (-8)
#define ICEPICK_E_ALLOC (-9)
#define ICEPICK_E_MSR (-10)
#define ICEPICK_E_THREAD (-11)
typedef enum {
ICEPICK_PRIME_TEMPORAL,
ICEPICK_PRIME_PREFETCHT2,
ICEPICK_PRIME_PREFETCHNTA,
ICEPICK_PRIME_NT_STORE,
} icepick_prime_strategy_t;
typedef enum {
ICEPICK_PATTERN_SEQUENTIAL,
ICEPICK_PATTERN_REVERSE,
ICEPICK_PATTERN_STRIDED,
ICEPICK_PATTERN_POINTER_CHASE,
} icepick_access_pattern_t;
typedef enum {
ICEPICK_CORE_ANY,
ICEPICK_CORE_PCORE,
ICEPICK_CORE_ECORE,
} icepick_core_type_t;
typedef struct icepick_topology icepick_topology_t;
typedef struct icepick_region icepick_region_t;
typedef struct icepick_monitor icepick_monitor_t;
typedef struct {
size_t size;
unsigned clos_id;
int numa_node;
bool huge_pages;
bool verify;
bool auto_monitor;
uint64_t pmu_poll_interval_ns;
uint64_t probe_interval_ns;
uint32_t miss_threshold;
icepick_prime_strategy_t prime_strategy;
icepick_access_pattern_t access_pattern;
size_t stride_bytes;
unsigned prime_iterations;
unsigned mba_throttle;
icepick_core_type_t core_type;
} icepick_config_t;
typedef struct {
uint64_t mean_ns;
uint64_t stddev_ns;
uint64_t p50_ns;
uint64_t p99_ns;
uint64_t p999_ns;
uint64_t min_ns;
uint64_t max_ns;
} icepick_latency_stats_t;
int icepick_discover_topology(icepick_topology_t **topo);
void icepick_free_topology(icepick_topology_t *topo);
unsigned icepick_topology_l3_ways(const icepick_topology_t *topo);
size_t icepick_topology_l3_size(const icepick_topology_t *topo);
size_t icepick_topology_way_size(const icepick_topology_t *topo);
unsigned icepick_topology_max_clos(const icepick_topology_t *topo);
unsigned icepick_topology_ccx_count(const icepick_topology_t *topo);
bool icepick_topology_cat_supported(const icepick_topology_t *topo);
bool icepick_topology_mba_supported(const icepick_topology_t *topo);
bool icepick_topology_mba_is_linear(const icepick_topology_t *topo);
unsigned icepick_topology_max_mba_thrtl(const icepick_topology_t *topo);
bool icepick_topology_is_hybrid(const icepick_topology_t *topo);
unsigned icepick_topology_pcore_count(const icepick_topology_t *topo);
unsigned icepick_topology_ecore_count(const icepick_topology_t *topo);
int icepick_lock(icepick_topology_t *topo, const icepick_config_t *cfg, icepick_region_t **region);
int icepick_unlock(icepick_region_t *region);
void *icepick_region_ptr(const icepick_region_t *region);
size_t icepick_region_size(const icepick_region_t *region);
unsigned icepick_region_clos(const icepick_region_t *region);
int icepick_verify(const icepick_region_t *region, icepick_latency_stats_t *stats);
int icepick_bench(void *ptr, size_t size, size_t iterations,
icepick_latency_stats_t *stats);
int icepick_monitor_start(icepick_region_t *region, icepick_monitor_t **mon);
int icepick_monitor_start_ex(icepick_region_t *region, uint64_t pmu_poll_ns,
uint64_t probe_ns, uint32_t miss_thresh,
icepick_monitor_t **mon);
int icepick_monitor_stop(icepick_monitor_t *mon);
uint64_t icepick_monitor_eviction_count(const icepick_monitor_t *mon);
uint64_t icepick_monitor_reprime_count(const icepick_monitor_t *mon);
bool icepick_monitor_is_degraded(const icepick_monitor_t *mon);
const char *icepick_strerror(int err);
#endif