没有合适的资源?快使用搜索试试~ 我知道了~
92→探讨WebAssembly在HPCMohak Chadha,Nils Krueger,JophinJohn,Anshul Jindal,Michael Gerndt德国慕尼黑工业大学计算机体系结构和并行系统教授摘要基于Linux内核提供的命名空间的容器化方法在HPC社区中越来越受欢迎然而,它们在HPC系统中的采用和使用面临着一些挑战。其中包括直接在HPC资源上无特权运行和构建科学应用程序容器映像的困难,HPC架构的异构性增加,以及访问仅在HPC系统上可用的专用网络库。基于容器的HPC应用程序开发面临的这些挑战与一种名为We-bAssembly(Wasm)的新通用中间二进制格式所提供的几个优势密切相关这些包括轻量级的用户空间隔离机制和跨操作系统和处理器架构的可移植性。在本文中,我们探讨了Wasm作为基于MPI的HPC应用程序的分发格式的使用。为此,我们提出了MPIWasm,一种新的Wasm嵌入基于MPI的HPC应用程序,使高性能执行的Wasm代码,具有低开销的MPI调用,并支持高性能的网络工作的HPC系统上的互连我们使用标准化HPC基准测试评估了MPIWasm我们的实验结果表明,MPIWasm提供了竞争力的本地应用程序的性能在所有的情况下。此外,我们观察到Wasm二进制是139。对于不同的标准化基准,与静态链接的二进制文件CCS概念:软件及其工程过程管理。关键词:WebAssembly,Wasmer,Wasm,MPI,HPC允许免费制作本作品的全部或部分的数字或硬拷贝,以供个人或课堂使用,前提是制作或分发副本的目的不是为了盈利或商业利益,并且副本的第一页上有本声明和完整的引用本作品的版权归ACM以外的其他人所有,必须予以尊重。允许使用学分进行摘要以其他方式复制、重新发布、在服务器上发布或重新分发到列表中,需要事先获得特定许可和/或付费。从permissions@acm.org请求权限。PPoPP© 2023计算机协会。ACM ISBN 979-8-4007-0015-6/23/02。. . 15美元https://doi.org/10.1145/3572848.3577436沙朱林·本尼迪克特计算机科学与工程系,印度信息技术学院Kottayam,KeralaACM参考格式:Mohak Chadha,Nils Krueger,Jophin John,Anshul Jindal,Michael Gerndt and Shajulin Benedict.2023.探索We- bAssembly在HPC中的使用。 第28届ACM SIGPLAN并行编程原理与实践年度研讨会(PPoPP '23),2023年2月25日至3月1日,加拿大蒙 特 利 尔 。 ACM , 纽 约 州 纽 约 市 , 美 国 , 15 页 。https://doi.org/10.1145/3572848.35774361引言Linux容器由于其可移植性和高可用性,已成为开发,测试和部署从企业到云环境中的Web服务的各种应用程序的事实标准。这是因为容器使用户能够将其应用程序及其自定义软件依赖项作为单个单元打包到易于部署的映像中。受其在云中的流行程度的推动,容器在HPC社区中也引起了越来越大的兴趣[30,74,90]。对于HPC系统,容器为用户提供了灵活性,并允许他们定义自定义软件堆栈,即,用户自定义软件栈(UDSS),用于大规模的科学应用。此外,它们使未来可以复制的简单,为此,引入了几种以HPC为中心的集装箱化解决方案 , 如 Charliecloud [72] , Shifter [49] , Singular- ity[58],Podman [48]和Sarus [33与以前的方法相比,本文研究了使用一种名为WebAssembly(Wasm)[52]的新技术来打包和分发HPC应用程序,该技术被称为Linux容器的替代方案[81]尽管它们越来越受欢迎,但HPC系统中容器的采用和使用仍然受到很大限制[36]。这可以归因于用户在HPC系统上为其应用程序运行和构建容器映像时通常面临的几个挑战。对于执行容器,大多数容器化解决方案需要root权限,由于HPC中的共享文件系统及其UNIX权限,普通HPC用户不可能拥有root权限。虽然以HPC为中心的容器化解决方案(如Signularity [58]和Podman[48])通过fakeroot[61]支持无根容器,但它们当前的实现不支持分布式文件系统,如 HPC系统上常见的GPFS[70,80]。此外,如[71]所述,由非特权(普通)用户在HPC资源上构建符合开放容器倡议(OCI)[69]的这是因为大多数容器构建解决方案,PPoPPMohak Chadha等人93因为Docker [43]也需要root权限。因此,大多数用户使用他们自己的本地系统来构建/开发他们的应用容器映像,然后将构建的映像传输然而,这种情况导致了基于容器的HPC应用程序开发中的几个问题首先,HPC节点变得越来越异构[12],具有不同的处理器架构(如x86_64 或 aarch64 ) , 并 具 有 特 殊 的 加 速 器 ( 如GPU)。由于应用程序性能在HPC中至关重要,因此使用特定处理器的特定微体系结构功能编译应用程序非常重要。虽然通过交叉编译HPC应用程序或使用QEMU进行仿真可以使用build-x[44]等插件为多个平台构建容器映像,但HPC应用程序构建过程并不广泛支持它,并且需要特定的Linux内核功能(binfmt_misc[62])。此外,测试和开发HPC应用程序只能提供对目标系统的深入了解此外,大多数容器映像的范围可以从几个MiB到几个GiB。因此,从本地到HPC系统的频繁网络传输可能会带来一些麻烦。其次,构建HPC应用程序需要访问专用的网络库和本地用户系统上不可用最后,虽然不同的容器化解决方案对容器化应用程序的性能几乎没有影响[72,75,84],但构建高性能HPC应用程序容器映像并不简单,涉及陡峭的学习曲线,并且需要有关特定MPI库版本的知识(例如,Open-MPI [10] 4.0)和高性能网络互连硬件(例如,Intel OmniPath [4])和库(例如,Intel Performance Scaled Messaging [5])。基于容器的HPC应用程序开发的这些挑战与Wasm [52]旨在解决的几个优势和核心问题密切相关。Wasm是一种低级的、静态类型的通用二进制指令格式,用于在虚拟机中进行内存安全的沙盒执行。它提供了跨现代处理器架构和操作系统的可移植性、快速执行和低级内存模型[52]。虽然最初是为了在Web浏览器中执行,但由于其简单性和通用性,Wasm在非Web领域中得到了广泛的采用和使用,例如无服务器计算[78],边缘计算[47,53]和物联网[51]。它不需要垃圾收集,并且被设计成一个通用编译目标,成熟地支持带有LLVM [59]前端的编程语言,如C,C++,C#和Rust[32,35,40,45,77]。图1演示了在HPC中使用Wasm的一般工作流开发人员可以在本地系统上将HPC应用程序提前编译为Wasm(AoT),并将其分发到多个平台,而无需分发源代码或构建应用程序容器。通常,Wasm二进制文件的大小比本机文件小WebAssembly嵌入器编译x86_64处理器HPC应用WebAssemblyaarch64图1. HPC应用程序可以编译为WebAssem- bly并分发到多个平台,在这些平台上,支持WebAssembly嵌入器可以有效地执行HPC应用程序。x86_64二进制文件[52,56,91]。在此之后,可以使用独立的Wasm嵌入器在任何平台上执行生成的二进制文件[52]。Wasm嵌入器有两个主要用途。首先,它为在平台上运行Wasm二进制文件提供了一个隔离的与利用不同Linux命名空间 [71]进行隔离和安全性的基于容器的方法相比,Wasm基于软件故障隔离(SFI)[85]和控制流完整性(§2.2)在应用程序级别提供轻量级隔离。其次,它负责将Wasm二进制文件编译为本地机器码,要么在执行时使用即时(JIT)引擎,要么使用相同的JIT引擎或AoT编译器进行AoT。请注意,Wasm二进制文件可以由普通用户执行,并且是完全非特权的。目前有几个开源的独立嵌入器,如Wasmer[87],Wasmtime[37]和Wasm3[79]。但是,它们都不支持HPC应用程序的执行。作为将Wasm引入HPC生态系统的第一步,我们在本文中只关注基于MPI的HPC应用。我们选择MPI是因为它在HPC社区中的理解和影响力[34]。为此,我们的主要贡献是:我 们 实 现 并 展 示 了 MPIWasm , 这 是 一 种 基 于Wasmer[87] 的 基 于 MPI 的 HPC 应 用 程 序 的 新 型Wasm嵌入器。MPIWasm支持Wasm代码的高性能执行,通过零拷贝内存操作降低MPI调用的开销 , 并 支 持 高 性 能 网 络 互 连 , 如 IntelOmniPath[4]。我们通过广泛的实验证明了MPIWasm的低开销和性能,这些实验分别使用基于x86_64和aarch64架构的生产HPC系统和AWS Graviton2 [1]节点上的标准化HPC基准测试我们详细阐述了在HPC生态系统中使用Wasm的不同可能的未来本文其余部分的结构如下。§2提供了Wasm的详细概述在§3中,我们详细描述了我们的嵌入器MPIWasm我们的实验结果在§4中给出。在第5节中,我们描述了在HPC生态系统中使用Wasm6描述了一些···探讨WebAssembly在HPC中的应用PPoPP94清 单 1. 使 用 WASI-SDK 以 WebAssembly 文 本 格 式(WAT)[ 68 ]表示已编译的C++应用程序的Wasm模块的示例省略号表示为了简洁而省略的部分与我们的工作有关的以前的方法在第7节中,我们总结了本文并提出了展望。2WebAssembly入门2.1WebAssembly概述WebAssembly(Wasm)于2015年引入,作为基于Web浏览器的应用程序的JavaScript的替代原生。它取代了asm.js[67],这是Mozilla之前的尝试,专注于可以优化AoT的JavaScript代码子集。当应用程序被编译成Wasm时,生成的二进制文件被称为模块。Wasm模块包含函数定义、全局变量声明、表和线性内存地址空间.Wasm中的所有应用程序代码都是以函数的形式组织的。Wasm中的概念机器是基于堆栈的,不包含寄存器,因此所有指令都从机器的堆栈中弹出其操作数。然而,由于应用程序控制流是模块的显式部分,并且Wasm操作是类型化的,因此可以在程序中的任何点静态预测堆栈的布局,这允许编译器将堆栈语义转换为基于寄存器的指令集。与其他高级编程语言类似,Wasm允许定义不限于特定函数或块的全局变量。Wasm模块中的表用于存储对函数的引用[52]。Wasm ISA目前仅支持四种变量数据类型:(i)i32,32位整数,(ii)i64,64位整数,(iii)f32,32位IEEE754浮点数,以及(iv)f6464位IEEE 754浮点数。为了构造复杂类型,通常使用这些基本类型的组合。Wasm提供了使用导入/导出系统在模块及其嵌入器之间共享数据和代码的能力Wasm模块中出现的所有函数定义都可以从嵌入器中导入,而不是在嵌入器中定义类似地,模块中存在的数据可以导出,以便嵌入器可以使用它们(§2.3)。2.2WebAssembly安全和沙箱模型Wasm利用软件故障隔离技术(software fault isolationtechniques,SFI)[85]来沙箱化正在执行的Wasm模块。默认情况下,Wasm模块不能与主机系统交互或执行任何类型的I/O操作。任何由Wasm模块的代码启动的系统交互都因此,嵌入器既可以充当转换层,也可以充当仲裁器,以强制执行隔离要求。作为翻译器,嵌入器可以向Wasm模块提供公共接口,即使底层系统可能具有不同的本地接口,而作为仲裁器,嵌入器可以基于应用级安全策略来限制Wasm模块对系统资源的访问。例如,嵌入器可以只允许文件I/O到位于特定目录中的文件,以将Wasm模块与文件系统的其余部分虽然原则上类似于内核级系统调用过滤技术,如Linux上的Seccomp-BPF[83],但在应用程序级执行此类过滤允许定义语义上更有意义的策略。在Wasm中,所有的内存访问都被限制在一个模块目前,Wasm规范[52]支持32位地址来索引模块可以访问的内存虽然这将单个模块的内存限制如果嵌入器是一个具有64位内存地址空间的进程,则它可以在其内存空间中安全地执行不可信的Wasm模块,而无需通过为模块保留连续范围的虚拟内存来进行额外的隔离。并非该范围内的所有页面都需要映射到物理内存,仅映射所需数量的页面以适应模块在给定时间点使用的内存量就足够了这确保了Wasm模块只能在自己的执行环境中运行,而不能破坏嵌入器的内存,因为任何越界的内存访问都会导致页面错误,然后可以由它来处理。此外,由于Wasm规范中的内存指令[ 52 ]使用偏移量,因此不可能读取和写入Wasm中的在由C程序生成的程序集中,函数调用被表示为跳转到函数的第一条指令的地址的跳转指令,一个典型的漏洞是更改此地址以控制程序的控制流。然而,这样的漏洞是不可能与Wasm,因为它的特点是控制流的完整性,通过实施结构化的程序控制流。这是因为两个原因。首先,在Wasm中,函数被表示为表中的索引(第2.1节),它添加了一个额外的间接层来表示函数地址。其次,Wasm规范防止了1(type(;1;)(func(parami32)(resulti32)二......3(type(;5;)(func(parami32 i32)(resulti32)四......5(type(; 14;)(func(parami32 i32 i32 i32 i32 i32)6(结果i32)7(type(; 15;)(func(parami32 i32 i32 i32)(resulti32)八......9(进口“wasi_snapshot_preview 1““path_open“10(func$__wasi_path_open(第22类))11(import“wasi_snapshot_preview 1““fd_close“12(func$__wasi_fd_close(类型1)13(导入“wasi_snapshot_preview 1““fd_seek”)14(func$__wasi_fd_seek(第23类)15(导入“wasi_snapshot_preview 1““fd_read“)16(func$__wasi_fd_read(第15类))17(进口“wasi_snapshot_preview 1““proc_exit“18(func$__wasi_proc_exit(类型0)十九 岁20(export“_start“(func$_start))21(导出“内存“(内存0))PPoPPMohak Chadha等人95清单2. 自定义MPIWasmmpi.h头文件的摘录。清单3.对应于清单2中所示函数的模块导入的WAT表示。构造任意的存储器地址[42],并且嵌入器和模块存储器的分离2.3WebAssembly系统接口由 于 Wasm 最 初 是 为 Web 浏 览 器 设 计 的 , 因 此 针 对POSIX环境并允许在其上执行Wasm模块的系统接口并不是原始规范的一部分[52]。为了克服这个问题,WebAssembly系统接口(WASI)规范[89]被设计出来。WASI指定了嵌入器执行大多数POSIX应用程序所需实现的接口实现WASI规范的嵌入式将能够运行任何使用WASI-SDK编译的通用应用程序[28]。WASI-SDK包括clang编译器和它自己的基于musl libc的C库,这些库调用从嵌入式系统导入的WASI系统调用,而不是依赖于Linux系统调用[22]。注意,由于glibc在Linux系统上的普遍存在,一些应用程序已经依赖于glibc特定的函数或行为。这些应用程序在被编译成符合WASI的Wasm模块之前需要修改清单1显示了一个C++ appli的已编译Wasm模块使用WASI-SDK以WebAssembly文本格式(WAT)进行阳离子化。WAT是一种人类可读的格式,使开发人员能够检查Wasm模块的源代码。可以观察到,该模块包含几个以整数作为参数和返回类型的函数(第1-7行)(第2.1节),导入WASI函数(第9-18行),并导出其_start(主函数)和内存(第20-21行)。导出这两个定义允许执行此模块的嵌入器调用其入口点函数,并从模块第9-16行的import语句使Wasm模块能够打开并读取文件中,函数proc_exit被嵌入器用来处理应用程序的终止,例如,通过释放为模块保留的存储器。对于要执行的模块,导入的函数需要由嵌入器实现。3MPIWasm在本节中,我们将详细描述MPIWasm,它是我们用于执行Wasm模块的嵌入器,这些模块利用了MPI标准中的函数。3.1概述MPIWasm的目的是支持在HPC系统上执行编译为Wasm的为了促进其在HPC环境中的采用和适用性,它(i)支持编译为Wasm的基于MPI的HPC应用程序的高性能执行(§3.3),(ii)通过零拷贝内存操作(§3.6)具有MPI调用的低开销,以及(iii)支持高性能互连,如Infiniband [64]和Intel OmniPath [4]。这些网络互连由HPC系统上的MPI库用于高性能列间通信。为了实现对现代HPC系统上存在的网络互连的即时支持,MPIWasm在运行时针对目标HPC系统上的MPI库进行链接,并且在Wasm模块和主机1MPI库之间提供转换层。因此,开发人员不需要了解目标HPC系统上存在的特定网络库或网络互连。根据特定的主机MPI库,如OpenMPI [10]或MPICH [8],MPIWasm需要单独构建这两个库目前都由MPIWasm支持。我们的嵌入器目前支持执行用C/C++编写的MPI应用程序,并符合MPI-2.2标准[65]。集成对MPI-3.1 [66]的支持是我们未来的兴趣所在,但超出了这项工作的范围 。 我 们 选 择 专 注 于 C/C++ 应 用 程 序 , 是 因 为LLVM/Clang项目中Wasm后端自llvm-8以来的稳定性和成熟性。作为MPIWasm的基础,我们使用名为Wasmer的开源Wasm嵌入器[87]。Wasmer支持在三个主要平台上执行Wasm模块Linux、Windows和macOS,同时支持x86_64和aarch64指令集架构。此外,它实现了WASI规范(§2.3),并提供了人体工程学机制来定义提供给模块的附加功能。嵌入器功能的这种动态扩展为了实现MPIWasm,我们使用Rust编程语言。这是因为两个原因。首先,它提供了与具有内存安全性的C/C++相当的高性能[82]。1对于执行Wasm模块1(import“env““MPI_Init““(2func$MPI_Init(parami32 i32)(resulti32)(3))4(import“env““MPI_Finalize“(func$MPI_Finalize(resulti32)5(import“env““MPI_Send““(6func$MPI_Send(parami32 i32 i32 i32 i32 i32)(resulti32)7))8(import“env““MPI_Recv““(9func$MPI_Recv(parami32 i32 i32 i32 i32 i32 i32)10(结果i32)11))1typedefintMPI_Comm ;2typedefintMPI_Datatype;三......4intMPI_Init(int* argc,char* argv);5intnums(nums);6intMPI_Send(7const void* buf,intcount,MPI_Datatype数据类型,8intdest,inttag,MPI_Comm9);10intMPI_Recv(11void* buf,intcount,MPI_Datatype数据类型,12intsource,inttag,MPI_Comm_Status * status13);探讨WebAssembly在HPC中的应用PPoPP96表1. 比较Wasmer[87]为HPCG [73] Wasm模块支持的不同编译器后端的编译持续时间和性能。Wasm模块是使用我们的WASI-SDK生成的(第3.3节)。Wasm模块使用MPIWasm在x86_64系统上执行。编译器编译持续时间(ms)单核性能(GFLOP/s)单通[86]520.3769汽车旅馆[3]1501.3240LLVM [59]28111.5426其次,它有广泛的支持和文档,可以嵌入Wasmer并将其用作库。3.2将C/C++ MPI应用程序编译为Wasm大多数MPI应用程序都希望POSIX功能在其执行环境中可用,例如,读取和写入文件描述符的能力。WASI(§2.3)定义了WebAssembly导出,使Wasm模块能够调用POSIX系统上附带的C标准库中定义的大多数函数。为此,WASI-SDK[28]结合了clang编译器和wasi-libcC库,使C/C++应用程序的编译只使用POSIX函数,而不使用Wasm的额外库普通WASI-SDK不支持C/C++MPI应用程序的编译。为此,我们实现了一个自定义的mpi.hMPI头文件,并将其添加到WASI-SDK中。头文件包括不同MPI类型(如MPI_Op、MPI_Comm和MPI_Datatype)的定义以及MPI_Status结构的定义。此外,它根据MPI-2.2标准定义了MPI函数的签名清单2显示了头文件的摘录。它是MPI库中的传统头文件的简化版本,大多数类型定义为整数(§3.6)。通过将我们的头文件与WASI-SDK相结合,可以将符合MPI-2.2标准的C/C++ MPI应用程序编译为Wasm。此外,为了便于使用和采用,我们实现了一个自定义的基于Python的工具,简化了MPI应用程序的整个编译过程。清单3显示了Wasm模块中与清单2中所示函数对应的不同MPI特定导入。MPIWasm为这些导入提供定义,以支持基于MPI的HPC应用程序的执行。此外,它支持WASI规范,该规范为MPI应用程序启用POSIX功能。3.3高性能执行Wasm代码有几种执行Wasm模块的策略。这些包括使用解释器[79],提前(AoT)编译[37]或即时(JIT)编译[37]。然而,对于HPC系统,最有用的方法是在执行应用程序之前将Wasm指令(Wasm ISA)转换为主机的本机指令集也就是说,AoT。为此,MPIwasm建立在Wasmer[87]提供的代码生成基础设施Wasmer目前支持三个编译器后端 , 即 , 单 通 道 [86] 、 Cranelift[3] 和 LLVM[59] 。SinglePass编译器被设计为在线性时间内发出机器代码,并且不执行许多代码优化。Cranelift编译器完全基于Rust,类似于LLVM。对于Cranelift,WASM指令首 先 被 转 换 为 Cranelift 的 中 间 表 示 ( IR ) , 即 ,(Cranelift-IR),然后通过考虑微体系结构特定的优化将其转换为主机的本机指令集另一方面,对于LLVM,Wasm ISA首先被转换为LLVM-IR,然后生成本机机器代码。Cranelift-IR类似于LLVM-IR,但抽象级别较低,这阻碍了中级代码优化。在编译过程结束时,所有三个编译器都会生成一个共享对象,可以使用libloading库[27]通过快速dlopen表1显示了Wasmer为HPCG基准测试支持的三种不同编译器的编译时和运行时性能的比较。虽然LLVM是编译Wasm模块最慢的,但它也为HPCG应用程序带来了最快的因此,我们选择LLVM作为MPIWasm中的编译器后端。为了抵消LLVM作为其他两个编译器的组件所需的较长编译 时 间 我 们 的 缓 存 机 制 建 立 在 Wasmer 提 供 的FileSystemCache[46]上。在我们的实现中,我们使用Blake-3散列函数为每个Wasm模块生成散列[2]。此外,我们将从LLVM生成的共享对象存储为本地文件系统中生成的哈希因此,对Wasm模块的任何更改都会导致生成新的哈希,从而触发模块的重新编译为此,在具有MPIWasm的系统上重复执行同一应用程序不会导致执行的重新编译开销。3.4使用MPIWasm进行由于在Wasm中,应用程序的所有系统交互都必须通过调用嵌入器实现的函数来执行(第2.2节,第2.3节),因此嵌入器可以对它们的使用进行额外的限制,并对提供给它们的参数进行检查。在Wasmer中,所有处理文件I/O的导出函数执行它们自己的权限处理,该权限处理与操作系统所使用的权限处理分开。这种文件系统访问的进程内间接性允许Wasmer向Wasm模块呈现虚拟目录树,该虚拟目录树仅包含允许模块访问的目录。此外,对单个目录的访问权限可以更多2Cranelift-IR和LLVM-IR之间更详细的讨论可以在这里找到[25]。PPoPPMohak Chadha等人97图2. 内存地址空间的MPIWasm与instan的,utiated Wasm模块。对Wasm模块比授予执行嵌入器的用户的权限更严格例如,用户可以对他们的主目录及其所有子目录具有读写访问权,但授予对嵌入器执行的Wasm模块MPIWasm使用-d标志来实现此隔离功能,该标志将对给定目录的读写访问权限授予Wasm模块。请注意,公开目录的完整绝对路径不会呈现给Wasm模块。在呈现给它的虚拟目录树中,它被给予访问权限的所有子目录都是根目录的直接子目录。这种映射目录路径的方法避免了将包含在完整路径中的信息暴露给目录,例如在主目录的情况下的用户名。3.5从Wasm转换为主机内存地址Wasm安全模型的一个主要部分是主机和模块的线性内存地址空间的分离由于维护能力限制是Wasm嵌入器的责任然而,这种分离对支持MPI应用程序提出了挑战,因为MPI API基于能够直接读取和写入应用程序内存正在执行的基于Wasm的MPI应用程序只能在其自己的线性内存地址空间中提供内存地址,而目标MPI库需要主机内存地址空间中的地址。为了执行Wasm模块,MPIWasm保留了自己的一部分地址空间供Wasm模块使用。因此,包含在该范围内的每个字节可以用模块的存储器空间中的存储器地址或嵌入器(主机)的此外,在实例化模块的线性存储器在此之后,通过将线性地址空间中的地址视为相对于模块的基地址的偏移,可以将地址从Wasm模块的线性地址空间转换到嵌入器如图2所示。特别是,MPIWasm直接将引 用 模 块 线 性 地 址 空 间 的 32 位 Wasm 指 针 为 此 ,MPIWasm直接利用主机系统上存在的MPI库,而不复制任何将数据从模块它支持零拷贝存储器操作。3.6转换MPI数据库MPI作 为一 个 库 实现 , 最常 见 的是 OpenMPI [10],MPICH [8]和MVAPICH [9]。因此不保证应用程序二进制接口(ABI)和库之间的互操作性这意味着更改MPI实现需要重新编译整个应用程序代码。ABI不兼容的原因之一是MPI标准没有为其数据库(如MPI_Op)指定显式类型,它们的实现完全取决于MPI库。然而,由于Wasm模块被设计为不仅在不同的MPI库之间而且在不同的CPU架构之间可移植,因此有必要在主机的MPI库使用的数据库和MPIWasm暴露给Wasm模块的数据库之间添加抽象抽象是可能的,因为大 多 数 MPI 数 据 库 , 如 MPI_Comm , MPI_Datatype 和MPI_Op对应用程序是不透明的,只用作MPI函数的参数MPI-Wasm从Wasm模块的角度将大多数MPI数据库定义为32位整数(清单2),并将这些数据库透明地转换为主机等价物(第3.7节)。我们使用整数作为数据库,因为MPIWasm在内部使用ID来标识它代表模块创建的数据结构,以便与主机MPI库进行通信。3.7在MPIWasmWasm导入由要导入的定义的名称空间和名称引用。默认情况下,将C/C++应用程序编译为Wasm时未定义的任何符号都将通过将其导入env命名空间中的模块来解决。清单3中还使用与MPI标准相关的函数导入演示了这一点。MPI- Wasm为所有这些函数提供了与原始MPI函数同名的定义,并将它们导出到env名称空间中。为了实现这些功能,我们分别将内存地址和MPI数据类型转换结合起来,如§3.5和§3.6所述。为此,我们维护了一个名为Env的结构,它存储了这些转换所需的全局状态。此结构包括有关分配给Wasm模块的内存的信息、它的基指针(§ 3.5)以及有关模块使用的不同数据库(如MPI_Comm)的为了直接利用主机MPI库,我们使用MPI- Wasm中的项目rsmpi[7]。rsmpi为Rust提供MPI绑定,并支持OpenMPI [10]和MPICH [8]。它利用rust-bindgen项目来生成为特定MPI库量身定制的外部函数接口MPIWasm中的每个MPI函数都使用适当的参数直接调用rsmpi虽然对于MPI-2.2标准中的大多数函数,MPI- Wasm直接将执行推迟到主机MPI库,探讨WebAssembly在HPC中的应用PPoPP98清单4. 使用MPIWasm执行编译为Wasm的MPI应用程序。MPI函数MPI_Alloc_Units和MPI_Free_Units的实现是不同的使用这些函数,可以分配内存以供其他MPI函数使用当Wasm模块调用MPI_Alloc_DLL时,它期望模块地址 空 间 中 的 32 位 内 存 地 址 , 而 调 用 主 机 MPI 库 的MPI_Alloc_DLL函数将返回嵌入器内存地址空间为了克服 这 一 点 , MPIWasm 只 支 持 MPI_Alloc_Round 和MPI_Free_Round,前提是Wasm模块定义并导出函数malloc和free。当调用MPI_Alloc_DLL时,MPIWasm只是调用导出的malloc并接收合适的32位模块内存地址。然后,此地址可以用作MPI_Alloc_Exception的返回值。我们以类似的方式实现MPI_Free_MPI3.8限制Wasm规范目前在执行环境中假设多字节值的小端字节顺序[52通过让主机MPI库直接访问Wasm模块的内存,我们假设模块地址空间和嵌入器地址空间中的值的字节顺序是相同的因此,MPIWasm不支持big-endian CPU架构。这并不是一个缺点,因为HPC系统中的大多数处理器架构都是小端的。此外,由于当前Wasm模块的线性32位内存空间对64位内存地址的支持是Wasm规范的一个重要里程碑,并在Wasm Memory64提案[20]中得到了强调,但超出了这项工作的范围。4实验结果在本节中,我们提出了我们的嵌入式- derMPIWasm在不同的处理器架构的性能结果对于我们所有的实验,我们在报告结果时遵循最佳实践[54]。4.1系统描述为了分析我们实现的WASM嵌入器的性能,我们使用了两个系统。首先,生产HPC俱乐部位于我们的研究所,即,SuperMUC-NG[11].第二, 使用Graviton2处理器 的AWS EC2虚拟机(VM)实例[1]。我们的HPC群集包含八个岛,共有6480个基于英特尔Skylake-SP架构的计算节点。每个计算节点有两个插槽,包括两个英特尔至强白金8174处理器,每个处理器有24个内核,总共有96GiB的主内存。的表2. 比较不同MPI应用程序的本地动态链接、静态链接和Wasm二进制文件的大小。本机应用程序是针对x86_64架构编译的。应用本机大小动态(KiB)本机静态大小(MiB)Wasm大小(KiB)英特尔MPI基准测试[55]。108727893HPCG [73].16426722IOR [60].36416315.32IS [31].361557.88DT [31]。401549.51每个核心的标称工作核心频率为3.10 GHz。系统上禁用了超线程和Turbo Boost我们系统的内部互连是一个快速的Intel Omni- Path [4]网络,带宽为100 Gbit/s。此外,我 们 的 集 群 提 供 了 一 个 基 于 Lenovo DSS-G for IBMSpectrum Scale [19]的通用并行文件系统,总带宽为200GiB/s。对于我们的实验,我们使用了HPC系统的多达128个节点,即,6144个核心。另一方面,基于64位ARMv 8-A Neoverse-N1架构的AWS Graviton 2处理器由32个内核组成,每个内核的标称频率为2。50 GHz,总内存为64GiB。我们将实验限制在Graviton2处理器的一个节点上。4.2HPC基准测试对 于 我 们 的 MPIWasm 实 验 , 我 们 使 用 Intel MPIBenchmarks [55],来自NASA高级超级计算(NAS)并行基准测试(NPB)套件[31]的两个基准测试,IOR基准测试[60]和高性能计算梯度(HPCG)基准测试[73]。英特尔MPI基准测试针对一系列消息大小的点对点和全局通信操作执行一组MPI性能测量我们使用它们,因为它们表征了集群的性能,并且是所使用的MPI实现的效率的指示。NPB套件包括一组基准测试,旨在评估HPC集群的整体性能。由于对Fortran到Wasm编译的支持还处于早期阶段[18],因此只使用了该套件中的JavaScript Sort(IS)和Data Transfer(DT)基准测试,因为它们是用纯C编写的。IS基准测试在所有参与进程中执行整数的桶并行排序,而DT基准测试通过节点拓扑发送数据来测试HPC集群的通信和64位浮点运算的性能。我们使用拓扑黑洞(bh),白洞(wh)和洗牌(sh)的DT基准。对于我们的实验,我们分别使用C类和B类作为IS和DT基准。IORBenchmark测量MPI进程可用的文件系统I/O性能。它支持使用不同API执行系统I/O的 多 个 后 端 。 对 于 MPIWasm 的 实 验 , 我 们 使 用POSIX API后端,因为POSIX文件系统API包含在WASI规范中(第2.3节,第3.2节)。HPCG基准旨在评估1mpirun-np进程数>./mpi Wasm mpi-app.wasm\2<联系我们PPoPPMohak Chadha等人99原生WASM原生WASM原生WASM原生WASM原生WASM原生WASM原生WASM原生WASM原生WASM原生WASM原生WASM原生WASM原生WASM迭代时间(usec)迭代时间(usec)迭代时间(usec)迭代时间(usec)迭代时间(usec)迭代时间(usec)迭代时间(usec)乒乓球(时间)≤1024秒1.5120222426282 10字节乒乓球(时间)>1024秒1021012122 142 162 182 202 22字节Sendrecv 6144秩(时间)≤1024秩422022242628210字节Sendrecv 6144排名(时间)>1024 1041031021012122142162182202 22字节Bcast 6144等级(时间)≤1024 402002022242628210字节Bcast 6144等级(时间)>1024年10月4日102100212 214 216 218 2202 22字节(a) 乒乓球(b) 发送接收(c) 广播.Allreduce 6144等级(时间)≤1024秒604022242628210字节Allreduce 6144排名(时间)>1024排名1041022122142162182202 22字节Allga21020222
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 黑板风格计算机毕业答辩PPT模板下载
- CodeSandbox实现ListView快速创建指南
- Node.js脚本实现WXR文件到Postgres数据库帖子导入
- 清新简约创意三角毕业论文答辩PPT模板
- DISCORD-JS-CRUD:提升 Discord 机器人开发体验
- Node.js v4.3.2版本Linux ARM64平台运行时环境发布
- SQLight:C++11编写的轻量级MySQL客户端
- 计算机专业毕业论文答辩PPT模板
- Wireshark网络抓包工具的使用与数据包解析
- Wild Match Map: JavaScript中实现通配符映射与事件绑定
- 毕业答辩利器:蝶恋花毕业设计PPT模板
- Node.js深度解析:高性能Web服务器与实时应用构建
- 掌握深度图技术:游戏开发中的绚丽应用案例
- Dart语言的HTTP扩展包功能详解
- MoonMaker: 投资组合加固神器,助力$GME投资者登月
- 计算机毕业设计答辩PPT模板下载
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功