#ifndef ICEPICK_H #define ICEPICK_H #include #include #include #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