Page 24 - 《软件学报》2025年第12期
P. 24

沈莉 等: swJulia: 面向新一代神威超级计算机的         Julia 语言编译系统                               5405



                                                         MC
                                                              CPE
                                      CG3        CG4     MPE  array  CPE
                                                            CG5


                             NI              Network on chip



                                      CG0        CG1        CG2
                                                                              8×8 CPE array
                                           图 1 SW26010Pro  异构众核处理器基本结构

                    MPE  为  64  位  RISC  结构通用处理单元, 具有   32 KB L1  指令缓存、32 KB L1  数据缓存和     512 KB L2  缓存.
                 CPE  为  64  位  RISC  结构精简处理单元, 支持  512  位  SIMD  向量扩展, 支持双精度、单精度、半精度浮点运算和整
                 数运算. 每个   CPE  都拥有独立的指令缓存和由用户控制的片上局部数据存储器                    (local data memory, LDM). CPE  可
                 以通过访存指令或直接内存访问           (direct memory access, DMA) 方式实现  LDM  与主存之间的数据传输.
                    在上一代申威异构众核处理器的实现中, CPE              使用了两种程序计数器        (program counter, PC) 值, 一种为软件可
                 见的全局   PC (global PC, GPC), 指示主存用户区程序段的     PC  值, 另一种为流水线使用的短        PC (short PC, SPC), 需
                 要软件保证    CPE  代码段长度不超出      SPC  指示的范围, 否则将产生异常. 虽然        SPC  降低了硬件设计的复杂度, 但是
                 导致硬件无法通过寄存器间接转移方式实现超出                 SPC  指示范围的    CPE  程序段跳转, 从而限制了动态运行模式的
                 使用. SW26010Pro  在硬件设计上进行了改进, 在        CPE  内部统一使用    GPC  方案, 使得复杂动态程序的加载和执行
                 成为可能. 系统软件亟需结合         SW26010Pro  处理器架构特点设计动态支撑方案, 以满足            Julia 等动态编程语言的编
                 译和运行需求.

                  2   swJulia  编译系统设计及实现

                    本文在新一代神威超级计算机上实现了               swJulia 动态语言编译系统, 其组成结构如后文图            2  所示, 主要包括
                 MPE  编译器、LLVM.jl 以及   SACA.jl 等主要模块.
                    下面, 我们分别对     swJulia 编译器各主要模块的工作原理及实现细节进行详细介绍.

                  2.1   MPE  编译器
                    MPE  编译器是   MPE  的  Julia 语言编译器, 其基于  LLVM  的  JIT  编译技术, 为  MPE  提供了对  Julia 语言语法及
                 功能特性的完备支持. MPE       编译器支持多个层次的中间表示            (intermediate representation, IR) 降级和优化, 能够将
                 Julia 高级语言代码编译为高效的        LLVM IR.
                    MPE  编译器继承了     Julia 编译器的完整功能, 能够将符合        Julia 语法标准的高级语言降级为面向         MPE  的  Julia
                 IR, 并对其执行类型推断、内联展开、循环融合等高级优化. 紧接着, MPE                    编译器将   Julia IR  降级为面向  MPE  的
                 LLVM IR, 并对该  IR  执行寄存器分配、指令调度、自动向量化等低级优化. 与传统的提前编译                         (ahead-of-time,
                 AOT) 方式不同, Julia 编译器并不生成存储在磁盘上的可执行文件, 而是将                 LLVM IR  通过  JIT  引擎编译并加载为
                 内存中的可执行指令序列. 传统的           AOT  编译方式存在静态编译的局限性, 无法准确预测代码在运行时的行为, 因
                 此不能获得极致的优化效果. 相比而言, JIT          编译方式结合了解释器和         AOT  方式的优点, 在运行时收集各种信息和
                 指标, 既可以快速启动, 又可以生成更加高效的优化代码, 所以能在总体上达到更佳的运行效果                            [21] .
                    为满足   swJulia 编译器对  JIT  编译的底层需求, 我们在为      SW26010Pro  配备的  swLLVM  编译器  [22] 中, 整合了
                 对  JIT  编译的支持. 我们选择了目前      LLVM  最新版本的    ORCJIT (on-request compilation JIT) 引擎, 其支持自动内
                 存管理、注册调试器和分析器等事件监听器, 以及并发编译等诸多新特性, 具有较高的模块化程度和可扩展性. 值
   19   20   21   22   23   24   25   26   27   28   29