111 lines
3.7 KiB
C
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
|