Skip to content

Commit ed12571

Browse files
committed
Intro refs. fixed
2 parents 02c10f3 + 0feff40 commit ed12571

20 files changed

+496
-145
lines changed

python_wrapper/bsub_script_scaling.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,17 @@ do
3030
done
3131
done
3232

33+
# remove the two unsat formulas
34+
rm uuf50-01.cnf
35+
rm uuf50-02.cnf
36+
3337
for nodes in ${num_nodes}
3438
do
3539
for file in ${FILES}
3640
do
3741
for run in $(seq 1 $num_runs)
3842
do
39-
timeout "$timeout"s mpirun -np "$nodes" ../stealing_parallel_main "$file" > "$file".out
43+
timeout "$timeout"s mpirun -np "$nodes" ../stealing_main "$file" > "$file".out
4044
done
4145
done
4246
done

python_wrapper/cnf_difficulty.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import subprocess
2+
import os
3+
4+
PROGRAM = '../sequential_main -cerr-level 1'
5+
FOLDER = '../cnfs/benchmark_formulas'
6+
7+
8+
def main():
9+
files = sorted(['../cnfs/benchmark_formulas/{}'.format(f)
10+
for f in os.listdir(FOLDER)
11+
if os.path.isfile(os.path.join(FOLDER, f))
12+
and f.endswith('.cnf')])
13+
for f in files:
14+
diff = run(f)
15+
print('Formula {} needs {} dpll branches'.format(f, diff))
16+
17+
18+
def run(cnf):
19+
command = PROGRAM + " " + cnf
20+
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,
21+
stderr=subprocess.PIPE)
22+
p.wait()
23+
stderr = [line.decode('utf-8').strip() for line in iter(p.stderr.readline, b'')]
24+
return len(stderr)
25+
26+
27+
if __name__ == '__main__':
28+
main()

python_wrapper/euler.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,7 @@ def run_test(self, basepath='.', script='bsub_script.sh'):
8181
os.remove('{}/timeout.txt'.format(basepath))
8282
os.remove('{}/overall_runtime_minutes.txt'.format(basepath))
8383
print('once the job is finished, run the following command to download the results file:')
84-
print('scp -o PreferredAuthentications=password -o PubkeyAuthentication=no {0}@euler.ethz.ch:{1}/{2}/time_measurements.tar .'.format(self.nethz_username, self.euler_folder_name, self.folder))
85-
print('scp -o PreferredAuthentications=password -o PubkeyAuthentication=no {0}@euler.ethz.ch:{1}/{2}/wait_measurements.tar .'.format(self.nethz_username, self.euler_folder_name, self.folder))
86-
print('scp -o PreferredAuthentications=password -o PubkeyAuthentication=no {0}@euler.ethz.ch:{1}/{2}/comm_measurements.tar .'.format(self.nethz_username, self.euler_folder_name, self.folder))
84+
print('scp -o PreferredAuthentications=password -o PubkeyAuthentication=no {0}@euler.ethz.ch:{1}/{2}/measurements.tar .'.format(self.nethz_username, self.euler_folder_name, self.folder))
8785

8886
def run_test_for_num_nodes(self, basepath, script='bsub_script.sh'):
8987
tar = self.package_tar(basepath, script)

python_wrapper/experiments/dpll_scaling.py

Lines changed: 155 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@
22
import sys
33

44
import click
5-
import numpy as np
65
import matplotlib.pyplot as plt
6+
import numpy as np
7+
from scipy.interpolate import spline
78

89
from abstract_experiment import AbstractExperiment
910
from utils import get_netz_username, parse_into_dict, conf_95_mean
1011

1112
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
1213
from euler import EulerTester
1314

15+
NAME_MAP = {'parallel': 'Parallel', 'stealing': 'Work Stealing'}
16+
1417

1518
class DpllScaling(AbstractExperiment):
1619
def __init__(self):
@@ -20,7 +23,7 @@ def __init__(self):
2023
def run_experiment(self):
2124
test_folder = 'benchmark_formulas'
2225
# number of cores
23-
num_nodes = [2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20, 24, 32, 40, 48]
26+
num_nodes = [2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 48]
2427
# number of runs per formula
2528
num_runs = 10
2629
# timeout per formula in seconds
@@ -36,70 +39,162 @@ def process_euler_experiment(self):
3639
self.data = parse_into_dict('measurements.tar')
3740

3841
def plot(self):
39-
self._runtime_plot()
40-
self._speedup_plot()
42+
for p in ['parallel', 'stealing']:
43+
self._runtime_plot(p)
44+
self._speedup_plot(p)
45+
files = ['uf50-01', 'par8-1-c', 'ais6', 'flat75-4', 'par8-4-', 'anomaly']
46+
colors = ['teal', 'firebrick', 'darkorange', 'royalblue',
47+
'palevioletred', 'slateblue']
48+
offsets = [-0.25, 0.25, 0, 0.125, -0.125,
49+
-0.25, 0.25, 0, 0.125, -0.125,
50+
-0.25, 0.25, 0, 0.125, -0.125]
51+
markers = ['o', 'd', 's', '^', 'x', 'D']
52+
figure = plt.figure()
53+
ax = figure.add_subplot(1, 1, 1)
54+
for f in range(len(files)):
55+
self._plot_runtime(self.data[files[f]], 'parallel', ax,
56+
color=colors[f], offset=offsets[f])
57+
#plt.show()
58+
for p in ['parallel', 'stealing']:
59+
figure = plt.figure()
60+
ax = figure.add_subplot(1, 1, 1)
61+
for f in range(len(files)):
62+
self._plot_speedup(self.data[files[f]], p, ax,
63+
color=colors[f], marker=markers[f],
64+
offset=offsets[f], plotline=(f == 0),
65+
legend=files[f])
66+
plt.title('Speedup with {} Version'.format(NAME_MAP[p]))
67+
plt.xlabel('# cores')
68+
plt.ylabel('speedup')
69+
handles, labels = ax.get_legend_handles_labels()
70+
h = handles.pop(0)
71+
handles.append(h)
72+
l = labels.pop(0)
73+
labels.append(l)
74+
plt.legend(handles, labels)
75+
plt.tight_layout(pad=0)
76+
plt.savefig('../../report/figures/dpll_scaling_{}.pdf'.format(p),
77+
format='pdf')
78+
#plt.show()
79+
figure = plt.figure()
80+
ax = figure.add_subplot(1, 1, 1)
81+
for f in range(len(files)):
82+
self._plot_waiting(self.data[files[f]], p, ax,
83+
color=colors[f], marker=markers[f],
84+
offset=offsets[f], label=files[f])
85+
plt.title('Overall waiting time per cnf {} Version'.format(
86+
NAME_MAP[p]))
87+
plt.xlabel('# cores')
88+
plt.ylabel('overall waiting time [ms]')
89+
plt.legend()
90+
plt.tight_layout(pad=0)
91+
plt.savefig('../../report/figures/dpll_waiting_{}.pdf'.format(p),
92+
format='pdf')
93+
#plt.show()
4194

42-
def _runtime_plot(self):
95+
def _runtime_plot(self, parallel_key):
4396
for f, v in self.data.items():
44-
xs = []
45-
ys = []
46-
lowers = []
47-
uppers = []
48-
if 'seq' in v:
49-
xs.append(1)
50-
mean = np.mean(np.array(v['seq']['time']).flatten())
51-
ys.append(mean)
52-
lower, upper = conf_95_mean(np.array(v['seq']['time']).flatten())
53-
lowers.append(mean - lower)
54-
uppers.append(upper - mean)
55-
for cores, v_ in v['parallel'].items():
56-
xs.append(int(cores))
57-
mean = np.mean(np.array(v_['time']).flatten())
58-
ys.append(mean)
59-
lower, upper = conf_95_mean(np.array(v_['time']).flatten())
60-
lowers.append(mean - lower)
61-
uppers.append(upper - mean)
62-
ys = [y for _, y in sorted(zip(xs, ys))]
63-
xs = sorted(xs)
64-
plt.figure()
65-
plt.errorbar(xs, ys, yerr=[lowers, uppers], fmt='o',
66-
markerfacecolor='none')
97+
figure = plt.figure().add_subplot(1, 1, 1)
98+
self._plot_runtime(v, parallel_key, figure)
6799
plt.title('{}.cnf'.format(f))
68-
plt.ylim(0, max(ys) + 500)
69100
plt.xlabel('# cores')
70-
plt.ylabel('avg runtime [ms]')
71-
plt.savefig('figures/{}.png'.format(f))
101+
plt.ylabel('avg total waiting time [ms]')
102+
plt.savefig('figures/{}_{}.png'.format(f, parallel_key))
72103

73-
def _speedup_plot(self):
104+
def _plot_runtime(self, data, parallel_key, figure, color='teal', offset=0.0):
105+
if parallel_key not in data:
106+
return
107+
xs, ys, lowers, uppers = [], [], [], []
108+
if 'seq' in data:
109+
xs.append(1 + offset)
110+
mean = np.mean(np.array(data['seq']['time']).flatten())
111+
ys.append(mean)
112+
lower, upper = conf_95_mean(np.array(data['seq']['time']).flatten())
113+
lowers.append(mean - lower)
114+
uppers.append(upper - mean)
115+
for cores, v_ in data[parallel_key].items():
116+
xs.append(int(cores))
117+
mean = np.mean(np.array(v_['time']).flatten())
118+
ys.append(mean)
119+
lower, upper = conf_95_mean(np.array(v_['time']).flatten())
120+
lowers.append(mean - lower)
121+
uppers.append(upper - mean)
122+
ys = [y for _, y in sorted(zip(xs, ys))]
123+
xs = sorted(xs)
124+
figure.errorbar(xs, ys, yerr=[lowers, uppers], fmt='o',
125+
markerfacecolor='none', color=color)
126+
xinter = np.linspace(min(xs), max(xs), 300)
127+
yinter = spline(xs, ys, xinter)
128+
plt.plot(xinter, yinter, '-', alpha=0.5, linewidth=0.5,
129+
color=color)
130+
131+
def _speedup_plot(self, parallel_key):
74132
for f, v in self.data.items():
75-
xs = []
76-
ys = []
77-
lowers = []
78-
uppers = []
79-
if 'seq' in v:
80-
sequential = np.array(v['seq']['time']).flatten()
81-
for cores, v_ in v['parallel'].items():
82-
xs.append(int(cores))
83-
parallel = []
84-
for times in v_['time']:
85-
parallel.append(np.mean(times))
86-
speedup = sequential / parallel
87-
mean_speedup = np.mean(speedup)
88-
ys.append(mean_speedup)
89-
lower, upper = conf_95_mean(speedup)
90-
lowers.append(mean_speedup - lower)
91-
uppers.append(upper - mean_speedup)
92-
ys = [y for _, y in sorted(zip(xs, ys))]
93-
xs = sorted(xs)
94-
plt.figure()
95-
plt.errorbar(xs, ys, yerr=[lowers, uppers], fmt='o',
96-
markerfacecolor='none')
97-
plt.plot([0, max(xs)], [0, max(xs)], '--')
98-
plt.title('{}.cnf'.format(f))
99-
plt.xlabel('# cores')
100-
plt.ylabel('speedup')
101-
plt.savefig('figures/{}_speedup.png'.format(f))
133+
figure = plt.figure().add_subplot(1, 1, 1)
134+
self._plot_speedup(v, parallel_key, figure)
135+
plt.title('{}.cnf'.format(f))
136+
plt.xlabel('# cores')
137+
plt.ylabel('speedup')
138+
plt.savefig('figures/{}_speedup_{}.png'.format(f, parallel_key))
139+
140+
def _plot_speedup(self, data, parallel_key, figure, color='teal',
141+
marker='o', offset=0.0, plotline=True, legend=''):
142+
if parallel_key not in data:
143+
return
144+
xs, ys, lowers, uppers = [], [], [], []
145+
if 'seq' in data:
146+
sequential = np.array(data['seq']['time']).flatten()
147+
for cores, v_ in data[parallel_key].items():
148+
xs.append(int(cores))
149+
parallel = []
150+
for times in v_['time']:
151+
parallel.append(np.mean(times))
152+
speedup = sequential / parallel
153+
mean_speedup = np.mean(speedup)
154+
ys.append(mean_speedup)
155+
lower, upper = conf_95_mean(speedup)
156+
lowers.append(mean_speedup - lower)
157+
uppers.append(upper - mean_speedup)
158+
ys = [y for _, y in sorted(zip(xs, ys))]
159+
xs = sorted(xs)
160+
xs = list(map(lambda x: float(x) + offset, xs))
161+
if legend == '':
162+
figure.errorbar(xs, ys, yerr=[lowers, uppers], fmt=marker,
163+
markerfacecolor='none', color=color)
164+
else:
165+
figure.errorbar(xs, ys, yerr=[lowers, uppers], fmt=marker,
166+
markerfacecolor='none', color=color,
167+
label=legend)
168+
#xinter = np.linspace(min(xs), max(xs), 300)
169+
#yinter = spline(xs, ys, xinter)
170+
#plt.plot(xinter, yinter, '-', alpha=0.5, linewidth=0.5,
171+
# color=color)
172+
plt.plot(xs, ys, '-', alpha=0.5, linewidth=0.5, color=color)
173+
if plotline:
174+
plt.plot([0, max(xs)], [0, max(xs)], '-', color='black',
175+
label='Linear Speedup')
102176

177+
def _plot_waiting(self, data, parallel_key, figure, color='teal',
178+
offset=0.0, label='', marker='o'):
179+
if parallel_key not in data:
180+
return
181+
xs, ys, lowers, uppers = [], [], [], []
182+
for cores, v_ in data[parallel_key].items():
183+
xs.append(int(cores) + offset)
184+
sums = list(map(lambda wt: np.sum(np.array(wt[1:])),
185+
v_['wait']))
186+
mean = np.mean(sums)
187+
ys.append(mean)
188+
lower, upper = conf_95_mean(sums)
189+
lowers.append(mean - lower)
190+
uppers.append(upper - mean)
191+
ys = [y for _, y in sorted(zip(xs, ys))]
192+
lowers = [l for _, l in sorted(zip(xs, lowers))]
193+
uppers = [u for _, u in sorted(zip(xs, uppers))]
194+
xs = sorted(xs)
195+
figure.errorbar(xs, ys, yerr=[lowers, uppers], fmt=marker,
196+
markerfacecolor='none', color=color, label=label)
197+
plt.plot(xs, ys, '-', alpha=0.5, linewidth=0.5, color=color)
103198

104199
@click.command()
105200
@click.option('--rerun/--no-rerun', default=False,
@@ -110,7 +205,7 @@ def main(rerun, process):
110205
e = DpllScaling()
111206
if rerun:
112207
e.run_experiment()
113-
if process:
208+
elif process:
114209
e.process_euler_experiment()
115210
e.results_to_json()
116211
else:

python_wrapper/experiments/results/DpllScaling.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

python_wrapper/experiments/utils.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,15 @@ def delete_files_in_folder(folder, file_extension):
126126

127127

128128
def conf_95_mean(measurements):
129-
return stats.t.interval(0.95,
129+
lower, upper = stats.t.interval(0.95,
130130
len(measurements) - 1,
131131
loc=np.mean(measurements),
132132
scale=stats.sem(measurements))
133+
if lower != lower: # check if nan
134+
lower = np.mean(measurements)
135+
if upper != upper: # check if nan
136+
upper = np.mean(measurements)
137+
return lower, upper
133138

134139

135140
def get_netz_username():

0 commit comments

Comments
 (0)