Engee 文档

构建系统映像

构建Julia系统映像

Julia包含一个预先分析的系统映像,其中包含名为"sys"的"Base"模块的内容。纪'。 此文件也预编译到sys共享库中。{so,dll,dylib}'为尽可能多的平台,以显着提高推出时间。 在未附带预编译系统映像文件的系统上,可以从位于"DATAROOTDIR/julia/base"Julia文件夹中的源代码文件生成此文件。

默认情况下,Julia将使用一半的可用系统流生成系统映像。 这个时刻可以使用环境变量来控制。 'JULIA_IMAGE_THREADS'

由于几个原因,此操作非常有用。 用户可以执行以下任务。

  • 在不以这种方式发布的平台上构建共享库系统的预编译映像,从而缩短启动时间。

  • 修改’Base’模块,重新组装系统映像,并在下次启动Julia时使用新的`Base`模块。

  • 包括’userimg’文件。包含软件包的jl`进入系统映像,从而创建一个系统映像,其中软件包嵌入到启动环境中。

包’PackageCompiler。jl'包含用于自动化此过程的方便包装函数。

针对多个微体系结构优化的系统图像

可以在同一指令集体系结构(ISA)中为多个CPU微架构同时编译系统映像。 您可以创建同一函数的多个版本,并将最小调度点插入到常用函数中,以利用各种ISA扩展或其他微体系结构功能。 提供最佳性能的版本将在运行时根据可用的CPU特性自动选择。

指定多个系统映像目标

具有多个微体系结构的系统映像可以通过在系统映像的编译期间转移多个目标来包括。 这可以通过使用create参数来完成。 'JULIA_CPU_TARGET`,或者在手动执行编译命令时使用'-C’命令行选项。 多个目标在参数字符串中用`;`符号分隔。 每个目标对象的语法是CPU名称后跟几个用字符`,'分隔的函数。 LLVM支持的所有功能都支持。 可以使用前缀'-'禁用该功能。 (前缀`+'也被允许并被忽略,以符合LLVM语法。)此外,还支持几个特殊函数来控制函数的克隆行为。

建议为每个目标平台指定`clone_all`或`base(<n>)`,而不仅仅是第一个。 这允许您明确地告诉哪些目标平台将克隆所有功能以及哪些目标平台基于其他目标平台。 如果不这样做,默认情况下不会克隆所有函数,如果未克隆该函数,则第一个目标平台的函数定义将用作备份选项。

  1. `clone_all'

    默认情况下,只有那些由于微体系结构的能力而最有可能提高效率的函数才会被克隆。 但是,如果为目标对象指定了’clone_all’函数,则将为目标对象克隆*all*系统映像函数。 `-Clone_all`函数的否定形式可用于禁止内置启发式方法克隆所有函数。

  2. '基地(<n>)`

    <n>'是非负数的占位符(例如,`base(0),base(1))。 默认情况下,如果未克隆函数,部分克隆(即没有`clone_all`)目标将使用默认目标(指定的第一个目标)中的函数。 可以通过使用`base(<n>)`参数指定不同的base来更改此行为。 第’n’个目标(基于0)将用作基础目标而不是标准(`0’th)。 基本目标必须是`0`或另一个`clone_all’目标。 将"clone_all"以外的目标指定为基对象将导致错误。

  3. `opt_size'

    因此,目标对象的函数将在大小上得到优化,这不会显着影响运行时性能。 这对应于GCC和Clang的'-Os’参数。

  4. `min_size'

    因此,目标对象的函数将在大小上得到优化,这会对运行时性能产生重大影响。 这对应于`-Oz’Clang参数。

例如,在编写本文档时,在创建从网站下载的官方Julia`x86_64`二进制文件时julialang.org ,使用以下行。

generic;sandybridge,-xsaveopt,clone_all;haswell,-rdrnd,base(1)

这将创建一个具有三个独立目标的系统映像:一个用于通用处理器’x86_64`,一个带有`sandybridge`ISA(明确排除`xsaveopt`),它明确克隆了所有功能,另一个是为`haswell`ISA设计的,基于`sandybridge`的sysimg版本,也排除了’rdrnd'。 当Julia实现加载生成的sysimg时,它会检查主处理器是否有适当的CPU能力标志,以使用最高的ISA级别。 请注意,基本级别("通用")需要指令"cx16",该指令在某些虚拟化程序中被禁用,并且必须启用才能加载"通用"目标。 或者,您可以生成具有"通用,-cx16"目标对象的sysimg,以获得更大的兼容性。 但是,应该注意的是,这可能会导致某些代码中的性能和稳定性问题。

实施概述

这是实施过程中涉及的各个部分的简要概述。 实现细节在每个组件的代码的注释中提供。

  1. 系统映像编译

    分析和克隆在’src/processor*'中执行。 目前,基于循环,simd指令或其他数学运算(例如,fastmath,fma,muladd)的存在,支持函数克隆。 这些信息被传输到一个文件`src/llvm-多版本控制。cpp`,其执行实际克隆。 除了克隆和插入调度槽(有关如何执行此操作,请参阅`MultiVersioning::runOnModule`中的注释)之外,传输还生成元数据,以便运行时环境可以正确加载和初始化系统映像。 元数据的详细描述可在文件’src/processor中找到。h'。

  2. 加载系统映像

    通过分析系统映像生成期间保存的元数据,系统映像在"src/processor*"中加载和初始化。 主要函数在`src/processor_*中定义和选择。cpp’文件,取决于ISA。 在选择目标对象时,建议坚持CPU的确切名称,以及选择较大的矢量寄存器大小和较大数量的函数。 这个过程的概述在文件`src/processor中提供。cpp'。