#run-time #hpc #distributed #pgas

lamellar-prof

Lamellar 是一个针对 HPC 系统开发的异步任务运行时,由 RUST 编写

1 个不稳定版本

0.1.0 2021 年 5 月 31 日

47#hpc 排名

24 每月下载量

自定义许可

16KB
272 行代码(不包括注释)

Lamellar - Rust HPC 运行时

Lamellar 是一个针对 HPC 系统开发的异步任务运行时,由 RUST 编写

摘要

Lamellar 是对 Rust 系统编程语言在 HPC 领域的适用性进行探究,作为 C 和 C++ 的替代品,重点在于 PGAS 方法。

Lamellar 为分布式应用程序提供了几种不同的通信模式。首先,Lamellar 允许在分布式环境中发送和执行远程节点上的主动消息。运行时支持两种主动消息的形式:第一种方法与稳定 Rust 一起工作,需要用户通过实现运行时导出的特质(LamellarAM)并调用过程宏(#[lamellar::am])来注册主动消息。第二种方法仅在 nightly 版本中工作,但允许用户编写可序列化的闭包,这些闭包将由运行时传输并执行,无需注册。它还公开了远程内存区域的概念,即可以被远程节点读取/写入的内存分配。

Lamellar 依赖于名为 Lamellae 的网络提供商来在整个系统中传输数据。目前存在两种这样的 Lamellae,一种用于单节点开发目的("local"),另一种基于 Rust OpenFabrics Interface Transport Layer (ROFI)(https://github.com/pnnl/rofi

新闻

  • 2021 年 4 月:alpha 版本发布 -- v0.3
  • 2020 年 9 月:添加对 "local" lamellae 的支持,为 crates.io 发布做准备 -- v0.2.1
  • 2020 年 7 月:第二个 alpha 版本发布 -- v0.2
  • 2020 年 2 月:第一个 alpha 版本发布 -- v0.1

示例

选择 Lamellae 并构建 Lamellar 世界实例

use lamellar::Backend;
fn main(){
 let mut world = lamellar::LamellarWorldBuilder::new()
        .with_lamellae( Default::default() ) //if "enable-rofi" feature is active default is rofi, otherwise  default is local
        //.with_lamellae( Backend::Rofi ) //explicity set the lamellae backend to rofi, using the provider specified by the LAMELLAR_ROFI_PROVIDER env var ("verbs" or "shm")
        //.with_lamellae( Backend::RofiShm ) //explicity set the lamellae backend to rofi, specifying the shm provider
        //.with_lamellae( Backend::RofiVerbs ) //explicity set the lamellae backend to rofi, specifying the verbs provider
        .build();
}

创建并执行已注册的主动消息

use lamellar::{ActiveMessaging, LamellarAm};
#[derive(serde::Serialize, serde::Deserialize)] 
struct HelloWorld { //the "input data" we are sending with our active message
    my_pe: usize, // "pe" is processing element == a node
}

#[lamellar::am]
impl LamellarAM for HelloWorld {
    fn exec(&self) {
        println!(
            "Hello pe {:?} of {:?}, I'm pe {:?}",
            lamellar::current_pe, 
            lamellar::num_pes,
            self.my_pe
        );
    }
}

fn main(){
    let mut world = lamellar::LamellarWorldBuilder::new().build();
    let my_pe = world.my_pe();
    let num_pes = world.num_pes();
    let am = HelloWorld { my_pe: my_pe };
    for pe in 0..num_pes{
        world.exec_am_pe(pe,am.clone()); // explicitly launch on each PE
    }
    world.wait_all(); // wait for all active messages to finish
    world.barrier();  // synchronize with other pes
    let handle = world.exec_all(am.clone()); //also possible to execute on every PE with a single call
    handle.get(); //both exec_all and exec_am_pe return request handles that can be used to access any returned result
}

更多完整的示例可以在 examples 文件夹中找到。子目录根据它们展示的功能松散地分组示例

构建要求

  • Cargo.toml 中列出的 crate

可选:如果想在分布式 HPC 环境中运行,Lamellar 需要以下依赖项:rofi lamellae 通过在 cargo.toml 或构建时的命令行中添加 "enable-rofi" 来启用。例如:cargo build --features enable-rofi

要启用对可序列化远程闭包的支持,请使用夜间编译器编译,并指定“夜间”功能,即 cargo build --features nightly

  • RUST夜间编译器具有以下功能(启用远程闭包API)
    • #![feature(unboxed_closures)]

在发布时,Lamellar已经与以下外部包进行了测试

GCC CLANG ROFI OFI IB VERBS MPI SLURM
7.1.0 8.0.1 0.1.0 1.9.0 1.13 mvapich2/2.3a 17.02.7

必须指定OFI_DIR环境变量,以指定OFI(libfabrics)安装的位置。必须指定ROFI_DIR环境变量,以指定ROFI安装的位置。(有关安装ROFI(和libfabrics)的说明,请参阅https://github.com/pnnl/rofi

构建包

以下假设根目录为${ROOT},0.下载Lamellar到${ROOT}/lamellar-runtime cd ${ROOT} && git clone https://github.com/pnnl/lamellar-runtime

  1. 下载rofi-sys到${ROOT}/rofi-sys -- 或更新Cargo.toml以指向正确的位置 cd ${ROOT} && git clone https://github.com/pnnl/rofi-sys

  2. 选择要使用的Lamellae

    在Cargo.toml中添加“enable-rofi”功能,如果要使用rofi(或将--features enable-rofi传递给cargo build命令),否则将使用本地lamellae,可能还需要调整rofi_comm.rs中的heap大小(const ROFI_MEM)以适应系统中的可用内存

  3. 编译Lamellar库和测试可执行文件(可以将功能标志传递到命令行,而不是在cargo.toml中指定)

cargobuild (--release) (--featuresenable-rofi)(--features nightly) (--featuresexperimental)

executables located at ./target/debug(release)/test
  1. 编译示例

cargobuild --examples(--release) (--featuresenable-rofi)(--features nightly) (--featuresexperimental)

executables located at ./target/debug(release)/examples/

Note: we do an explicit build instead of `cargo run --examples` as they are intended to run in a distriubted envrionment (see TEST section below.)

测试

示例旨在在至少两个计算节点上运行,但大多数示例在单个节点上使用“本地”lamellae时也能运行。以下是一个简单的运行测试的程序,假设有一个计算集群和SLURM作业管理器。请参阅作业管理器文档,了解在不同集群上运行命令的详细信息。Lamellar从作业管理器和运行时启动器(例如,MPI,请参阅“构建要求”部分以获取测试的软件版本列表)获取作业信息(大小、分布等)。

  1. 在集群上分配两个计算节点

salloc-N2 -p partition_name

  1. 运行lamellar示例

mpiexec -n 2 ./target/release/examples/{example} 其中 <test> 是示例文件夹中每个子目录中Rust文件名的相同名称(例如,“am_no_return”)

或者也可以

srun -N 2 -p 分区名 -mpi=pmi2 ./目标/发布/示例/{示例} 其中 <test> 与示例文件夹中每个子目录下的 Rust 文件名相同(例如 "am_no_return")

环境变量

lamellar 内部使用的线程数可以通过设置环境变量来控制:LAMELLAR_THREADS,例如 export LAMELLAR_THREADS=10

可以通过显式设置 world builder 来设置 rofi 后端提供者:例如 lamellar::LamellarWorldBuilder::new().with_lamellar(Backend::Rofi) 目前有三个 Rofi 选项:Backend::RofiVerbs -- 使用 verbs 提供者(启用分布式执行) Backend::RofiShm -- 使用 shm 提供者(启用 smp 执行) Backend::Rofi -- 如果定义了 LAMELLAR_ROFI_PROVIDER 环境变量,则使用指定的提供者,否则允许 libfabrics 选择提供者。目前 LAMELLAR_ROFI_PROVIDER 的可能值包括 verbsshm

注意,如果在单个节点上运行,可以使用 local lamellar,例如 Backend::Local 直接执行二进制文件,无需使用 mpiexec 或 srun。

目前,Lamellar 利用大量的静态分配的 RDMAable 内存来构建内部运行时数据结构和缓冲区(目前正在进行更可伸缩的方法的研究),这个分配池也用于构建 LamellarLocalMemRegions(因为这个操作不应需要与其他 PE 的通信)。这个分配池的大小可以通过设置 LAMELLAR_ROFI_MEM_SIZE 环境变量来设置,可以设置为指定的字节数。默认大小是 1GB。例如,设置 20GB 可以通过 LAMELLAR_ROFI_MEM_SIZE=$((20*1024*1024*1024)) 实现。

历史

  • 版本 0.3.0
    • 递归活动消息
    • 子队支持
    • 支持自定义团队架构(Examples/team_examples/custom_team_arch.rs)
    • LamellarArray 的初始支持(基于分布式数组的 Am 集合)
    • Rofi 0.2 集成
    • 重构示例
  • 版本 0.2.2
    • 在 readme 中提供示例
  • 版本 0.2.1
    • 提供默认的本地 lamellar
    • 特征保护 rofi lamellar,以便 Lamellar 可以在没有 libfabrics 和 ROFI 的系统上构建
    • 添加了一个用于执行分布式 dft 的示例代理应用程序
  • 版本 0.2
    • 面向新用户的API
    • 注册活跃消息(启用稳定的Rust)
    • 远程闭包功能受夜间Rust保护使用
    • 重新设计内部层组织
    • 对世界和团队(PE的子组)的初始支持
  • 版本 0.1
    • 基本的init/finit功能
    • 远程闭包执行
    • 基本内存管理(堆和数据段)
    • 基本远程内存区域支持(put/get)
    • ROFI层(远程闭包执行,远程内存区域)
    • 套接字层(远程闭包执行,对远程内存区域的有限支持)
    • 简单示例

注意

状态

层仍然处于开发中,因此并非所有预期功能都已实现。

联系方式

Ryan Friese - [email protected]
Roberto Gioiosa - [email protected]
Mark Raugas - [email protected]

许可证

本项目采用BSD许可证 - 请参阅LICENSE.md文件以获取详细信息。

致谢

本工作得到了太平洋西北国家实验室(PNNL)高性能数据分析(HPDA)计划的支持,PNNL是一个多项目DOE实验室,由Battelle运营。

依赖项

~1.5MB
~35K SLoC