From 5276c950377e6a626fa9f3e5536d6a7e03d8659a Mon Sep 17 00:00:00 2001 From: "Kurt A. O'Hearn" <ohearnku@msu.edu> Date: Tue, 2 Aug 2016 08:45:35 -0700 Subject: [PATCH] Update tools. --- tools/run_sim.py | 112 ++++++++++++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 50 deletions(-) diff --git a/tools/run_sim.py b/tools/run_sim.py index a5915aa5..39342fdb 100644 --- a/tools/run_sim.py +++ b/tools/run_sim.py @@ -4,20 +4,22 @@ from fileinput import input from itertools import product from re import sub from subprocess import Popen, PIPE -from os import getcwd, environ, path, rename +from os import getcwd, environ, path, remove, rename, rmdir from sys import exit +from tempfile import mkdtemp from time import time class TestCase(): def __init__(self, geo_file, ffield_file, control_file, params={}, result_header_fmt='', - result_body_fmt='', result_file='result.txt'): + result_header='', result_body_fmt='', result_file='results.txt'): self.__geo_file = geo_file self.__ffield_file = ffield_file self.__control_file = control_file self.__param_names = sorted(params.keys()) self.__params = params self.__result_header_fmt = result_header_fmt + self.__result_header = result_header self.__result_body_fmt = result_body_fmt self.__result_file = result_file self.__control_res = { \ @@ -45,18 +47,22 @@ class TestCase(): r'(?P<key>geo_format\s+)\S+(?P<comment>.*)', r'\g<key>%s\g<comment>' % x, l), \ } - def _setup(self, param): - for line in input(self.__control_file, inplace=1): - line = line.rstrip() - for k in self.__control_res.keys(): - try: - line = self.__control_res[k](line, param[k]) - except KeyError: - pass - print line - - def run(self): + def _setup(self, param, temp_file): + fp = open(self.__control_file, 'r') + lines = fp.read() + fp.close() + for k in self.__control_res.keys(): + try: + lines = self.__control_res[k](lines, param[k]) + except KeyError: + pass + fp_temp = open(temp_file, 'w', 0) + fp_temp.write(lines) + fp_temp.close() + + def run(self, bin_file='sPuReMD/bin/spuremd'): base_dir = getcwd() + bin_path = path.join(base_dir, bin_file) env = dict(environ) write_header = True @@ -64,8 +70,10 @@ class TestCase(): write_header = False fout = open(self.__result_file, 'a', 0) if write_header: - fout.write(self.__result_header_fmt.format('Data Set', 'Steps', 'Q Tol', 'Pre T', 'Pre Comp', - 'Pre App', 'Iters', 'SpMV', 'QEq', 'Threads', 'Time (s)')) + fout.write(self.__result_header_fmt.format(*self.__result_header)) + + temp_dir = mkdtemp() + temp_file = path.join(temp_dir, path.basename(self.__control_file)) for p in product(*[self.__params[k] for k in self.__param_names]): param_dict = dict((k, v) for (k, v) in zip(self.__param_names, p)) @@ -73,24 +81,24 @@ class TestCase(): + '_step' + param_dict['nsteps'] + '_tol' + param_dict['qeq_solver_q_err'] \ + '_precomp' + param_dict['pre_comp_type'] + '_thread' + param_dict['threads'] - self._setup(param_dict) + self._setup(param_dict, temp_file) env['OMP_NUM_THREADS'] = param_dict['threads'] start = time() - proc_handle = Popen([path.join(base_dir, 'sPuReMD/bin/spuremd'), - self.__geo_file, self.__ffield_file, self.__control_file], + proc_handle = Popen([bin_path, self.__geo_file, self.__ffield_file, temp_file], stdout=PIPE, stderr=PIPE, env=env) #TODO: handle outputs? stdout, stderr = proc_handle.communicate() - print 'stdout:', stdout - print 'stderr:', stderr stop = time() self._process_result(fout, stop - start, param_dict) fout.close() + remove(temp_file) + rmdir(temp_dir) def _process_result(self, fout, time, param): + qeq = 0. iters = 0. pre_comp = 0. pre_app = 0. @@ -100,6 +108,7 @@ class TestCase(): for line in fp: line = line.split() try: + qeq = qeq + float(line[6]) iters = iters + float(line[7]) pre_comp = pre_comp + float(line[8]) pre_app = pre_app + float(line[9]) @@ -108,14 +117,15 @@ class TestCase(): except Exception: pass cnt = cnt - 1 + qeq = qeq / cnt iters = iters / cnt pre_comp = pre_comp / cnt pre_app = pre_app / cnt spmv = spmv / cnt - fout.write(self.__result_body_fmt.format(path.basename(self.__control_file).split('.')[0], + fout.write(self.__result_body_fmt.format(path.basename(self.__geo_file).split('.')[0], param['nsteps'], param['qeq_solver_q_err'], param['pre_comp_type'], pre_comp, pre_app, iters, spmv, - param['threads'], time)) + qeq, param['threads'], time)) if __name__ == '__main__': @@ -124,21 +134,23 @@ if __name__ == '__main__': data_dir = path.join(base_dir, 'data/benchmarks') header_fmt_str = '{:20}|{:5}|{:5}|{:5}|{:10}|{:10}|{:10}|{:10}|{:10}|{:10}|{:10}\n' + header_str = ['Data Set', 'Steps', 'Q Tol', 'Pre T', 'Pre Comp', + 'Pre App', 'Iters', 'SpMV', 'QEq', 'Threads', 'Time (s)'] body_fmt_str = '{:20} {:5} {:5} {:5} {:10.6f} {:10.6f} {:10.6f} {:10.6f} {:10.6f} {:10} {:10.6f}\n' params = { 'ensemble_type': ['0'], - 'nsteps': ['20'], - 'qeq_solver_type': ['2'], - 'qeq_solver_q_err': ['1e-6'], + 'nsteps': ['20', '100', '500', '1000'], + 'qeq_solver_type': ['0'], + 'qeq_solver_q_err': ['1e-6', '1e-10'], # 'qeq_solver_q_err': ['1e-6', '1e-8', '1e-10', '1e-14'], - 'pre_comp_type': ['2'], + 'pre_comp_type': ['0'], # 'pre_comp_type': ['0', '1', '2'], - 'pre_comp_refactor': ['20'], + 'pre_comp_refactor': ['1'], # 'pre_comp_sweeps': ['3'], # 'pre_app_type': ['0'], # 'pre_app_jacobi_iters': ['50'], - 'threads': ['1'], + 'threads': ['12'], # 'threads': ['1', '2', '4', '12', '24'], 'geo_format': ['1'], } @@ -147,39 +159,39 @@ if __name__ == '__main__': TestCase(path.join(data_dir, 'water/water_6540.pdb'), path.join(data_dir, 'water/ffield.water'), path.join(control_dir, 'param.gpu.water'), - params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str), + params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str), # TestCase(path.join(data_dir, 'water/water_78480.pdb'), # path.join(data_dir, 'water/ffield.water'), # path.join(control_dir, 'param.gpu.water'), -# params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str), +# params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str), # TestCase(path.join(data_dir, 'water/water_327000.geo'), # path.join(data_dir, 'water/ffield.water'), # path.join(control_dir, 'param.gpu.water'), -# params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str), -# TestCase(path.join(data_dir, 'bilayer/bilayer_56800.pdb'), -# path.join(data_dir, 'bilayer/ffield-bio'), -# path.join(control_dir, 'param.gpu.water'), -# params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str), -# TestCase(path.join(data_dir, 'dna/dna_19733.pdb'), -# path.join(data_dir, 'dna/ffield-dna'), -# path.join(control_dir, 'param.gpu.water'), -# params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str), -# TestCase(path.join(data_dir, 'silica/silica_6000.pdb'), -# path.join(data_dir, 'silica/ffield-bio'), -# path.join(control_dir, 'param.gpu.water'), -# params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str), +# params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str), + TestCase(path.join(data_dir, 'bilayer/bilayer_56800.pdb'), + path.join(data_dir, 'bilayer/ffield-bio'), + path.join(control_dir, 'param.gpu.water'), + params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str), + TestCase(path.join(data_dir, 'dna/dna_19733.pdb'), + path.join(data_dir, 'dna/ffield-dna'), + path.join(control_dir, 'param.gpu.water'), + params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str), + TestCase(path.join(data_dir, 'silica/silica_6000.pdb'), + path.join(data_dir, 'silica/ffield-bio'), + path.join(control_dir, 'param.gpu.water'), + params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str), # TestCase(path.join(data_dir, 'silica/silica_72000.geo'), # path.join(data_dir, 'silica/ffield-bio'), # path.join(control_dir, 'param.gpu.water'), -# params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str), +# params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str), # TestCase(path.join(data_dir, 'silica/silica_300000.geo'), # path.join(data_dir, 'silica/ffield-bio'), # path.join(control_dir, 'param.gpu.water'), -# params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str), -# TestCase(path.join(data_dir, 'petn/petn_48256.pdb'), -# path.join(data_dir, 'petn/ffield.petn'), -# path.join(control_dir, 'param.gpu.water'), -# params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str), +# params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str), + TestCase(path.join(data_dir, 'petn/petn_48256.pdb'), + path.join(data_dir, 'petn/ffield.petn'), + path.join(control_dir, 'param.gpu.water'), + params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str), ] for test in test_cases: - test.run() + test.run(bin_file='sPuReMD/bin/spuremd') -- GitLab