kerncraft/kerncraft.py
def run(parser, args, output_file=sys.stdout):
    """Run command line interface."""
    # Try loading results file (if requested)
    result_storage = {}
    if args.store:
        args.store.seek(0)
        try:
            result_storage = pickle.load(args.store)
        except EOFError:
            pass
        args.store.close()

    # machine information
    # Read machine description
    machine = MachineModel(args.machine.name, args=args)

    # process kernel
    if not args.kernel_description:
        code = str(args.code_file.read())
        code = clean_code(code)
        kernel = KernelCode(code, filename=args.code_file.name, machine=machine,
                            keep_intermediates=not args.clean_intermediates)
    else:
        description = str(args.code_file.read())
        kernel = KernelDescription(yaml.load(description, Loader=yaml.Loader), machine=machine)
    # if no defines were given, guess suitable defines in-mem
    # TODO support in-cache
    # TODO broaden cases to n-dimensions
    # TODO make configurable (no hardcoded 512MB/1GB/min. 3 iteration ...)
    # works only for up to 3 dimensions
    required_consts = [v[1] for v in kernel.variables.values() if v[1] is not None]
    required_consts += [[l['start'], l['stop']] for l in kernel.get_loop_stack()]
    # split into individual consts
    required_consts = [i for l in required_consts for i in l]
    required_consts = set([i for l in required_consts for i in l.free_symbols])
    if len(required_consts) > 0:
        # build defines permutations
        define_dict = {}
        for name, values in args.define:
            if name not in define_dict:
                define_dict[name] = [[name, v] for v in values]
                continue
            for v in values:
                if v not in define_dict[name]:
                    define_dict[name].append([name, v])
        define_product = list(itertools.product(*list(define_dict.values())))

        # Check that all consts have been defined
        if set(required_consts).difference(set([symbol_pos_int(k) for k in define_dict.keys()])):
            raise ValueError("Not all constants have been defined. Required are: {}".format(
                required_consts))
    else:
        define_product = [{}]

    for define in define_product:
        # Reset state of kernel
        kernel.clear_state()

        # Add constants from define arguments
        for k, v in define:
            kernel.set_constant(k, v)

        for model_name in uniquify(args.pmodel):
            # print header
            print('{:^80}'.format(' kerncraft '), file=output_file)
            print('{:<40}{:>40}'.format(args.code_file.name, '-m ' + args.machine.name),
                  file=output_file)
            print(' '.join(['-D {} {}'.format(k, v) for k, v in define]), file=output_file)
            print('{:-^80}'.format(' ' + model_name + ' '), file=output_file)

            if args.verbose > 1:
                if not args.kernel_description:
                    kernel.print_kernel_code(output_file=output_file)
                    print('', file=output_file)
                kernel.print_variables_info(output_file=output_file)
                kernel.print_kernel_info(output_file=output_file)
            if args.verbose > 0:
                kernel.print_constants_info(output_file=output_file)

            model = getattr(models, model_name)(kernel, machine, args, parser)

            model.analyze()
            model.report(output_file=output_file)

            # Add results to storage
            kernel_name = os.path.split(args.code_file.name)[1]
            if kernel_name not in result_storage:
                result_storage[kernel_name] = {}
            if tuple(kernel.constants.items()) not in result_storage[kernel_name]:
                result_storage[kernel_name][tuple(kernel.constants.items())] = {}
            result_storage[kernel_name][tuple(kernel.constants.items())][model_name] = \
                model.results

            print('', file=output_file)

        # Save storage to file (if requested)
        if args.store:
            temp_name = args.store.name + '.tmp'
            with open(temp_name, 'wb+') as f:
                pickle.dump(result_storage, f)
            shutil.move(temp_name, args.store.name)
def run(parser, args, output_file=sys.stdout):
    """Run command line interface."""
    # Try loading results file (if requested)
    result_storage = {}
    if args.store:
        args.store.seek(0)
        try:
            result_storage = pickle.load(args.store)
        except EOFError:
            pass
        args.store.close()

    # machine information
    # Read machine description
    machine = MachineModel(args.machine.name, args=args)

    # process kernel
    if not args.kernel_description:
        code = str(args.code_file.read())
        code = clean_code(code)
        kernel = KernelCode(code, filename=args.code_file.name, machine=machine,
                            keep_intermediates=not args.clean_intermediates)
    else:
        description = str(args.code_file.read())
        kernel = KernelDescription(yaml.load(description, Loader=yaml.Loader), machine=machine)
    # if no defines were given, guess suitable defines in-mem
    # TODO support in-cache
    # TODO broaden cases to n-dimensions
    # TODO make configurable (no hardcoded 512MB/1GB/min. 3 iteration ...)
    # works only for up to 3 dimensions
    required_consts = [v[1] for v in kernel.variables.values() if v[1] is not None]
    required_consts += [[l['start'], l['stop']] for l in kernel.get_loop_stack()]
    # split into individual consts
    required_consts = [i for l in required_consts for i in l]
    required_consts = set([i for l in required_consts for i in l.free_symbols])
    if len(required_consts) > 0:
        # build defines permutations
        define_dict = {}
        for name, values in args.define:
            if name not in define_dict:
                define_dict[name] = [[name, v] for v in values]
                continue
            for v in values:
                if v not in define_dict[name]:
                    define_dict[name].append([name, v])
        define_product = list(itertools.product(*list(define_dict.values())))

        # Check that all consts have been defined
        if set(required_consts).difference(set([symbol_pos_int(k) for k in define_dict.keys()])):
            raise ValueError("Not all constants have been defined. Required are: {}".format(
                required_consts))
    else:
        define_product = [{}]

    for define in define_product:
        # Reset state of kernel
        kernel.clear_state()

        # Add constants from define arguments
        for k, v in define:
            kernel.set_constant(k, v)

        for model_name in uniquify(args.pmodel):
            # print header
            print('{:^80}'.format(' kerncraft '), file=output_file)
            print('{:<40}{:>40}'.format(args.code_file.name, '-m ' + args.machine.name),
                  file=output_file)
            print(' '.join(['-D {} {}'.format(k, v) for k, v in define]), file=output_file)
            print('{:-^80}'.format(' ' + model_name + ' '), file=output_file)

            if args.verbose > 1:
                if not args.kernel_description:
                    kernel.print_kernel_code(output_file=output_file)
                    print('', file=output_file)
                kernel.print_variables_info(output_file=output_file)
                kernel.print_kernel_info(output_file=output_file)
            if args.verbose > 0:
                kernel.print_constants_info(output_file=output_file)

            model = getattr(models, model_name)(kernel, machine, args, parser)

            model.analyze()
            model.report(output_file=output_file)

            # Add results to storage
            kernel_name = os.path.split(args.code_file.name)[1]
            if kernel_name not in result_storage:
                result_storage[kernel_name] = {}
            if tuple(kernel.constants.items()) not in result_storage[kernel_name]:
                result_storage[kernel_name][tuple(kernel.constants.items())] = {}
            result_storage[kernel_name][tuple(kernel.constants.items())][model_name] = \
                model.results

            print('', file=output_file)

        # Save storage to file (if requested)
        if args.store:
            temp_name = args.store.name + '.tmp'
            with open(temp_name, 'wb+') as f:
                pickle.dump(result_storage, f)
            shutil.move(temp_name, args.store.name)
def run ( parser , args , output_file = sys . stdout ) : # Try loading results file (if requested) result_storage = { } if args . store : args . store . seek ( 0 ) try : result_storage = pickle . load ( args . store ) except EOFError : pass args . store . close ( ) # machine information # Read machine description machine = MachineModel ( args . machine . name , args = args ) # process kernel if not args . kernel_description : code = str ( args . code_file . read ( ) ) code = clean_code ( code ) kernel = KernelCode ( code , filename = args . code_file . name , machine = machine , keep_intermediates = not args . clean_intermediates ) else : description = str ( args . code_file . read ( ) ) kernel = KernelDescription ( yaml . load ( description , Loader = yaml . Loader ) , machine = machine ) # if no defines were given, guess suitable defines in-mem # TODO support in-cache # TODO broaden cases to n-dimensions # TODO make configurable (no hardcoded 512MB/1GB/min. 3 iteration ...) # works only for up to 3 dimensions required_consts = [ v [ 1 ] for v in kernel . variables . values ( ) if v [ 1 ] is not None ] required_consts += [ [ l [ 'start' ] , l [ 'stop' ] ] for l in kernel . get_loop_stack ( ) ] # split into individual consts required_consts = [ i for l in required_consts for i in l ] required_consts = set ( [ i for l in required_consts for i in l . free_symbols ] ) if len ( required_consts ) > 0 : # build defines permutations define_dict = { } for name , values in args . define : if name not in define_dict : define_dict [ name ] = [ [ name , v ] for v in values ] continue for v in values : if v not in define_dict [ name ] : define_dict [ name ] . append ( [ name , v ] ) define_product = list ( itertools . product ( * list ( define_dict . values ( ) ) ) ) # Check that all consts have been defined if set ( required_consts ) . difference ( set ( [ symbol_pos_int ( k ) for k in define_dict . keys ( ) ] ) ) : raise ValueError ( "Not all constants have been defined. Required are: {}" . format ( required_consts ) ) else : define_product = [ { } ] for define in define_product : # Reset state of kernel kernel . clear_state ( ) # Add constants from define arguments for k , v in define : kernel . set_constant ( k , v ) for model_name in uniquify ( args . pmodel ) : # print header print ( '{:^80}' . format ( ' kerncraft ' ) , file = output_file ) print ( '{:<40}{:>40}' . format ( args . code_file . name , '-m ' + args . machine . name ) , file = output_file ) print ( ' ' . join ( [ '-D {} {}' . format ( k , v ) for k , v in define ] ) , file = output_file ) print ( '{:-^80}' . format ( ' ' + model_name + ' ' ) , file = output_file ) if args . verbose > 1 : if not args . kernel_description : kernel . print_kernel_code ( output_file = output_file ) print ( '' , file = output_file ) kernel . print_variables_info ( output_file = output_file ) kernel . print_kernel_info ( output_file = output_file ) if args . verbose > 0 : kernel . print_constants_info ( output_file = output_file ) model = getattr ( models , model_name ) ( kernel , machine , args , parser ) model . analyze ( ) model . report ( output_file = output_file ) # Add results to storage kernel_name = os . path . split ( args . code_file . name ) [ 1 ] if kernel_name not in result_storage : result_storage [ kernel_name ] = { } if tuple ( kernel . constants . items ( ) ) not in result_storage [ kernel_name ] : result_storage [ kernel_name ] [ tuple ( kernel . constants . items ( ) ) ] = { } result_storage [ kernel_name ] [ tuple ( kernel . constants . items ( ) ) ] [ model_name ] = model . results print ( '' , file = output_file ) # Save storage to file (if requested) if args . store : temp_name = args . store . name + '.tmp' with open ( temp_name , 'wb+' ) as f : pickle . dump ( result_storage , f ) shutil . move ( temp_name , args . store . name )
Run command line interface.
Run command line interface .