示例#1
0
def main(arguments) -> None:
    """ Main function for pira framework. Used to invoke the various components. """
    show_pira_invoc_info(arguments)

    invoc_cfg = process_args_for_invoc(arguments)
    use_extra_p, extrap_config = process_args_for_extrap(arguments)

    home_dir = U.get_cwd()
    U.set_home_dir(home_dir)

    U.make_dir(invoc_cfg.get_pira_dir())
    BackendDefaults(invoc_cfg)

    csv_config = process_args_for_csv(arguments)

    try:
        if arguments.config_version is 1:
            config_loader = CLoader()
        else:
            config_loader = SCLoader()

        configuration = config_loader.load_conf(invoc_cfg.get_path_to_cfg())
        checker.check_configfile(configuration, arguments.config_version)

        if B.check_queued_job():
            # FIXME: Implement
            L.get_logger().log(
                'In this version of PIRA it is not yet implemented',
                level='error')
            assert (False)

        else:
            '''
      This branch is running PIRA actively on the local machine.
      It is blocking, and the user can track the progress in the terminal.
      '''
            L.get_logger().log('Running the local case')

            # The FunctorManager manages loaded functors and generates the respective names
            F.FunctorManager(configuration)
            dbm = D.DBManager(D.DBManager.db_name + '.' + D.DBManager.db_ext)
            dbm.create_cursor()
            analyzer = A(configuration)

            runner_factory = PiraRunnerFactory(invoc_cfg, configuration)
            runner = runner_factory.get_simple_local_runner()
            if use_extra_p:
                L.get_logger().log('Running with Extra-P runner')
                runner = runner_factory.get_scalability_runner(extrap_config)

            if runner.has_sink():
                analyzer.set_profile_sink(runner.get_sink())

            # A build/place is a top-level directory
            for build in configuration.get_builds():
                L.get_logger().log('Build: ' + str(build))
                app_tuple = (U.generate_random_string(), build, '', '')
                dbm.insert_data_application(app_tuple)

                # An item is a target/software in that directory
                for item in configuration.get_items(build):
                    L.get_logger().log('Running for item ' + str(item))

                    # A flavor is a specific version to build
                    if configuration.has_local_flavors(build, item):
                        for flavor in configuration.get_flavors(build, item):
                            L.get_logger().log('Running for local flavor ' +
                                               flavor,
                                               level='debug')

                            # prepare database, and get a unique handle for current item.
                            db_item_id = dbm.prep_db_for_build_item_in_flavor(
                                configuration, build, item, flavor)
                            # Create configuration object for the item currently processed.
                            place = configuration.get_place(build)
                            t_config = TargetConfiguration(
                                place, build, item, flavor, db_item_id,
                                invoc_cfg.is_compile_time_filtering(),
                                invoc_cfg.get_hybrid_filter_iters())

                            # Execute using a local runner, given the generated target description
                            execute_with_config(runner, analyzer,
                                                invoc_cfg.get_pira_iters(),
                                                t_config, csv_config)

                    # If global flavor
                    else:
                        # TODO: Implement
                        L.get_logger().log(
                            'In this version of PIRA it is not yet implemented',
                            level='error')
                        assert (False)

        U.change_cwd(home_dir)

    except RuntimeError as rt_err:
        U.change_cwd(home_dir)
        L.get_logger().log('Runner.run caught exception. Message: ' +
                           str(rt_err),
                           level='error')
        L.get_logger().dump_tape()
        sys.exit(-1)
示例#2
0
def execute_with_config(runner: Runner, analyzer: A, pira_iters: int,
                        target_config: TargetConfiguration,
                        csv_config: CSVConfiguration) -> None:
    try:
        instrument = False
        pira_iterations = pira_iters
        hybrid_filtering = target_config.is_hybrid_filtering()
        compile_time_filtering = target_config.is_compile_time_filtering()
        hybrid_filter_iters = target_config.get_hybrid_filter_iters()

        rr_exporter = E.RunResultExporter()

        # Build without any instrumentation
        L.get_logger().log(
            'Building vanilla version for baseline measurements', level='info')
        vanilla_builder = BU(target_config, instrument)
        tracker = T.TimeTracker()
        tracker.m_track('Vanilla Build', vanilla_builder, 'build')

        # Run without instrumentation for baseline
        L.get_logger().log('Running baseline measurements', level='info')
        vanilla_rr = runner.do_baseline_run(target_config)
        L.get_logger().log('Pira::execute_with_config: RunResult: ' +
                           str(vanilla_rr) + ' | avg: ' +
                           str(vanilla_rr.get_average()),
                           level='debug')
        instr_file = ''

        if (csv_config.should_export()):
            rr_exporter.add_row('Vanilla', vanilla_rr)

        for x in range(0, pira_iterations):
            L.get_logger().log('Running instrumentation iteration ' + str(x),
                               level='info')

            # Only run the pgoe to get the functions name
            iteration_tracker = T.TimeTracker()

            # Analysis Phase
            instr_file = analyzer.analyze(target_config, x)
            L.get_logger().log('[WHITELIST] $' + str(x) + '$ ' +
                               str(U.lines_in_file(instr_file)),
                               level='perf')
            U.shell('stat ' + instr_file)

            # After baseline measurement is complete, do the instrumented build/run
            # This is only necessary in every iteration when run in compile-time mode.
            # For hybrid-filtering this is done after the specified amount of iterations
            if (hybrid_filtering and (x % hybrid_filter_iters is 0)
                ) or x is 0 or compile_time_filtering:
                instrument = True
                instr_builder = BU(target_config, instrument, instr_file)
                tracker.m_track('Instrument Build', instr_builder, 'build')

            #Run Phase
            L.get_logger().log('Running profiling measurements', level='info')
            instr_rr = runner.do_profile_run(target_config, x)

            if (csv_config.should_export()):
                rr_exporter.add_row('Instrumented ' + str(x), instr_rr)

            # Compute overhead of instrumentation
            ovh_percentage = instr_rr.compute_overhead(vanilla_rr)
            L.get_logger().log('[RUNTIME] $' + str(x) + '$ ' +
                               str(instr_rr.get_average()),
                               level='perf')
            L.get_logger().log('[OVERHEAD] $' + str(x) + '$ ' +
                               str(ovh_percentage),
                               level='perf')

            iteration_tracker.stop()
            user_time, system_time = iteration_tracker.get_time()
            L.get_logger().log('[ITERTIME] $' + str(x) + '$ ' +
                               str(user_time) + ', ' + str(system_time),
                               level='perf')

        if (csv_config.should_export()):
            file_name = target_config.get_target(
            ) + '_' + target_config.get_flavor() + '.csv'
            csv_file = os.path.join(csv_config.get_csv_dir(), file_name)
            try:
                U.make_dir(csv_config.get_csv_dir())
                rr_exporter.export(csv_file, csv_config.get_csv_dialect())
            except Exception as e:
                L.get_logger().log(
                    'Pira::execute_with_config: Problem writing CSV file\nMessage:\n'
                    + str(e),
                    level='error')

    except Exception as e:
        L.get_logger().log(
            'Pira::execute_with_config: Problem during preparation of run.\nMessage:\n'
            + str(e),
            level='error')
        raise RuntimeError(str(e))
示例#3
0
 def test_make_dir(self):
   u.make_dir("/home")