added a way to redirect stdout and stderr to files to avoid pollution on the console
This commit is contained in:
		
							parent
							
								
									34fc73cccf
								
							
						
					
					
						commit
						9b12ce7cd2
					
				|  | @ -3,7 +3,7 @@ | |||
| import threading | ||||
| import subprocess | ||||
| import os | ||||
| from typing import List, Dict  # , Set, , Tuple, Optional | ||||
| from typing import List, Dict, IO  # , Set, , Tuple, Optional | ||||
| from datetime import datetime | ||||
| from pathlib import Path | ||||
| from abc import ABC, abstractmethod | ||||
|  | @ -72,10 +72,12 @@ class StarBencher(): | |||
|     the 'star' term comes from hpl's stadgemm benchmark, where we launch `n` independent programs on `n cores` | ||||
|     ''' | ||||
| 
 | ||||
|     def __init__(self, run_command: List[str], num_cores_per_run: int, num_parallel_runs: int, max_num_cores: int, stop_condition: IStarBencherStopCondition, stop_on_error=True, run_command_cwd: Path = None): | ||||
|     def __init__(self, run_command: List[str], num_cores_per_run: int, num_parallel_runs: int, max_num_cores: int, stop_condition: IStarBencherStopCondition, stop_on_error=True, run_command_cwd: Path = None, stdout_filepath: Path = None, stderr_filepath: Path = None): | ||||
|         assert num_cores_per_run * num_parallel_runs <= max_num_cores | ||||
|         self.run_command: List[str] = run_command | ||||
|         self.run_command_cwd = run_command_cwd | ||||
|         self.stdout_filepath = stdout_filepath | ||||
|         self.stderr_filepath = stderr_filepath | ||||
|         self.num_cores_per_run = num_cores_per_run | ||||
|         self.num_parallel_runs = num_parallel_runs | ||||
|         self.max_num_cores: int = max_num_cores | ||||
|  | @ -88,7 +90,7 @@ class StarBencher(): | |||
|         self._runs_lock = threading.Lock() | ||||
|         self._finished_event = threading.Event() | ||||
| 
 | ||||
|     def popen_and_call(self, popen_args, on_exit, run_id: int, cwd: Path): | ||||
|     def popen_and_call(self, popen_args, on_exit, run_id: int, cwd: Path, stdout_filepath: Path = None, stderr_filepath: Path = None): | ||||
|         """ | ||||
|         Runs the given args in a subprocess.Popen, and then calls the function | ||||
|         on_exit when the subprocess completes. | ||||
|  | @ -97,9 +99,18 @@ class StarBencher(): | |||
|         """ | ||||
|         def run_in_thread(popen_args, on_exit): | ||||
|             print('popen_args', popen_args) | ||||
|             proc = subprocess.Popen(popen_args, cwd=cwd) | ||||
|             print('coucou') | ||||
|             stdout = None | ||||
|             stderr = None | ||||
|             if stdout_filepath is not None: | ||||
|                 stdout = open(stdout_filepath, 'w') | ||||
|             if stderr_filepath is not None: | ||||
|                 stderr = open(stderr_filepath, 'w') | ||||
|             proc = subprocess.Popen(popen_args, cwd=cwd, stdout=stdout, stderr=stderr) | ||||
|             proc.wait() | ||||
|             if stderr is not None: | ||||
|                 stderr.close() | ||||
|             if stdout is not None: | ||||
|                 stdout.close() | ||||
|             on_exit(proc.pid, proc.returncode, run_id) | ||||
|             return | ||||
|         thread = threading.Thread(target=run_in_thread, args=(popen_args, on_exit)) | ||||
|  | @ -150,10 +161,17 @@ class StarBencher(): | |||
|         worker_as_str = '%03d' % worker_id | ||||
|         run_command = [str(s).replace('<worker_id>', worker_as_str) for s in self.run_command] | ||||
|         run_command_cwd = str(self.run_command_cwd).replace('<worker_id>', worker_as_str) | ||||
|         stdout_filepath = None | ||||
|         if self.stdout_filepath is not None: | ||||
|             stdout_filepath = str(self.stdout_filepath).replace('<worker_id>', worker_as_str) | ||||
|         stderr_filepath = None | ||||
|         if self.stderr_filepath is not None: | ||||
|             stderr_filepath = str(self.stderr_filepath).replace('<worker_id>', worker_as_str) | ||||
|         run_command_cwd = str(self.run_command_cwd).replace('<worker_id>', worker_as_str) | ||||
|         with self._runs_lock: | ||||
|             run = Run(self._next_run_id, worker_id) | ||||
|             self._next_run_id += 1 | ||||
|             run_thread = self.popen_and_call(popen_args=run_command, on_exit=self.on_exit, run_id=run.id, cwd=run_command_cwd)  # noqa:F841 | ||||
|             run_thread = self.popen_and_call(popen_args=run_command, on_exit=self.on_exit, run_id=run.id, cwd=run_command_cwd, stdout_filepath=stdout_filepath, stderr_filepath=stderr_filepath)  # noqa:F841 | ||||
|             self._runs[run.id] = run | ||||
| 
 | ||||
|     def run(self): | ||||
|  | @ -187,7 +205,8 @@ def measure_hibridon_perf(hibridon_version: str, tmp_dir: Path, num_cores: int, | |||
|             num_parallel_runs=num_cores, | ||||
|             max_num_cores=num_cores, | ||||
|             stop_condition=StopAfterSingleRun(), | ||||
|             run_command_cwd=Path('/tmp')) | ||||
|             run_command_cwd=Path('/tmp'), | ||||
|             stdout_filepath=build_dir / 'create_build_dir_stdout.txt') | ||||
|         create_build_dir_duration = create_build_dir.run()  # noqa: F841 | ||||
|         # build_dir.mkdir(exist_ok=True) | ||||
| 
 | ||||
|  | @ -197,7 +216,9 @@ def measure_hibridon_perf(hibridon_version: str, tmp_dir: Path, num_cores: int, | |||
|             num_parallel_runs=num_cores, | ||||
|             max_num_cores=num_cores, | ||||
|             stop_condition=StopAfterSingleRun(), | ||||
|             run_command_cwd=build_dir) | ||||
|             run_command_cwd=build_dir, | ||||
|             stdout_filepath=build_dir / 'configure_stdout.txt', | ||||
|             stderr_filepath=build_dir / 'configure_stderr.txt') | ||||
|         configure_duration = configure.run()  # noqa: F841 | ||||
| 
 | ||||
|         build = StarBencher( | ||||
|  | @ -206,7 +227,9 @@ def measure_hibridon_perf(hibridon_version: str, tmp_dir: Path, num_cores: int, | |||
|             num_parallel_runs=num_cores, | ||||
|             max_num_cores=num_cores, | ||||
|             stop_condition=StopAfterSingleRun(), | ||||
|             run_command_cwd=build_dir) | ||||
|             run_command_cwd=build_dir, | ||||
|             stdout_filepath=build_dir / 'build_stdout.txt', | ||||
|             stderr_filepath=build_dir / 'build_stderr.txt') | ||||
|         build_duration = build.run()  # noqa: F841 | ||||
| 
 | ||||
|         stop_condition = StopAfterSingleRun() | ||||
|  | @ -216,7 +239,9 @@ def measure_hibridon_perf(hibridon_version: str, tmp_dir: Path, num_cores: int, | |||
|             num_parallel_runs=num_cores, | ||||
|             max_num_cores=num_cores, | ||||
|             stop_condition=stop_condition, | ||||
|             run_command_cwd=build_dir) | ||||
|             run_command_cwd=build_dir, | ||||
|             stdout_filepath=build_dir / 'bench_stdout.txt', | ||||
|             stderr_filepath=build_dir / 'bench_stderr.txt') | ||||
|         mean_duration = bench.run() | ||||
|         print('duration for compiler %s : %.3f s' % (compiler, mean_duration)) | ||||
| 
 | ||||
|  | @ -226,7 +251,7 @@ if __name__ == '__main__': | |||
|         github_username = 'g-raffy'  # os.environ['HIBRIDON_REPOS_USER'] | ||||
|         with open('%s/.github/personal_access_tokens/bench.hibridon.cluster.ipr.univ-rennes1.fr.pat' % os.environ['HOME'], 'r') as f: | ||||
|             github_personal_access_token = f.readline().replace('\n', '')  # os.environ['HIBRIDON_REPOS_PAT'] | ||||
|         print('coucou', github_personal_access_token[-1]) | ||||
|         # print('coucou', github_personal_access_token[-1]) | ||||
|         hibridon_version = '02aeb2c2da5ebe0f7301c9909aa623864e562c71' | ||||
|         tmp_dir = Path('/tmp/hibridon_perf') | ||||
|         measure_hibridon_perf(hibridon_version, tmp_dir, num_cores=2, github_username=github_username, github_personal_access_token=github_personal_access_token) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue