-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcacheTester.js
172 lines (148 loc) · 4.41 KB
/
cacheTester.js
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
// Alan - 2.3GHz Intel Core i7 - 6 MB L3 cache
// Might have 8192 cache sets (2^13) with 12 lines of 64 bytes (2^6)
// Check if your system has a similar cache.
// should need to use pointer chasing method from : http://www.tau.ac.il/~tromer/papers/cache-joc-20090619.pdf - Why not?
$(document).ready(function() {
// probeView from paper - for invalidation
var probeBuffer = new ArrayBuffer(8192 * 1024); // 8 MB eviction buffer
var probeView = new DataView(probeBuffer);
// primeView from paper - testing data retrieval
var primeBuffer = new ArrayBuffer(8192 * 1024);
var primeView = new DataView(primeBuffer);
// L3 cache line size
var offset = 64;
// page in question mb
var x = 0;
var numRounds = 500;
// initial data
var flushed1 = [];
var unflushed1 = [];
var unflushed2 = [];
var flushed2 = [];
// invalidation of all cache sets in L3 buffer
var current;
for (var round = 0; round < numRounds; round++) {
for (var i = 0; i < ((8192 * 1024) / offset); i++) {
current = probeView.getUint32(i * offset);
}
// first retrieval, hypothesized to be from RAM
var startTime1 = window.performance.now();
current = primeView.getUint32(x);
var endTime1 = window.performance.now();
var diffTime1 = endTime1 - startTime1;
// second retrieval, hypothesized to be from L3
var startTime2 = window.performance.now();
current = primeView.getUint32(x);
var endTime2 = window.performance.now();
var diffTime2 = endTime2 - startTime2;
// third retrieval, hypothesized to be from L3
var startTime3 = window.performance.now();
current = primeView.getUint32(x);
var endTime3 = window.performance.now();
var diffTime3 = endTime3 - startTime3;
// eviction round 2
for (var i = 0; i < ((8192 * 1023) / offset); i++) {
current = probeView.getUint32(i * offset);
}
// fourth retrieval, hypothesized to be from RAM
var startTime4 = window.performance.now();
current = primeView.getUint32(x);
var endTime4 = window.performance.now();
var diffTime4 = endTime4 - startTime4;
/**
console.log("ROUND " + round);
console.log(diffTime1 - diffTime2); // diffTime1 generally should be > diffTime2 : TRUE
console.log(diffTime3 - diffTime2); // should be around 0 / alternate between positive and negative? : TRUE
console.log(diffTime4 - diffTime1); // should be around 0 / alternate between positive and negative? : TRUE - round 0 is strangely always positive
**/
/**
console.log("ROUND " + round);
console.log(diffTime1);
console.log(diffTime2);
console.log(diffTime3);
console.log(diffTime4);
**/
flushed1.push(Math.floor(diffTime1 * 100000));
unflushed1.push(Math.floor(diffTime2 * 100000));
unflushed2.push(Math.floor(diffTime3 * 100000));
flushed2.push(Math.floor(diffTime4 * 100000));
}
var flushed1Data = toPD(flushed1);
var unflushed1Data = toPD(unflushed1);
var unflushed2Data = toPD(unflushed2);
var flushed2Data = toPD(flushed2);
// jqplot data visualization
plot1 = $.jqplot("chart1", [flushed1Data, unflushed1Data, unflushed2Data, flushed2Data], {
title: "Access Latencies : Flushed vs Unflushed",
cursor: {
show: false
},
highlighter: {
show: true,
showMarker: false,
useAxesFormatters: false,
formatString: '%d, %.1f'
},
axesDefaults: {
labelRenderer: $.jqplot.CanvasAxisLabelRenderer
},
seriesDefaults: {
showMarker: false
},
series:[
{label: 'flushed'},
{label: 'unflushed'},
{label: 'unflushed2'},
{label: 'flushed2'}
],
legend: {
show: true,
location: 'ne'
},
axes: {
xaxis: {
label: 'Access Latency (10^-5 seconds)',
pad:0,
ticks: [],
tickOptions: {
formatString: "%d"
},
max: 100,
min: 0
},
yaxis: {
label: 'Probability Density (%)',
forceTickAt0: true,
pad: 0
}
},
grid: {
drawBorder: false,
shadow: false,
background: "white"
},
canvasOverlay: {
show: true
}
});
});
///////////////////////////////////////////////////////
// Helper methods
// convert list of data points to probability density
var toPD = function(data) {
counts = {}
data.forEach(function(el) {
if (el in counts) {
counts[el] += 1;
} else {
counts[el] = 1;
}
});
pdData = []
for (var el in counts) {
pdData.push([el, counts[el]/data.length]);
}
pdData.sort(function(a,b) {return a[0] - b[0];});
// remove outliers
return pdData;
}