cache line locking on AMD x86_64 utilising L3 CAT pseudo-locking
26

Configure Feed

Select the types of activity you want to include in your feed.

icepick / src / internal.h
2.6 kB 97 lines
1#ifndef ICEPICK_INTERNAL_H 2#define ICEPICK_INTERNAL_H 3 4#include "../include/icepick.h" 5#include <stdint.h> 6#include <stdatomic.h> 7#include <pthread.h> 8 9#define MSR_IA32_PQR_ASSOC 0xC8F 10#define MSR_IA32_L3_QOS_MASK_0 0xC90 11 12#define CACHE_LINE_SIZE 64 13#define MAX_CLOS 16 14#define MAX_CCXS 16 15 16#define MONITOR_DEFAULT_PMU_POLL_NS 100000 17#define MONITOR_DEFAULT_PROBE_NS 10000 18#define MONITOR_DEFAULT_MISS_THRESH 16 19#define MONITOR_PROBE_CONFIRM_COUNT 8 20#define MONITOR_L3_LATENCY_THRESH_NS 50 21 22struct icepick_monitor; 23 24struct icepick_topology { 25 bool cat_supported; 26 unsigned l3_ways; 27 size_t l3_size; 28 size_t way_size; 29 unsigned max_clos; 30 unsigned ccx_count; 31 uint32_t default_way_mask; 32 int ccx_numa_node[MAX_CCXS]; 33}; 34 35struct icepick_region { 36 void *ptr; 37 size_t size; 38 unsigned clos_id; 39 int numa_node; 40 uint32_t way_mask; 41 icepick_topology_t *topo; 42 struct icepick_monitor *monitor; 43 icepick_prime_strategy_t prime_strategy; 44 icepick_access_pattern_t access_pattern; 45 size_t stride_bytes; 46 unsigned prime_iterations; 47}; 48 49struct icepick_monitor { 50 icepick_region_t *region; 51 pthread_t thread; 52 int perf_fd; 53 int msr_fd; 54 int cpu; 55 atomic_bool running; 56 atomic_uint_fast64_t eviction_count; 57 atomic_uint_fast64_t reprime_count; 58 uint64_t pmu_poll_interval_ns; 59 uint64_t probe_interval_ns; 60 uint32_t miss_threshold; 61 bool degraded; 62}; 63 64typedef struct { 65 bool allocated; 66 uint32_t way_mask; 67} clos_entry_t; 68 69extern clos_entry_t clos_table[MAX_CLOS]; 70 71int msr_open(int cpu); 72void msr_close(int fd); 73int msr_read(int fd, uint32_t msr, uint64_t *value); 74int msr_write(int fd, uint32_t msr, uint64_t value); 75 76int clos_init(icepick_topology_t *topo); 77int clos_allocate(unsigned clos_id, uint32_t way_mask); 78int clos_release(unsigned clos_id); 79int clos_configure_mask(int msr_fd, unsigned clos_id, uint32_t way_mask); 80int clos_associate_thread(int msr_fd, unsigned clos_id); 81uint32_t clos_get_default_mask(void); 82 83int region_alloc(size_t size, int numa_node, bool huge_pages, void **out_ptr); 84void region_free(void *ptr, size_t size); 85 86uint64_t rdtsc_start(void); 87uint64_t rdtsc_end(void); 88uint64_t cycles_to_ns(uint64_t cycles); 89 90int bench_compare(icepick_topology_t *topo, size_t size, size_t iterations); 91 92void prime_region(volatile char *ptr, size_t size, unsigned iterations, 93 icepick_prime_strategy_t strategy, icepick_access_pattern_t pattern, 94 size_t stride); 95int monitor_perf_open(int cpu, bool is_amd); 96 97#endif