def copy_system_libraries(env, kitdir, files, extra_ld_library_paths=[]): """copy system libraries to kit on Linux systems. Return True on success.""" # Make a temporary environment for running ldd that includes any required # LD_LIBRARY_PATH additions. osenv = None if extra_ld_library_paths: osenv = copy.deepcopy(os.environ) s = None if 'LD_LIBRARY_PATH' in osenv: s = osenv['LD_LIBRARY_PATH'] osenv['LD_LIBRARY_PATH'] = ":".join(extra_ld_library_paths) if s: osenv['LD_LIBRARY_PATH'] += ":" + s okay = True if env.on_linux() or env.on_freebsd() or env.on_netbsd(): system_libraries = set() for binary_executable in files: if os.path.exists(binary_executable): (retval, lines, stderr) = mbuild.run_command( "ldd {}".format(binary_executable), osenv=osenv) for line in lines: line = line.rstrip() print("\t{}".format(line)) if retval != 0: # error handling if len(lines) >= 1: if lines[0].find("not a dynamic executable") != -1: continue elif lines[0].find( "not a dynamic ELF executable") != -1: continue mbuild.warn("Could not run ldd on [%s]" % binary_executable) return False if env.on_freebsd() or env.on_netbsd(): lines = lines[1:] ldd_okay, files = _grab_ldd_libraries(lines) if not ldd_okay: okay = False for lib in files: if not _file_to_avoid(env, lib): system_libraries.add(lib) for slib in system_libraries: mbuild.msgb("TO COPY", slib) for slib in system_libraries: mbuild.copy_file(src=slib, tgt=kitdir) return okay
def work(args): print("Testing performance...") if not os.path.exists(args.input): mbuild.warn("Performance test input binary not found: {}".format( args.input)) return 2 if not os.path.exists(args.xed): mbuild.warn("Performance test executable binary not found: {}".format( args.xed)) return 2 s = args.xed + ' -v 0 -i ' + args.input cpd = [] print("Skipping {} samples...".format(args.skip)) for sample in range(0, args.skip): (status, stdout, stderr) = mbuild.run_command(s) print("Running {} tests...".format(args.samples)) for sample in range(0, args.samples): (status, stdout, stderr) = mbuild.run_command(s) found = False if status == 0 and stdout: for line in stdout: if '#Total cycles/instruction DECODE' in line: chunks = line.strip().split() cpd_one = float(chunks[-1]) found = True if status and stdout: print("Error messages from sample {0:d}:".format(sample)) for line in stdout: print(" ", line, end=' ') if found: cpd.append(cpd_one) if len(cpd) == args.samples: expected = 450.0 # cycles / decode cpd_min = min(cpd) cpd_max = max(cpd) cpd_avg = sum(cpd) / len(cpd) print( textwrap.fill("Samples: " + ", ".join(["{0:6.2f}".format(x) for x in cpd]), subsequent_indent=" ")) print("Minimum: {0:6.2f}".format(cpd_min)) print("Average: {0:6.2f}".format(cpd_avg)) print("Maximum: {0:6.2f}".format(cpd_max)) print("Range : {0:6.2f}".format(cpd_max - cpd_min)) print("Stddev : {0:6.2f}".format(standard_deviation(cpd))) if cpd_avg > expected: s = ["PERFORMANCE DEGREDATION: "] s.append("Observed {0:.2f} vs Expected {1:.2f}".format( cpd_avg, expected)) print("".join(s)) return 1 # error print("Success. Average less than {0:.2f}".format(expected)) if args.graph: graph_it(cpd) return 0 # success print("MISSING SAMPLES") return 2