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) 引擎, 其支持自动内
存管理、注册调试器和分析器等事件监听器, 以及并发编译等诸多新特性, 具有较高的模块化程度和可扩展性. 值

