Skip to content
Snippets Groups Projects
Verified Commit 47a9483c authored by René Fritze's avatar René Fritze
Browse files

[cmake] make work dist script use multiprocess

parent 456b69a4
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,8 @@ import subprocess ...@@ -8,6 +8,8 @@ import subprocess
import time import time
from contextlib import contextmanager from contextlib import contextmanager
import binpacking import binpacking
from multiprocessing import Pool
MAXTIME = 45*60 MAXTIME = 45*60
pickle_file = 'totals.pickle' pickle_file = 'totals.pickle'
...@@ -23,52 +25,56 @@ def elapsed_timer(): ...@@ -23,52 +25,56 @@ def elapsed_timer():
elapser = lambda: end-start elapser = lambda: end-start
def redo_timings(argv): def _compile(binary):
builddir = argv[1] with elapsed_timer() as timer:
builder_count = argv[2] subprocess.check_call(['ninja', '-j1', binary])
binaries = argv[3].split(';') return timer()
# list comes with a leading empty entry
testnames = argv[4].split('/')[1:]
def _run_tests(tpl):
binary, teststrings = tpl
testtimes = 0
for test in teststrings.split('/'):
with elapsed_timer() as timer:
subprocess.check_call(['ctest', '-j1', '-R', test])
testtimes += timer()
return testtimes
os.chdir(builddir)
compiles = {}
testtimes = {}
def redo_timings(builddir, binaries, testnames, processes):
os.chdir(builddir)
testlimit = -1 testlimit = -1
binaries = binaries[:testlimit] binaries = binaries[:testlimit]
testnames = testnames[:testlimit] testnames = testnames[:testlimit]
totals = {}
for binary in binaries: with Pool(processes=processes) as pool:
with elapsed_timer() as timer: compiles = pool.map(_compile, binaries)
subprocess.check_call(['ninja', '-j1', binary]) with Pool(processes=processes) as pool:
compiles[binary] = timer() testruns = pool.map(_run_tests, zip(binaries, testnames))
totals[binary] = compiles[binary]
for binary, teststrings in zip(binaries, testnames): totals = [a+b for a,b in zip(compiles, testruns)]
testtimes[binary] = 0
pprint(teststrings.split('/'))
for test in teststrings.split('/'):
with elapsed_timer() as timer:
subprocess.check_call(['ctest', '-j1', '-R', test])
testtimes[binary] += timer()
totals[binary] = testtimes[binary]
print('compiles')
pprint(compiles)
print('testtimes')
pprint(testtimes)
print('totals') print('totals')
pprint(totals) pprint(totals)
pickle.dump(totals, open(os.path.join(builddir, pickle_file), 'wb')) pickle.dump(totals, open(os.path.join(builddir, pickle_file), 'wb'))
return totals return {b: t for b, t in zip(binaries, totals)}
# list comes with a leading empty entry
testnames = sys.argv[4].split('/')[1:]
builddir = sys.argv[1]
binaries = sys.argv[3].split(';')
processes = 4
try: try:
builddir = sys.argv[1]
totals = pickle.load(open(os.path.join(builddir, pickle_file), 'rb')) totals = pickle.load(open(os.path.join(builddir, pickle_file), 'rb'))
if totals.keys() != binaries:
totals = redo_timings(builddir, binaries, testnames, processes)
except FileNotFoundError: except FileNotFoundError:
totals = redo_timings(sys.argv) totals = redo_timings(builddir, binaries, testnames, processes)
b = list(totals.values()) builder_count = sys.argv[2]
bins = binpacking.to_constant_volume(b,MAXTIME)
b = list(totals.keys())
bins = binpacking.to_constant_volume(b,MAXTIME)
pprint(bins) pprint(bins)
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment