-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathparseAndGraphBenchmarkResults.py
More file actions
161 lines (131 loc) · 6.8 KB
/
parseAndGraphBenchmarkResults.py
File metadata and controls
161 lines (131 loc) · 6.8 KB
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
"""
General Description:
This file parses the output files from the tests to create the graphs seen in the paper/report
Authors: Ethan Shama, Nathan Kowal
Reviewers: Nicholas Chivaran, Samantha Hawco
"""
import os
import glob
import re
import csv
import statistics
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
import pandas as pd
import numpy as np
BW = False
# Directory to parse .out files from
if BW:
directory = './bw benchmark'
else:
directory = './lat benchmark'
# Regular expressions to match lines of interest
size_trial_regex = re.compile(r'Test Successful for SIZE=(\d+), Trial (\d+).')
rvma_regex = re.compile(r'Total RVMA Elapsed time: (\d+) microseconds')
rdma_regex = re.compile(r'Total RDMA Elapsed time: (\d+) microseconds')
cold_start_rdma_regex = re.compile(r'Total RDMA Cold Start Elapsed time: (\d+) microseconds')
test_failed_regex = re.compile(r'Test Failed for SIZE=(\d+), Trial (\d+)\.')
# Data Storage
data = []
summary = {}
# iterate over all .out files in the given directory
for filepath in glob.glob(os.path.join(directory, '*.out')):
# open the file
with open(filepath, 'r') as f:
for line in f:
if test_failed_regex.match(line):
continue
match = size_trial_regex.match(line)
if match:
size, trial = map(int, match.groups())
match = cold_start_rdma_regex.search(line)
if match:
cold_start_rdma_time = int(match.group(1))
match = rdma_regex.search(line)
if match:
rdma_time = int(match.group(1))
match = rvma_regex.search(line)
if match:
rvma_time = int(match.group(1))
trial_data = [size, trial, rvma_time, rdma_time, cold_start_rdma_time]
data.append(trial_data)
# Save in a separate dictionary for calculations
if size not in summary:
summary[size] = {'rvma': [], 'rdma': [], 'cold_start_rdma': []}
summary[size]['rvma'].append(rvma_time)
summary[size]['rdma'].append(rdma_time)
summary[size]['cold_start_rdma'].append(cold_start_rdma_time)
# Sort data by size and trial
data.sort()
# Write data into CSV
results = []
with open(os.path.join(directory, 'benchmark_results.csv'), 'w', newline='') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(['Size', 'Trial', 'RVMA Time (µs)', 'RDMA Time (µs)', 'Cold Start RDMA Time (µs)']) # write the header
writer.writerows(data) # write individual trial results
# Calculate and write the averages and std deviation for each size
writer.writerow([]) # empty row
writer.writerow(['Size', 'Average RVMA Time (µs)', 'Min RVMA Time', 'Max RVMA Time', 'Std Dev RVMA Time',
'Average RDMA Time (µs)', 'Min RDMA Time', 'Max RDMA Time', 'Std Dev RDMA Time',
'Average Cold Start RDMA Time (µs)', 'Min Cold Start RDMA Time', 'Max Cold Start RDMA Time',
'Std Dev Cold Start RDMA Time']) # summary header
for size in sorted(summary.keys()):
rvma_avg = statistics.mean(summary[size]['rvma'])
rvma_min = min(summary[size]['rvma'])
rvma_max = max(summary[size]['rvma'])
rvma_std = statistics.stdev(summary[size]['rvma'])
rdma_avg = statistics.mean(summary[size]['rdma'])
rdma_min = min(summary[size]['rdma'])
rdma_max = max(summary[size]['rdma'])
rdma_std = statistics.stdev(summary[size]['rdma'])
cold_start_rdma_avg = statistics.mean(summary[size]['cold_start_rdma'])
cold_start_rdma_min = min(summary[size]['cold_start_rdma'])
cold_start_rdma_max = max(summary[size]['cold_start_rdma'])
cold_start_rdma_std = statistics.stdev(summary[size]['cold_start_rdma'])
writer.writerow(
[size, rvma_avg, rvma_min, rvma_max, rvma_std, rdma_avg, rdma_min, rdma_max, rdma_std, cold_start_rdma_avg,
cold_start_rdma_min, cold_start_rdma_max, cold_start_rdma_std])
results.append([size, rvma_avg, rvma_min, rvma_max, rvma_std, rdma_avg, rdma_min, rdma_max, rdma_std, cold_start_rdma_avg, cold_start_rdma_min, cold_start_rdma_max, cold_start_rdma_std])
results_df = pd.DataFrame(results, columns=['Size', 'Average RVMA Time (µs)', 'Min RVMA Time', 'Max RVMA Time',
'Std Dev RVMA Time', 'Average RDMA Time (µs)', 'Min RDMA Time', 'Max RDMA Time',
'Std Dev RDMA Time', 'Average Cold Start RDMA Time (µs)',
'Min Cold Start RDMA Time', 'Max Cold Start RDMA Time', 'Std Dev Cold Start RDMA Time'])
# Plotting
plt.rcParams["font.size"] = 18
plt.rcParams["axes.titlepad"] = 18
plt.rcParams["axes.labelsize"] = 18
plt.rcParams["xtick.labelsize"] = 18
plt.rcParams["ytick.labelsize"] = 18
fig, ax = plt.subplots(figsize=(10, 8))
def plot_with_error_bars(df, sizes, avg_column, min_column, max_column, label_name, color, marker):
averages = df[avg_column].values
errors = [averages - df[min_column].values, df[max_column].values - averages]
plt.errorbar(sizes, averages, yerr=errors, fmt='-', label=label_name, capsize=5, color=color, marker=marker)
# Generate line plots with error bars for each technique
sizes = results_df['Size'].values
plot_with_error_bars(results_df, sizes, 'Average RVMA Time (µs)', 'Min RVMA Time', 'Max RVMA Time', 'RVMA', 'blue', 'o')
plot_with_error_bars(results_df, sizes, 'Average RDMA Time (µs)', 'Min RDMA Time', 'Max RDMA Time', 'RDMA', 'red', 's')
plot_with_error_bars(results_df, sizes,'Average Cold Start RDMA Time (µs)', 'Min Cold Start RDMA Time', 'Max Cold Start RDMA Time', 'Cold Start RDMA', 'green', '^')
plt.yscale('log', base=2)
plt.xscale('log', base=2)
plt.xlabel("Message Size (bytes)")
plt.ylabel("Execution Time (µs)")
plt.grid(True)
xticks = [4, 32, 128, 2048, 16384, 2 ** 17, 2 ** 20, 2 ** 23]
labels = ['4', '32', '128', '2048', '16KiB', '128KiB', '1MiB', '8MiB']
plt.xticks(ticks=xticks, labels=labels)
if BW:
yticks = [2 ** i for i in range(10, 23, 2)]
ylabel = ['1Ki', '4Ki', '16Ki', '64Ki', '256Ki', '1Mi', '4Mi']
plt.yticks(ticks=yticks, labels=ylabel)
plt.legend(loc='lower right')
plt.title('PerfTest BW Benchmark: RVMA vs RDMA vs Cold Start RDMA Execution times')
plt.savefig(os.path.join(directory, 'BW_comparison.png'), dpi=300, bbox_inches='tight')
else:
yticks = [2 ** i for i in range(4, 19, 2)]
ylabel = ['16', '64', '256', '1Ki', '4Ki', '16Ki', '64Ki', '256Ki']
plt.yticks(ticks=yticks, labels=ylabel)
plt.legend(loc='center left')
plt.title('PerfTest LAT Benchmark: RVMA vs RDMA vs Cold Start RDMA Execution times')
plt.savefig(os.path.join(directory, 'LAT_comparison.png'), dpi=300, bbox_inches='tight')
plt.show()