-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcacheutils.h
118 lines (105 loc) · 2.76 KB
/
cacheutils.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#ifndef CACHEUTILS_H
#define CACHEUTILS_H
#define _GNU_SOURCE
#include <sched.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifndef HIDEMINMAX
#define MAX(X,Y) (((X) > (Y)) ? (X) : (Y))
#define MIN(X,Y) (((X) < (Y)) ? (X) : (Y))
#endif
void pin_to_core(size_t core)
{
int ret;
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(core, &cpuset);
ret = sched_setaffinity(0, sizeof(cpu_set_t), &cpuset);
if (ret) {
perror("sched_setaffinity: ");
exit(-1);
}
}
void reset_cpu_pin(void)
{
cpu_set_t cpuset;
memset(&cpuset, 0xff, sizeof(cpu_set_t));
int ret;
ret = sched_setaffinity(0, sizeof(cpu_set_t), &cpuset);
if (ret) {
perror("sched_setaffinity: ");
exit(-1);
}
}
#define INTEL
// #define AMD
#define RDPRU ".byte 0x0f, 0x01, 0xfd"
#define RDPRU_ECX_MPERF 0
#define RDPRU_ECX_APERF 1
static inline size_t rdtsc_begin(void)
{
#if defined(INTEL)
size_t a, d;
asm volatile ("mfence");
asm volatile ("rdtsc" : "=a" (a), "=d" (d));
a = (d<<32) | a;
asm volatile ("lfence");
return a;
#elif defined(AMD)
unsigned long low_a, high_a;
asm volatile ("mfence");
asm volatile(RDPRU
: "=a" (low_a), "=d" (high_a)
: "c" (RDPRU_ECX_APERF));
unsigned long aval = ((low_a) | (high_a) << 32);
asm volatile ("lfence");
return aval;
#endif
}
static inline size_t rdtsc_end(void)
{
#if defined(INTEL)
size_t a, d;
asm volatile ("lfence");
asm volatile ("rdtsc" : "=a" (a), "=d" (d));
a = (d<<32) | a;
asm volatile ("mfence");
return a;
#elif defined(AMD)
unsigned long low_a, high_a;
asm volatile ("lfence");
asm volatile(RDPRU
: "=a" (low_a), "=d" (high_a)
: "c" (RDPRU_ECX_APERF));
unsigned long aval = ((low_a) | (high_a) << 32);
asm volatile ("mfence");
return aval;
#endif
}
static inline void flush(__attribute__((unused))size_t p)
{
asm volatile (".intel_syntax noprefix");
asm volatile ("clflush qword ptr [%0]\n" : : "r" (p));
asm volatile (".att_syntax");
}
static inline void prefetch(__attribute__((unused))size_t p)
{
asm volatile (".intel_syntax noprefix");
asm volatile ("prefetchnta qword ptr [%0]" : : "r" (p));
asm volatile ("prefetcht2 qword ptr [%0]" : : "r" (p));
asm volatile (".att_syntax");
}
static inline void longnop(void)
{
asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
}
#endif