Last active
September 7, 2020 08:36
-
-
Save zwegner/d17c27067b3a7a449567f46476739d56 to your computer and use it in GitHub Desktop.
A tool for measuring the performance of false dependencies in store forwarding
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Test address matching in store forwarding | |
# | |
# This tests a mechanism discussed in these references: | |
# | |
# * US Patent 2008/0082765 A1 | |
# https://patentimages.storage.googleapis.com/73/b9/bf/b258f3e3985f47/US20080082765A1.pdf | |
# * Fallout: Leaking Data on Meltdown-resistant CPUs | |
# https://mdsattacks.com/files/fallout.pdf | |
# * Stack Overflow: What are the microarchitectural details behind MSBDS (Fallout)? | |
# https://stackoverflow.com/a/56213609 | |
# | |
# To get precise performance numbers, we want to set up a test harness that | |
# has a fairly rigid/deterministic latency, but allows us to control how many | |
# outstanding stores are in the store buffer. | |
# | |
# We do this by combining a chain of long-but-constant latency instructions (here | |
# a chain of vsqrtpd's, run on zero input) with a series of stores. The stores | |
# come after the sqrts in the loop, and should all hit the L1D. They will remain in | |
# the store buffer until the sqrts retire, though, after which they should | |
# generally retire at 1/cycle. This happens "asynchronously", so as long as the | |
# store buffer isn't full (causing a stall if another store executes), these | |
# instructions aren't usually part of the dependency chain. | |
# | |
# To tie this all together, and make one long dependency chain across iterations of | |
# a loop, we add to an address based on the results of the sqrt chain (always | |
# zero), load from the address into a vector register (giving zero again), and | |
# use that result for the next chain. | |
# | |
# This technique is a variation on/inspired by Henry Wong's technique for measuring | |
# on-chip buffers: http://blog.stuffedcow.net/2013/05/measuring-rob-capacity/ | |
# Though without the dual pointer-chasing used in his method, this ends up looking | |
# pretty different, and more like a traditional dependency chain latency test. | |
# Additionally, I got the idea of using vpsqrtd from Paul Khuong in this tweet: | |
# https://mobile.twitter.com/pkhuong/status/1265433916791558146 | |
# | |
# Now that we have the setup, the 'payload' is the pattern of addresses stored to, | |
# along with the address of the single load in the dependency chain. To measure | |
# the behavior described in the references above, we want to generate a bunch | |
# of stores that match the "loosenet" but not the "finenet". For each store in | |
# the store buffer, a load will try to match with the most recent store that | |
# has the same low 12 bits. The high address bits are then compared for a | |
# match, otherwise the load is re-dispatched to match the next older store. The | |
# number of stores, and their size/scalarity, are controlled by knobs below. | |
# | |
# Within this group of stores, we put a single store that does in fact match | |
# the eventual load from [rbp]. By doing this we can control how many | |
# re-dispatches take place. | |
# Number of sqrts in each iteration of the main dependency chain. This number | |
# times the latency of vsqrtpd(0) in cycles should be larger than the size of | |
# the store buffer divided by the number of stores per cycle (usually one) | |
N_SQRTS = 5 | |
# Offset of a falsely-dependent address | |
# Negative since we store to the stack, which grows downwards | |
ALIAS_OFFSET = -4096 | |
SCALAR = 1 | |
SIZE = 4 | |
# Compensation factor for rdtsc not counting actual cycles: | |
# Turbo frequency / base (rdtsc) frequency | |
# Probably need to change this for other machines... | |
DETURBO = 2.9 / 2.4 | |
# How many stores to insert (all in the range are tested) | |
# This should have many values both above and below the size of the store buffer | |
STORE_COUNTS = range(1, 65, 1) | |
# How many stores back to put a matching, forward-able store | |
FWD_INDICES = range(1, 8) | |
# Generate a C file that calls each function in the assembly | |
with open('_run.c', 'w') as f: | |
f.write('#include <stdint.h>\n') | |
f.write('#include <stdio.h>\n') | |
f.write('\n') | |
f.write('const uint64_t count = 1 << 8;\n') | |
f.write('const uint64_t n_iters = 1 << 11;\n') | |
f.write('\n') | |
f.write('int main() {\n') | |
for n_stores in STORE_COUNTS: | |
f.write('printf("%02d");\n' % n_stores) | |
# Call each function for this row, print the results | |
for fwd_idx in FWD_INDICES: | |
fn = 'test_store_buffer%02d_%02d' % (n_stores, fwd_idx) | |
f.write('extern uint64_t %s();\n' % fn) | |
f.write('printf(",%%10.6f", (float)%s() * %s / n_iters);\n' % (fn, DETURBO)) | |
f.write('puts("");\n') | |
f.write('fflush(stdout);\n') | |
f.write('}\n') | |
# Generate an assembly file with a bunch of test functions | |
with open('_storebuf.s', 'w') as f: | |
f.write(''' | |
.intel_syntax noprefix | |
.global _count | |
.global _n_iters | |
''') | |
for fwd_idx in FWD_INDICES: | |
for n_stores in STORE_COUNTS: | |
name = '%02d_%02d' % (n_stores, fwd_idx) | |
# Generate the store offsets. All but the one at -fwd_idx are | |
# ALIAS_OFFSET away (provided there are enough stores for fwd_idx | |
# to exist), each of which should be false dependencies. These offsets | |
# can be tweaked for fun or profit. | |
# OK, maybe not profit... and actually, probably not fun either | |
offsets = [ALIAS_OFFSET for i in range(n_stores)] | |
if fwd_idx < len(offsets): | |
offsets[-fwd_idx] = 0 | |
# Generate the actual store instructions based on the SCALAR/SIZE settings | |
if SCALAR: | |
if SIZE == 1: | |
reg = 'r11b' | |
ptr = 'BYTE' | |
elif SIZE == 4: | |
reg = 'r11d' | |
ptr = 'DWORD' | |
else: | |
reg = 'r11' | |
ptr = 'QWORD' | |
lines = ['mov %s PTR [rbp+%s], %s' % (ptr, offset, reg) for offset in offsets] | |
chain = 'vpbroadcast%s ymm0, %s PTR [rbp]' % (ptr[0].lower(), ptr) | |
else: | |
reg = 'ymm1' | |
ptr = 'YMMWORD' | |
lines = ['vmovdqu %s PTR [rbp+%s], %s' % (ptr, offset, reg) for offset in offsets] | |
chain = 'vmovdqu ymm0, %s PTR [rbp]' % ptr | |
lines = '\n '.join(lines) | |
# Generate chain instructions to link the FP/memory dependency chains. | |
# Extract the first lane of ymm0 (should always be zero), add it to rbp, | |
# then load ymm with the value of rbp (also zero; load controlled by SCALAR/SIZE) | |
chain = ['vpextrq r10, xmm0, 0', 'add rbp, r10', chain] | |
chain = '\n '.join(chain) | |
# Generate the main dependency chain: a bunch of expensive but deterministic ops | |
work = [] | |
work += ['vsqrtpd ymm0, ymm0' for _ in range(N_SQRTS)] | |
work = '\n '.join(work) | |
# Push/pop some callee-saved regs just in case | |
regs = [12, 13, 14, 15] | |
pushes = '\n'.join('push r%s' % r for r in regs) | |
pops = '\n'.join('pop r%s' % r for r in regs[::-1]) | |
f.write(''' | |
.global _test_store_buffer{n} | |
_test_store_buffer{n}: | |
push rbp | |
mov rbp,rsp | |
{pushes} | |
# Align rbp | |
sub rbp, 127 | |
and rbp, -32 | |
# Initialize counters etc | |
mov rcx, [rip+_count] | |
xor r11, r11 | |
mov r13, -1 | |
vxorps ymm0, ymm0, ymm0 | |
vxorps ymm1, ymm0, ymm0 | |
# Make sure to store 0 at rbp | |
vmovdqu YMMWORD PTR [rbp], ymm0 | |
# Outer loop | |
L{n}_1: | |
# Start counter | |
rdtsc | |
mov r8, rdx | |
shl r8, 32 | |
or r8, rax | |
# Inner loop | |
mov r12, [rip+_n_iters] | |
L{n}_3: | |
{work} | |
{lines} | |
{chain} | |
sub r12, 1 | |
jnz L{n}_3 | |
# End counter | |
rdtsc | |
mov r9, rdx | |
shl r9, 32 | |
or r9, rax | |
sub r9, r8 | |
# Update minimum | |
cmp r13, r9 | |
cmova r13, r9 | |
sub rcx, 1 | |
jnz L{n}_1 | |
# Return minimum | |
mov rax, r13 | |
{pops} | |
pop rbp | |
ret | |
'''.format(n=name, pushes=pushes, pops=pops, lines=lines, work=work, chain=chain)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
01 | 113.394531 | 113.401611 | 113.403381 | 113.401611 | 113.396301 | 113.394531 | 113.401611 | 113.390991 | 113.401611 | 113.401611 | 113.394531 | 113.399841 | 113.396301 | 113.394531 | 113.401611 | 113.390991 | 113.385681 | 113.403381 | 113.396301 | 113.394531 | 113.385681 | 113.394531 | 113.401611 | 113.398071 | 113.385681 | 113.401611 | 113.394531 | 113.394531 | 113.396301 | 113.387451 | 113.398071 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
02 | 106.841919 | 113.748535 | 113.741455 | 113.752075 | 126.851990 | 113.737915 | 113.750305 | 113.739685 | 113.741455 | 113.741455 | 114.180420 | 113.737915 | 113.750305 | 113.750305 | 113.743225 | 113.741455 | 113.730835 | 113.739685 | 113.720215 | 113.741455 | 113.750305 | 126.875000 | 113.741455 | 113.741455 | 113.760925 | 113.741455 | 114.183960 | 113.743225 | 113.750305 | 113.743225 | 113.741455 | |
03 | 107.411865 | 114.346802 | 114.373352 | 113.773315 | 114.378662 | 114.373352 | 113.791016 | 114.373352 | 114.359192 | 114.360962 | 114.369812 | 114.359192 | 114.373352 | 114.391052 | 114.366272 | 113.792786 | 114.357422 | 114.360962 | 114.371582 | 114.368042 | 113.759155 | 114.373352 | 114.387512 | 114.346802 | 114.368042 | 114.352112 | 114.375122 | 113.775085 | 113.803406 | 114.392822 | 114.383972 | |
04 | 106.845459 | 113.146729 | 113.631714 | 113.610474 | 113.610474 | 113.615784 | 113.635254 | 113.622864 | 113.624634 | 113.624634 | 113.606934 | 113.622864 | 113.628174 | 113.615784 | 113.622864 | 113.610474 | 113.617554 | 113.606934 | 113.617554 | 113.631714 | 113.628174 | 113.603394 | 113.621094 | 113.629944 | 113.619324 | 113.626404 | 113.605164 | 113.629944 | 113.626404 | 113.638794 | 113.626404 | |
05 | 106.799438 | 117.862061 | 118.437317 | 118.437317 | 114.720276 | 118.440857 | 118.437317 | 118.449707 | 118.437317 | 118.449707 | 118.449707 | 118.455017 | 118.437317 | 118.444397 | 115.097290 | 118.444397 | 118.437317 | 118.437317 | 118.440857 | 118.449707 | 118.447937 | 118.442627 | 118.444397 | 118.439087 | 118.451477 | 118.442627 | 118.439087 | 118.456787 | 118.437317 | 118.449707 | 132.096558 | |
06 | 107.277344 | 113.566223 | 120.545410 | 120.725952 | 120.540100 | 120.541870 | 120.547180 | 120.554260 | 120.548950 | 134.463074 | 134.443604 | 120.540100 | 120.540100 | 120.862244 | 120.545410 | 120.196716 | 120.545410 | 120.552490 | 120.561340 | 120.540100 | 120.540100 | 120.885254 | 120.483459 | 120.278137 | 120.540100 | 120.541870 | 120.536560 | 120.531250 | 120.540100 | 120.871094 | 120.543640 | |
07 | 106.965820 | 114.208740 | 120.915344 | 120.894104 | 120.892334 | 120.904724 | 121.136597 | 121.147217 | 121.115356 | 120.904724 | 120.897644 | 121.044556 | 120.892334 | 120.864014 | 121.108276 | 120.894104 | 121.115356 | 120.888794 | 120.904724 | 120.681702 | 120.897644 | 120.897644 | 121.127747 | 120.901184 | 121.120667 | 120.888794 | 120.890564 | 120.890564 | 134.882568 | 120.913574 | 135.087891 | |
08 | 106.408264 | 113.808716 | 120.734802 | 120.725952 | 120.748962 | 120.734802 | 120.757812 | 120.724182 | 120.764893 | 120.738342 | 120.295837 | 120.733032 | 120.771973 | 120.743652 | 120.729492 | 120.724182 | 120.761353 | 120.724182 | 120.720642 | 120.759583 | 120.738342 | 120.748962 | 120.724182 | 120.733032 | 120.733032 | 120.740112 | 120.745422 | 120.738342 | 134.647156 | 120.743652 | 120.233887 | |
09 | 107.064941 | 114.040588 | 120.929504 | 121.035706 | 121.026855 | 121.044556 | 120.784363 | 121.076416 | 121.056946 | 121.067566 | 121.028625 | 121.046326 | 121.051636 | 121.035706 | 121.058716 | 121.053406 | 121.037476 | 121.012695 | 121.028625 | 121.026855 | 121.035706 | 121.039246 | 121.053406 | 121.042786 | 121.062256 | 121.019775 | 121.021545 | 121.035706 | 121.026855 | 121.028625 | 121.055176 | |
10 | 106.973343 | 114.210846 | 121.464500 | 121.467262 | 121.466934 | 121.468704 | 121.465050 | 121.442810 | 121.448120 | 121.456970 | 135.443665 | 121.442810 | 121.442810 | 121.442810 | 121.430420 | 121.426880 | 121.421570 | 121.456970 | 121.416260 | 121.444580 | 121.421570 | 121.441040 | 135.408264 | 121.572021 | 121.442810 | 121.419800 | 121.423340 | 121.442810 | 121.402100 | 121.442810 | 121.442810 | |
11 | 106.988724 | 113.971115 | 121.356972 | 121.345795 | 121.355087 | 121.356415 | 121.352547 | 121.304749 | 121.354309 | 121.352539 | 135.310913 | 121.325989 | 121.325989 | 121.348999 | 121.290588 | 121.304749 | 121.315369 | 121.308289 | 121.315369 | 121.329529 | 121.295898 | 121.341919 | 135.291443 | 121.315369 | 121.325989 | 121.338379 | 121.304749 | 121.325989 | 121.338379 | 121.327759 | 121.327759 | |
12 | 107.079987 | 113.766899 | 125.406883 | 125.632118 | 125.855804 | 125.857910 | 125.858681 | 125.825378 | 125.830688 | 125.855469 | 125.848389 | 125.825378 | 125.825378 | 125.843079 | 125.830688 | 125.827148 | 125.857239 | 125.827148 | 125.823608 | 125.832458 | 125.600586 | 125.113831 | 137.891602 | 125.736877 | 125.641296 | 125.789978 | 125.830688 | 125.825378 | 125.830688 | 125.839539 | 125.540405 | |
13 | 107.776382 | 113.734154 | 125.512093 | 125.937004 | 125.932358 | 125.929703 | 125.929703 | 125.924500 | 124.327942 | 125.919189 | 140.443970 | 125.924500 | 125.917419 | 125.917419 | 125.912109 | 125.920959 | 125.922729 | 125.912109 | 125.912109 | 125.912109 | 125.938660 | 127.662659 | 138.865112 | 139.617371 | 125.227112 | 125.487305 | 124.873108 | 125.903259 | 125.901489 | 125.936890 | 125.827148 | |
14 | 107.233429 | 113.674751 | 120.740784 | 127.864006 | 127.831367 | 127.870087 | 127.845528 | 127.836121 | 127.839661 | 127.864441 | 142.598083 | 127.827271 | 127.846741 | 127.846741 | 127.846741 | 127.841431 | 127.855591 | 127.837891 | 127.841431 | 127.841431 | 127.846741 | 128.361816 | 142.594543 | 127.846741 | 127.836121 | 127.846741 | 127.846741 | 127.862671 | 127.837891 | 127.866211 | 127.834351 | |
15 | 106.684830 | 113.724533 | 120.651619 | 127.628593 | 127.626266 | 127.627045 | 127.620186 | 127.606018 | 127.602478 | 127.636108 | 142.337891 | 127.611328 | 127.616638 | 127.630798 | 127.430786 | 127.614868 | 127.614868 | 127.616638 | 127.614868 | 127.609558 | 127.616638 | 127.616638 | 142.321960 | 127.616638 | 127.613098 | 127.616638 | 127.614868 | 127.616638 | 127.613098 | 127.616638 | 127.597168 | |
16 | 106.705963 | 113.354706 | 120.644318 | 127.640541 | 127.004662 | 127.639435 | 127.637550 | 127.627258 | 127.629028 | 127.639648 | 142.337891 | 127.618408 | 127.632568 | 127.636108 | 127.611328 | 127.630798 | 127.637878 | 127.618408 | 127.616638 | 127.614868 | 127.632568 | 127.632568 | 142.364441 | 127.629028 | 127.634338 | 127.632568 | 127.639648 | 127.627258 | 127.623718 | 127.614868 | 127.629028 | |
17 | 106.733841 | 113.317207 | 120.296951 | 127.289520 | 127.291512 | 127.289520 | 127.289520 | 127.283875 | 127.275024 | 127.290955 | 141.971497 | 127.290955 | 127.290955 | 127.283875 | 127.283875 | 127.283875 | 127.283875 | 127.280334 | 127.283875 | 127.283875 | 127.283875 | 127.303345 | 141.966187 | 127.283875 | 127.278564 | 127.283875 | 127.283875 | 127.283875 | 127.278564 | 127.278564 | 127.289185 | |
18 | 106.022957 | 113.120956 | 120.035538 | 127.022026 | 127.064400 | 127.004326 | 127.011078 | 127.313965 | 127.321045 | 127.331665 | 141.721924 | 127.317505 | 127.052002 | 127.283875 | 127.319275 | 127.052002 | 127.312195 | 127.317505 | 127.336975 | 127.301575 | 127.319275 | 127.328125 | 141.813965 | 127.326355 | 127.259094 | 127.331665 | 127.312195 | 127.328125 | 127.326355 | 127.313965 | 127.296265 | |
19 | 106.859291 | 113.333580 | 120.318520 | 132.159393 | 132.319580 | 132.279541 | 132.266922 | 132.300110 | 132.303650 | 132.416931 | 147.548828 | 132.273560 | 132.301880 | 132.301880 | 132.312500 | 132.301880 | 132.287720 | 132.301880 | 132.310730 | 132.301880 | 132.284180 | 132.317810 | 147.555908 | 132.294800 | 131.636353 | 132.291260 | 132.301880 | 132.300110 | 132.294800 | 131.333679 | 132.284180 | |
20 | 106.919029 | 113.352272 | 120.352814 | 132.332306 | 132.352997 | 132.304657 | 132.352661 | 132.351440 | 132.342590 | 132.539062 | 147.598389 | 132.330200 | 132.344360 | 132.328430 | 132.346130 | 132.347900 | 132.206299 | 132.344360 | 132.344360 | 132.326660 | 131.916016 | 138.118164 | 147.585999 | 132.558533 | 132.353210 | 132.349670 | 132.353210 | 131.579712 | 132.339050 | 132.342590 | 132.324890 | |
21 | 106.612373 | 113.225609 | 120.215530 | 132.164597 | 132.115143 | 132.219254 | 132.217926 | 132.215149 | 132.215149 | 132.218689 | 147.460327 | 132.215149 | 132.209839 | 131.976196 | 132.215149 | 132.213379 | 132.197449 | 132.215149 | 132.209839 | 132.222229 | 132.215149 | 147.492188 | 147.463867 | 132.216919 | 132.206299 | 132.215149 | 132.215149 | 132.218689 | 132.213379 | 132.218689 | 132.225769 | |
22 | 106.000168 | 113.000481 | 120.000252 | 127.000122 | 134.000000 | 134.000000 | 134.000000 | 133.999329 | 133.999329 | 134.004639 | 134.078979 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 143.962769 | 149.462219 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | |
23 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 134.000000 | 134.000000 | 134.000000 | 133.999329 | 133.999329 | 134.098450 | 134.004639 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 134.015259 | 149.467529 | 134.004639 | 134.004639 | 133.999329 | 133.999329 | 134.004639 | 134.006409 | 134.001099 | 133.999329 | 134.001099 | |
24 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 134.000000 | 134.000000 | 134.000000 | 133.999329 | 133.999329 | 133.999329 | 149.462219 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 133.999329 | 134.013489 | 133.999329 | 149.462219 | 149.462219 | 133.999329 | 133.999329 | 133.999329 | 134.004639 | 134.006409 | 134.008179 | 133.999329 | 133.999329 | |
25 | 106.000168 | 113.998993 | 120.000252 | 127.000122 | 134.000107 | 134.000107 | 134.000107 | 134.001099 | 134.001099 | 134.006409 | 149.463989 | 134.001099 | 134.001099 | 134.001099 | 134.001099 | 134.001099 | 133.999329 | 134.001099 | 134.001099 | 134.029419 | 134.008179 | 150.285278 | 149.524170 | 142.298950 | 134.100220 | 134.038269 | 134.052429 | 134.001099 | 134.001099 | 134.001099 | 134.001099 | |
26 | 106.000168 | 113.000374 | 120.000252 | 127.000122 | 138.999863 | 138.999756 | 138.999527 | 138.973083 | 138.967773 | 139.233276 | 138.996094 | 138.992554 | 139.001404 | 138.989014 | 139.003174 | 138.983704 | 138.980164 | 138.999634 | 139.001404 | 138.971313 | 138.966003 | 155.005920 | 155.034241 | 138.990784 | 138.973083 | 138.987244 | 138.989014 | 138.960693 | 138.999634 | 138.983704 | 138.996094 | |
27 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 138.999313 | 138.999863 | 138.998978 | 138.973083 | 138.999634 | 139.238586 | 138.997864 | 138.978394 | 139.001404 | 138.999634 | 138.989014 | 139.003174 | 138.994324 | 138.992554 | 138.992554 | 138.994324 | 138.994324 | 155.021851 | 155.032471 | 138.990784 | 139.001404 | 138.987244 | 138.996094 | 138.987244 | 138.983704 | 139.072205 | 138.999634 | |
28 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 138.998093 | 139.000198 | 139.000198 | 138.990784 | 139.003174 | 155.036011 | 139.003174 | 138.999634 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 150.315369 | 139.015564 | 155.036011 | 155.036011 | 139.003174 | 138.990784 | 139.003174 | 139.001404 | 138.996094 | 138.983704 | 139.001404 | 139.003174 | |
29 | 106.000168 | 113.000038 | 120.000252 | 127.000458 | 138.995880 | 139.000198 | 139.000198 | 139.003174 | 139.003174 | 139.089905 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.013794 | 139.004944 | 156.604248 | 139.036804 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | 139.003174 | |
30 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 134.000000 | 141.000198 | 141.000198 | 141.001526 | 141.001526 | 141.020996 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 157.271545 | 152.301331 | 141.001526 | 141.001526 | 141.001526 | 141.006836 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | |
31 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 134.000000 | 141.000198 | 141.000198 | 141.001526 | 141.001526 | 141.024536 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.019226 | 157.271545 | 157.276855 | 141.010376 | 141.005066 | 141.044006 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | |
32 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 134.000000 | 141.000198 | 141.000198 | 141.001526 | 141.001526 | 157.271545 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 157.298096 | 157.294556 | 141.128967 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.001526 | 141.097107 | |
33 | 106.000168 | 113.000038 | 120.999092 | 127.000458 | 134.000000 | 145.997971 | 145.999069 | 145.989441 | 145.994751 | 162.840027 | 145.989441 | 145.989441 | 145.998291 | 146.000061 | 145.985901 | 146.000061 | 145.996521 | 145.987671 | 145.994751 | 146.003601 | 145.992981 | 162.825867 | 146.543457 | 145.989441 | 145.984131 | 145.992981 | 145.977051 | 145.991211 | 145.998291 | 146.000061 | 145.989441 | |
34 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 134.000000 | 145.999069 | 145.999512 | 145.982361 | 145.996521 | 162.841797 | 145.992981 | 145.985901 | 146.000061 | 146.000061 | 145.996521 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 145.985901 | 145.989441 | 162.843567 | 145.987671 | 145.996521 | 145.991211 | 145.989441 | 145.991211 | 145.980591 | 145.994751 | 145.991211 | 146.000061 | |
35 | 106.000168 | 113.000038 | 120.000580 | 127.000122 | 134.000000 | 145.999298 | 146.000061 | 146.000061 | 145.994751 | 162.843567 | 145.994751 | 145.998291 | 146.000061 | 146.000061 | 146.000061 | 145.994751 | 145.996521 | 146.000061 | 146.000061 | 145.987671 | 146.049622 | 162.840027 | 162.836487 | 145.998291 | 145.989441 | 145.992981 | 145.989441 | 145.998291 | 145.991211 | 145.991211 | 145.994751 | |
36 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 134.000000 | 145.996857 | 146.000061 | 146.000061 | 146.000061 | 162.847107 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 162.841797 | 146.001831 | 145.992981 | 146.000061 | 145.998291 | 146.102722 | 146.001831 | 146.003601 | 146.000061 | 146.005371 | |
37 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 134.000000 | 145.948853 | 146.000061 | 146.000061 | 146.000061 | 146.037231 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 159.303528 | 146.702759 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | 146.000061 | |
38 | 106.000168 | 113.000038 | 120.000252 | 127.000122 | 134.000000 | 141.000198 | 148.000076 | 148.003723 | 148.003723 | 165.080872 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 165.080872 | 165.080872 | 148.007263 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | |
39 | 106.000275 | 113.000038 | 120.489548 | 127.000122 | 134.000000 | 141.000198 | 148.000076 | 148.003723 | 148.003723 | 153.366882 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 148.003723 | 165.084412 | 165.142822 | 148.039124 | 150.398560 | 148.003723 | 148.950684 | 148.764832 | 148.003723 | 148.003723 | 148.003723 | |
40 | 106.000275 | 113.000038 | 120.000252 | 127.000122 | 134.000000 | 141.000198 | 152.997391 | 152.993408 | 153.000488 | 170.638733 | 152.996948 | 153.002258 | 153.000488 | 153.002258 | 152.984558 | 152.996948 | 152.973938 | 152.986328 | 152.993408 | 153.000488 | 152.991638 | 170.640503 | 152.995178 | 152.991638 | 152.989868 | 152.968628 | 152.988098 | 152.982788 | 152.982788 | 152.977478 | 152.989868 | |
41 | 106.000275 | 113.499184 | 120.000252 | 127.000122 | 134.000000 | 141.000198 | 152.999832 | 152.995178 | 153.002258 | 170.652893 | 153.000488 | 153.002258 | 153.000488 | 152.998718 | 153.002258 | 153.002258 | 153.002258 | 153.002258 | 153.002258 | 152.996948 | 166.309265 | 170.645813 | 153.000488 | 152.998718 | 152.995178 | 153.002258 | 153.002258 | 152.981018 | 153.000488 | 152.982788 | 153.002258 | |
42 | 106.000275 | 113.000038 | 120.000252 | 127.000122 | 134.499481 | 141.000198 | 153.500076 | 153.467773 | 153.457153 | 171.196289 | 153.481934 | 153.490784 | 153.499634 | 153.469543 | 153.480164 | 153.483704 | 153.501404 | 153.494324 | 153.481934 | 153.457153 | 153.604065 | 171.104248 | 153.469543 | 153.198730 | 153.457153 | 153.487244 | 153.444763 | 153.467773 | 153.329712 | 153.473083 | 153.412903 | |
43 | 122.250168 | 131.000153 | 138.000015 | 147.744308 | 155.249969 | 155.250076 | 155.250076 | 155.243103 | 155.253723 | 173.161011 | 155.246643 | 155.251953 | 155.253723 | 155.248413 | 155.251953 | 155.253723 | 155.253723 | 155.253723 | 155.253723 | 155.251953 | 155.253723 | 173.153931 | 173.152161 | 155.241333 | 155.246643 | 155.253723 | 155.236023 | 155.241333 | 155.241333 | 155.253723 | 155.386475 | |
44 | 123.000214 | 129.999969 | 137.000397 | 144.000061 | 156.000122 | 156.000122 | 155.999908 | 156.002441 | 155.990051 | 174.000000 | 156.002441 | 156.002441 | 156.000671 | 156.002441 | 156.002441 | 156.002441 | 156.002441 | 156.002441 | 156.000671 | 156.002441 | 156.027222 | 173.994690 | 156.009521 | 156.000671 | 156.000671 | 156.000671 | 156.014832 | 155.995361 | 155.998901 | 156.000671 | 156.002441 | |
45 | 124.250175 | 136.485886 | 143.496048 | 152.748932 | 157.250092 | 157.250092 | 157.250092 | 157.252075 | 157.252075 | 175.387695 | 157.250305 | 157.252075 | 157.252075 | 157.252075 | 157.252075 | 157.250305 | 157.248535 | 157.250305 | 157.250305 | 157.250305 | 162.248840 | 175.393005 | 165.590637 | 157.248535 | 157.250305 | 157.252075 | 157.252075 | 157.252075 | 157.248535 | 157.246765 | 157.252075 | |
46 | 125.000336 | 132.000534 | 139.500336 | 146.499985 | 158.000137 | 158.000137 | 158.000137 | 158.009644 | 158.000793 | 176.324036 | 158.000793 | 158.000793 | 158.009644 | 158.000793 | 158.501709 | 158.000793 | 158.000793 | 158.000793 | 158.000793 | 158.000793 | 158.007874 | 176.242615 | 158.245056 | 158.000793 | 158.004333 | 158.000793 | 158.000793 | 158.000793 | 158.000793 | 158.188416 | 158.283997 | |
47 | 126.250191 | 138.499832 | 145.499924 | 156.249588 | 159.250107 | 159.250107 | 159.250107 | 159.246887 | 159.250427 | 177.625000 | 159.250427 | 159.250427 | 159.250427 | 159.250427 | 159.250427 | 159.250427 | 159.248657 | 159.250427 | 159.250427 | 159.253967 | 159.271667 | 177.625000 | 159.250427 | 159.250427 | 159.250427 | 159.250427 | 159.250427 | 159.250427 | 159.250427 | 159.250427 | 159.250427 | |
48 | 127.000237 | 134.000000 | 141.000198 | 148.000961 | 160.000153 | 160.000153 | 160.000153 | 159.999146 | 159.999146 | 178.458679 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.997375 | 159.999146 | 178.458679 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | 159.999146 | |
49 | 128.250198 | 140.493210 | 147.499603 | 156.749619 | 161.250107 | 161.250107 | 161.250107 | 161.248779 | 161.248779 | 179.853455 | 161.248779 | 161.248779 | 161.248779 | 161.248779 | 161.248779 | 161.248779 | 161.248779 | 161.248779 | 161.248779 | 161.248779 | 161.255859 | 179.853455 | 161.248779 | 161.254089 | 161.255859 | 161.252319 | 161.247009 | 161.252319 | 161.250549 | 161.248779 | 161.250549 | |
50 | 129.000244 | 139.501221 | 146.499985 | 156.000122 | 162.000153 | 162.000153 | 162.000153 | 162.002808 | 162.024048 | 180.692444 | 162.002808 | 162.002808 | 162.002808 | 162.006348 | 162.002808 | 162.002808 | 162.029358 | 162.002808 | 162.002808 | 161.997498 | 162.001038 | 180.694214 | 162.002808 | 162.002808 | 162.002808 | 162.002808 | 162.002808 | 162.004578 | 180.690674 | 180.694214 | 162.811707 | |
51 | 130.250214 | 142.497757 | 149.499283 | 158.749741 | 163.250122 | 163.250122 | 163.250122 | 163.252441 | 163.252441 | 182.081909 | 163.252441 | 163.252441 | 163.252441 | 163.252441 | 163.252441 | 163.252441 | 163.252441 | 163.248901 | 163.248901 | 163.248901 | 163.250671 | 182.083679 | 163.252441 | 163.252441 | 163.252441 | 163.252441 | 163.252441 | 163.252441 | 163.252441 | 163.250671 | 163.250671 | |
52 | 131.000259 | 138.000137 | 151.999100 | 152.000107 | 164.000168 | 164.000168 | 164.000168 | 164.001160 | 164.001160 | 182.922668 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 182.924438 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.001160 | 164.248962 | 164.001160 | |
53 | 132.250229 | 144.499969 | 151.500183 | 163.749374 | 165.250137 | 165.250137 | 165.250137 | 165.250793 | 165.250793 | 184.317444 | 165.250793 | 165.250793 | 165.250793 | 165.250793 | 165.250793 | 165.250793 | 165.249023 | 165.250793 | 165.250793 | 165.250793 | 165.250793 | 184.317444 | 165.250793 | 165.250793 | 165.256104 | 184.347534 | 165.257874 | 184.317444 | 184.315674 | 184.315674 | 165.249023 | |
54 | 133.000381 | 147.000244 | 154.000000 | 165.997635 | 166.000183 | 166.000183 | 166.000183 | 166.011902 | 166.500427 | 185.158203 | 166.006592 | 166.006592 | 166.500427 | 166.500427 | 166.006592 | 165.999512 | 166.001282 | 166.003052 | 166.001282 | 166.004822 | 166.004822 | 185.676819 | 165.999512 | 166.027832 | 165.999512 | 166.006592 | 165.999512 | 166.252625 | 166.004822 | 165.999512 | 166.004822 | |
55 | 134.250229 | 148.250198 | 155.249863 | 167.235321 | 167.251923 | 167.250259 | 167.250153 | 167.249146 | 167.249146 | 186.549438 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 186.549438 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | 167.249146 | |
56 | 135.000275 | 149.000244 | 156.000015 | 167.997543 | 168.000198 | 168.000198 | 168.000198 | 168.003174 | 168.003174 | 187.384888 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 187.383118 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | 168.003174 | |
57 | 136.250244 | 150.250214 | 157.250092 | 169.239212 | 169.249939 | 169.250153 | 169.250153 | 169.252808 | 169.252808 | 188.776123 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 188.781433 | 168.999695 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | 169.252808 | |
58 | 137.000290 | 151.000366 | 158.000137 | 169.999985 | 170.000198 | 170.000320 | 170.000198 | 170.001526 | 170.001526 | 189.632812 | 170.001526 | 170.001526 | 170.001526 | 170.249329 | 170.001526 | 170.001526 | 170.001526 | 170.001526 | 170.012146 | 170.001526 | 170.001526 | 189.615112 | 170.001526 | 170.001526 | 170.005066 | 170.001526 | 170.187378 | 170.001526 | 170.001526 | 170.001526 | 170.001526 | |
59 | 138.250259 | 152.250229 | 159.250107 | 171.250168 | 171.250168 | 171.250061 | 171.250168 | 171.251160 | 171.251160 | 191.008118 | 171.251160 | 171.251160 | 171.251160 | 171.251160 | 171.251160 | 171.251160 | 171.251160 | 171.251160 | 171.251160 | 171.251160 | 171.251160 | 191.009888 | 171.251160 | 171.251160 | 171.251160 | 171.251160 | 171.251160 | 171.249390 | 171.251160 | 171.251160 | 171.251160 | |
60 | 139.000519 | 152.999939 | 160.000153 | 171.997345 | 172.000214 | 172.000214 | 172.000214 | 171.999878 | 171.999878 | 191.847107 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 191.848877 | 171.996338 | 171.998108 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | 171.999878 | |
61 | 140.250275 | 154.250244 | 161.250107 | 173.247299 | 173.250183 | 173.250183 | 173.250183 | 173.249512 | 173.249512 | 192.960449 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.001709 | 173.249512 | 193.238342 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | 173.249512 | |
62 | 141.000320 | 154.999954 | 162.000153 | 173.992813 | 174.000336 | 174.000229 | 174.000229 | 174.003540 | 174.005310 | 194.079102 | 174.003540 | 174.003540 | 174.003540 | 174.003540 | 174.003540 | 174.010620 | 174.008850 | 174.003540 | 174.003540 | 174.003540 | 174.010620 | 194.135742 | 174.205322 | 174.003540 | 174.003540 | 174.003540 | 174.003540 | 174.003540 | 174.003540 | 174.003540 | 174.003540 | |
63 | 142.250275 | 156.250244 | 163.250122 | 175.249084 | 175.250076 | 175.250198 | 175.000061 | 175.253174 | 175.253174 | 195.470337 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 195.472107 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | 175.253174 | |
64 | 143.000320 | 156.999969 | 164.000168 | 175.998474 | 176.000244 | 176.000244 | 176.000244 | 176.001892 | 176.049683 | 196.305786 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.249695 | 196.307556 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 | 176.001892 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment