예제 #1
0
파일: wrap_test.py 프로젝트: seyyah-dev/ELL
def wrap_model(model, target_dir, language):
    builder = wrap.ModuleBuilder()
    args = [
        model, "--outdir",
        os.path.join(target_dir, "model"), "--language", language, "--target",
        "host", "--module_name", "model"
    ]
    builder.parse_command_line(args)
    builder.run()
예제 #2
0
 def wrap_model(self, model, target_dir, module_name, language):
     if os.path.isdir(target_dir):
         rmtree(target_dir)
     builder = wrap.ModuleBuilder()
     args = [
         "--model_file", model, "--outdir",
         os.path.join(target_dir), "--language", language, "--target",
         "host", "--module_name", module_name
     ]
     builder.parse_command_line(args)
     builder.run()
예제 #3
0
    def run(self):
        model_id_string = "{} ({})".format(
            self.profiler_data.model_name,
            self.profiler_data.profile_options.to_long_string())

        global_logger = logger.setup(
            format="{} %(message)s".format(model_id_string))
        global_logger.info("Compiling model {} ...".format(model_id_string))
        profile_src_path = os.path.join(self.ell_build_root, "tools",
                                        "utilities", "profile")

        # Take all .cpp, .h, .cmd, .sh, and .cmake files from the build/tools/utilities/profile directory, and only hard-code the CMakeLists file to take
        all_profile_files = os.listdir(profile_src_path)
        profile_extensions_to_deploy = [".cpp", ".h", ".cmd", ".sh", ".cmake"]
        profile_src_files = [
            filename for filename in all_profile_files if True in
            [filename.endswith(ext) for ext in profile_extensions_to_deploy]
        ]

        cmakelists_file_to_deploy = "CMakeLists-device-parallel.txt.in"
        profile_src_files.append(cmakelists_file_to_deploy)
        profile_src_file_renames = {
            cmakelists_file_to_deploy: "CMakeLists.txt"
        }

        base_wrap_args = [
            "--model_file",
            self.profiler_data.model_path,
            "--module_name",
            "ELL",  # Profiler C++ code assumes the module name is ELL
            "--target",
            self.target,
            "--language",
            self.language,
            "--outdir",
            self.profiler_data.built_profilers_path,
        ]

        base_wrap_args.extend(
            self.profiler_data.profile_options.base_wrap_args())

        opt_wrap_args = ["--llvm_format", "ir"]
        no_opt_wrap_args = [
            "--no_opt_tool", "--no_llc_tool", "--llvm_format", "obj"
        ]

        profile_wrap_args = ["--profile"]

        profile_options_additional_compile_args = self.profiler_data.profile_options.additional_compile_args(
        )
        if profile_options_additional_compile_args:
            additional_compile_args = [
                "--"
            ] + profile_options_additional_compile_args
        else:
            additional_compile_args = []

        no_opt_noprofile_builder = wrap.ModuleBuilder()
        no_opt_noprofile_wrap_args = base_wrap_args + no_opt_wrap_args + additional_compile_args
        no_opt_noprofile_builder.parse_command_line(no_opt_noprofile_wrap_args)

        no_opt_profile_builder = wrap.ModuleBuilder()
        no_opt_profile_wrap_args = base_wrap_args + no_opt_wrap_args + profile_wrap_args + additional_compile_args
        no_opt_profile_builder.parse_command_line(no_opt_profile_wrap_args)

        opt_noprofile_builder = wrap.ModuleBuilder()
        opt_noprofile_wrap_args = base_wrap_args + opt_wrap_args + additional_compile_args
        opt_noprofile_builder.parse_command_line(opt_noprofile_wrap_args)

        opt_profile_builder = wrap.ModuleBuilder()
        opt_profile_wrap_args = base_wrap_args + opt_wrap_args + profile_wrap_args + additional_compile_args
        opt_profile_builder.parse_command_line(opt_profile_wrap_args)

        # Profiler and ExecuteModel binaries expect to find the following header and object files, built with different compile args:
        # compiled_model.o
        # compiled_model.h
        # compiled_model_opt.o
        # compiled_model_opt.h
        # compiled_model_noprofile.o
        # compiled_model_noprofile.h
        # compiled_model_noprofile_opt.o
        # compiled_model_noprofile_opt.h
        built_name_prefix = "compiled_model"
        noprofile_suffix = "_noprofile"
        opt_suffix = "_opt"
        obj_suffix = ".o"
        header_suffix = ".h"
        file_suffixes = [obj_suffix, header_suffix]
        base_model_filename = os.path.basename(self.profiler_data.model_path)
        base_model_name = os.path.splitext(base_model_filename)[0]

        no_opt_noprofile_renames = {
            (base_model_name + file_suffix):
            (built_name_prefix + noprofile_suffix + file_suffix)
            for file_suffix in file_suffixes
        }
        no_opt_profile_renames = {(base_model_name + file_suffix):
                                  (built_name_prefix + file_suffix)
                                  for file_suffix in file_suffixes}
        opt_noprofile_renames = {
            (base_model_name + file_suffix):
            (built_name_prefix + noprofile_suffix + opt_suffix + file_suffix)
            for file_suffix in file_suffixes
        }
        opt_profile_renames = {(base_model_name + file_suffix):
                               (built_name_prefix + opt_suffix + file_suffix)
                               for file_suffix in file_suffixes}

        builders_and_rename_maps = [(no_opt_profile_builder,
                                     no_opt_profile_renames),
                                    (opt_profile_builder, opt_profile_renames)]
        if self.include_exercise_models:
            builders_and_rename_maps.extend([
                (no_opt_noprofile_builder, no_opt_noprofile_renames),
                (opt_noprofile_builder, opt_noprofile_renames)
            ])

        target_files = []
        for builder_and_rename_map in builders_and_rename_maps:
            target_files.extend([
                builder_and_rename_map[1][filename]
                for filename in builder_and_rename_map[1]
            ])

        existing_files = os.listdir(self.profiler_data.built_profilers_path)
        need_to_build = False in [
            filename in existing_files for filename in target_files
        ]

        if need_to_build:
            try:
                for builder_and_rename_map in builders_and_rename_maps:
                    builder = builder_and_rename_map[0]
                    rename_map = builder_and_rename_map[1]
                    builder.run()
                    for filename in rename_map:
                        src_path = os.path.join(
                            self.profiler_data.built_profilers_path, filename)
                        dst_path = os.path.join(
                            self.profiler_data.built_profilers_path,
                            rename_map[filename])
                        shutil.copy(src_path, dst_path)
            except:
                errorType, value, traceback = sys.exc_info()
                msg = "### WrapException: %s: %s" % (str(errorType),
                                                     str(value))
                global_logger.error(msg)
                sys.exit(1)
        else:
            global_logger.info(
                "Target files already exist in path {}, skipping build".format(
                    self.profiler_data.built_profilers_path))

        keep_files = target_files

        # Copy profile source code into place
        for filename in profile_src_files:
            src_path = os.path.join(profile_src_path, filename)
            dst_name = profile_src_file_renames[
                filename] if filename in profile_src_file_renames else filename
            dst_path = os.path.join(self.profiler_data.built_profilers_path,
                                    dst_name)
            keep_files.append(dst_name)
            shutil.copy(src_path, dst_path)

        all_built_files = os.listdir(self.profiler_data.built_profilers_path)
        delete_files = [
            filename for filename in all_built_files
            if filename not in keep_files
        ]
        for filename in delete_files:
            full_path = os.path.join(self.profiler_data.built_profilers_path,
                                     filename)
            if os.path.isfile(full_path):
                global_logger.info(
                    "Cleaning temporary build file {}".format(full_path))
                os.remove(full_path)

        global_logger.info("Done compiling model {}.".format(model_id_string))