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

5414                                                      软件学报  2025  年第  36  卷第  12  期



                                                      Julia hybrid code              SWPyTorch
                      MPE code          @saca            CPE code                    Python API
                                                                                 Torch distributed library
                                                                                      Process
                                     MPE compiler        SACA.jl             c10d    GroupMPI   libmpi
                       Parser
                                                       CPE compiler
                                                                                  Torch tensor library
                                    High-level         SACA wrapper   ①
                       Julia IR                  Reused                       ATen      TH      THNN
                                    optimizations       SIMD exts
                                                                                  Torch runtime library
                      Lowering                         Runtime APIs
                                                                             Tensor    OP
                                                                             impl    dispatch   Mem alloc
                                     Low-level
                      LLVM IR
                                    optimizations        LLVM.jl                        ①
                                                 Support  LLVM wrapper  ②         Accelerate libraries
                     OrcJIT engine
                                                      LLVM ToolChains
                                                                             CoupleStates    swBLAS
                      Executable        Runtime         CPE DyLink             swMath         swDNN
                        stream           libs            objects      ③
                                                SW26010Pro executable image   swTENSOR         …
                                       Julia packages
                     NLopt.jl  KrylovKit.jl  TensorOperation.jl  LinearAlgebra.jl    File system
                     MPI.jl     PyCall.jl   Distributed.jl  …                   roFS         Lustre

                                图 12 基于   Julia 的可扩展量子化学模拟器       NNQS-Transformer 组成结构

                    其次, Julia 通过其基础库中的      ccall 方法, 能够实现对   C/C++动态库中众核函数的直接调用, 诸如             swBLAS、
                 swMath  等. 此方法不仅充分利用了       C  语言众核加速库的丰富资源和卓越性能, 同时保留了                Julia 编程的便捷性与
                 灵活性. 这一调用路径在图        12  中以②号箭头标明.
                    最后, 对于其他支持众核优化的关键函数, 我们借助                SACA.jl 提供的@saca 宏, 在  Julia 中直接进行  SACA  众
                 核编程. 这种方式可以灵活控制多核组计算资源和内存空间, 从而满足                     NNQS-Transformer 对片内大共享空间、多
                 级细粒度并行等高级功能的需求. 相应的调用路径在图                 12  中以③号箭头清晰指示.
                  3.2   完备的第三方库适配
                    结合  NNQS-Transformer 的实际需求, 我们在新一代神威超级计算机上成功移植了多个                   Julia 第三方库, 功能
                 涵盖数值计算、分布式通信及外部函数调用等多个领域. 同时, 我们对相关的底层支撑环境进行了专门的适配和
                 优化. 相关第三方库及其底层支撑环境如表              4  所示.


                                   表 4 NNQS-Transformer 依赖的第三方    Julia 库及其底层支撑环境

                           类别                        Julia库                       底层支撑环境
                                                     NLopt.jl                       libnlopt.so
                                                    KrylovKit.jl                      -
                          数值计算
                                                 TensorOperations.jl                  -
                                                  LinearAlgebra.jl            libswblas.so, libswlapack.so
                                                   Distributed.jl                     -
                         分布式通信
                                                     MPI.jl                         libmpi.so
                          外部调用                       PyCall.jl                    swPython解释器

                    在数值计算方面, 我们引入了          NLopt.jl [30] , 其底层基于  libnlopt.so  实现, 能够应对从简单的数值最小化到复杂
                 的优化约束问题. 此外, KrylovKit.jl  [31] , 一个纯  Julia 语言实现的开源项目, 也被纳入我们的库体系中. 它提供了多
   28   29   30   31   32   33   34   35   36   37   38