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
-
下载rofi-sys到${ROOT}/rofi-sys -- 或更新Cargo.toml以指向正确的位置
cd ${ROOT} && git clone https://github.com/pnnl/rofi-sys
-
选择要使用的Lamellae
在Cargo.toml中添加“enable-rofi”功能,如果要使用rofi(或将--features enable-rofi传递给cargo build命令),否则将使用本地lamellae,可能还需要调整rofi_comm.rs中的heap大小(const ROFI_MEM)以适应系统中的可用内存
-
编译Lamellar库和测试可执行文件(可以将功能标志传递到命令行,而不是在cargo.toml中指定)
cargobuild (--release) (--featuresenable-rofi)(--features nightly) (--featuresexperimental)
executables located at ./target/debug(release)/test
- 编译示例
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,请参阅“构建要求”部分以获取测试的软件版本列表)获取作业信息(大小、分布等)。
- 在集群上分配两个计算节点
salloc-N2 -p partition_name
- 运行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
的可能值包括 verbs
和 shm
注意,如果在单个节点上运行,可以使用 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