Spaces:
Runtime error
Runtime error
| #! /usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| ############################################################################### | |
| # Copyright (c) 2018 NVIDIA Corporation | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| ############################################################################### | |
| from sys import exit | |
| from os.path import join, dirname, basename, realpath | |
| from csv import DictReader as csv_dict_reader | |
| from subprocess import Popen | |
| from argparse import ArgumentParser as argument_parser | |
| ############################################################################### | |
| def printable_cmd(c): | |
| """Converts a `list` of `str`s representing a shell command to a printable | |
| `str`.""" | |
| return " ".join(map(lambda e: '"' + str(e) + '"', c)) | |
| ############################################################################### | |
| def print_file(p): | |
| """Open the path `p` and print its contents to `stdout`.""" | |
| print "********************************************************************************" | |
| with open(p) as f: | |
| for line in f: | |
| print line, | |
| print "********************************************************************************" | |
| ############################################################################### | |
| ap = argument_parser( | |
| description = ( | |
| "CUDA Eris driver script: runs a benchmark suite multiple times, combines " | |
| "the results, and outputs them in the CUDA Eris performance result format." | |
| ) | |
| ) | |
| ap.add_argument( | |
| "-b", "--benchmark", | |
| help = ("The location of the benchmark suite executable to run."), | |
| type = str, | |
| default = join(dirname(realpath(__file__)), "bench"), | |
| metavar = "R" | |
| ) | |
| ap.add_argument( | |
| "-p", "--postprocess", | |
| help = ("The location of the postprocessing script to run to combine the " | |
| "results."), | |
| type = str, | |
| default = join(dirname(realpath(__file__)), "combine_benchmark_results.py"), | |
| metavar = "R" | |
| ) | |
| ap.add_argument( | |
| "-r", "--runs", | |
| help = ("Run the benchmark suite `R` times.a),"), | |
| type = int, default = 5, | |
| metavar = "R" | |
| ) | |
| args = ap.parse_args() | |
| if args.runs <= 0: | |
| print "ERROR: `--runs` must be greater than `0`." | |
| ap.print_help() | |
| exit(1) | |
| BENCHMARK_EXE = args.benchmark | |
| BENCHMARK_NAME = basename(BENCHMARK_EXE) | |
| POSTPROCESS_EXE = args.postprocess | |
| OUTPUT_FILE_NAME = lambda i: BENCHMARK_NAME + "_" + str(i) + ".csv" | |
| COMBINED_OUTPUT_FILE_NAME = BENCHMARK_NAME + "_combined.csv" | |
| ############################################################################### | |
| print '&&&& RUNNING {0}'.format(BENCHMARK_NAME) | |
| print '#### RUNS {0}'.format(args.runs) | |
| ############################################################################### | |
| print '#### CMD {0}'.format(BENCHMARK_EXE) | |
| for i in xrange(args.runs): | |
| with open(OUTPUT_FILE_NAME(i), "w") as output_file: | |
| print '#### RUN {0} OUTPUT -> {1}'.format(i, OUTPUT_FILE_NAME(i)) | |
| p = None | |
| try: | |
| p = Popen(BENCHMARK_EXE, stdout = output_file, stderr = output_file) | |
| p.communicate() | |
| except OSError as ex: | |
| print_file(OUTPUT_FILE_NAME(i)) | |
| print '#### ERROR Caught OSError `{0}`.'.format(ex) | |
| print '&&&& FAILED {0}'.format(BENCHMARK_NAME) | |
| exit(-1) | |
| print_file(OUTPUT_FILE_NAME(i)) | |
| if p.returncode != 0: | |
| print '#### ERROR Process exited with code {0}.'.format(p.returncode) | |
| print '&&&& FAILED {0}'.format(BENCHMARK_NAME) | |
| exit(p.returncode) | |
| ############################################################################### | |
| post_cmd = [POSTPROCESS_EXE] | |
| # Add dependent variable options. | |
| post_cmd += ["-dSTL Average Walltime,STL Walltime Uncertainty,STL Trials"] | |
| post_cmd += ["-dSTL Average Throughput,STL Throughput Uncertainty,STL Trials"] | |
| post_cmd += ["-dThrust Average Walltime,Thrust Walltime Uncertainty,Thrust Trials"] | |
| post_cmd += ["-dThrust Average Throughput,Thrust Throughput Uncertainty,Thrust Trials"] | |
| post_cmd += [OUTPUT_FILE_NAME(i) for i in range(args.runs)] | |
| print '#### CMD {0}'.format(printable_cmd(post_cmd)) | |
| with open(COMBINED_OUTPUT_FILE_NAME, "w") as output_file: | |
| p = None | |
| try: | |
| p = Popen(post_cmd, stdout = output_file, stderr = output_file) | |
| p.communicate() | |
| except OSError as ex: | |
| print_file(COMBINED_OUTPUT_FILE_NAME) | |
| print '#### ERROR Caught OSError `{0}`.'.format(ex) | |
| print '&&&& FAILED {0}'.format(BENCHMARK_NAME) | |
| exit(-1) | |
| print_file(COMBINED_OUTPUT_FILE_NAME) | |
| if p.returncode != 0: | |
| print '#### ERROR Process exited with code {0}.'.format(p.returncode) | |
| print '&&&& FAILED {0}'.format(BENCHMARK_NAME) | |
| exit(p.returncode) | |
| with open(COMBINED_OUTPUT_FILE_NAME) as input_file: | |
| reader = csv_dict_reader(input_file) | |
| variable_units = reader.next() # Get units header row. | |
| distinguishing_variables = reader.fieldnames | |
| measured_variables = [ | |
| ("STL Average Throughput", "+"), | |
| ("Thrust Average Throughput", "+") | |
| ] | |
| for record in reader: | |
| for variable, directionality in measured_variables: | |
| # Don't monitor regressions for STL implementations, nvbug 28980890: | |
| if "STL" in variable: | |
| continue | |
| print "&&&& PERF {0}_{1}_{2}bit_{3}mib_{4} {5} {6}{7}".format( | |
| record["Algorithm"], | |
| record["Element Type"], | |
| record["Element Size"], | |
| record["Total Input Size"], | |
| variable.replace(" ", "_").lower(), | |
| record[variable], | |
| directionality, | |
| variable_units[variable] | |
| ) | |
| ############################################################################### | |
| print '&&&& PASSED {0}'.format(BENCHMARK_NAME) | |