# `examples/` 说明
这些示例采用同一个迁移模式:
- **原生目标**:直接使用 `mpi`(`rsmpi`)
- **`wasm32` 目标**:在导入区把 `jsmpi` 别名成 `mpi`
- **程序主体**:继续写 `mpi::initialize()`、`world.rank()`、`send/receive/barrier()` 等,不需要改动
## 推荐模式
```rust
#[cfg(target_arch = "wasm32")]
use jsmpi as mpi;
use mpi::traits::*;
#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;
fn run() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
// 其余逻辑保持 rsmpi 风格
}
#[cfg(not(target_arch = "wasm32"))]
fn main() {
run();
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen(start)]
pub fn start() {
run();
}
```
## 已创建示例
- `hello_ranks.rs`:最小启动 + `rank/size` + `barrier`
- `ping_pong.rs`:双 rank 收发
- `immediate_requests.rs`:非阻塞第一版示例(immediate send/receive 与 wait_any/wait_all)
- `broadcast_seed.rs`:root 广播一个整数
- `gather.rs`:rsmpi 风格 gather,root 收集各 rank 值
- `scatter.rs`:rsmpi 风格 scatter,root 下发每 rank 一个值
- `reduce.rs`:rsmpi 风格 reduce(sum),root 汇总局部值
- `ring.rs`:消息环传(每个 rank 发给 next,收自 prev,演示切片发送与向量接收)
- `sum_reduction.rs`:手写点对点归约并回传全局和
- `monte_carlo.rs`:多 rank 采样估计 pi(手写聚合路径)
## 浏览器运行
这些示例可以通过下面命令触发浏览器 demo 构建:
```bash
npm run build:demo
```
`npm run build:demo` 会在 `demo/` 目录执行 `trunk build`。
随后使用 Trunk 启动 demo:
```bash
npm run serve:demo
```
然后在 `demo/index.html` 页面中切换示例并查看输出。
> 目标是把差异限制在“导入区 + 入口包装”,让主要 MPI 代码在不同目标下保持一致。
## 点对点批量通信补充
当前 `jsmpi::traits` 已支持以下常用批量接口:
- `receive_into_with_tag`
- `send_slice` / `send_slice_with_tag`
- `receive_vec` / `receive_vec_with_tag`
- `receive_slice_into` / `receive_slice_into_with_tag`
collective 侧新增常用接口:
- `world.all_gather_into(&local, &mut out)`
- `world.broadcast_into_from(root, &mut value)`
- `world.gather_into_root(root, &local, &mut out)`
- `world.scatter_into_root(root, &input, &mut local_out)`
- `world.reduce_sum_into_root(root, &local, &mut out)`
- `world.all_reduce_sum_into_from(root, &local, &mut out)`
当同一 rank 同时处理多类消息时,优先使用带 `tag` 的变体可避免串流场景下的错配。
## 原始字节快路径(第一版)
对于不需要 serde 结构化编解码的场景,可使用字节接口:
- `send_bytes` / `send_bytes_with_tag`
- `receive_bytes` / `receive_bytes_with_tag`
- `receive_bytes_into` / `receive_bytes_into_with_tag`
该路径直接透传 `Vec<u8>` payload,减少序列化开销。发送与接收需使用同一类 API(字节对字节)。
对于更大 payload,可使用分片接口(长度前缀 + 多片数据):
- `send_bytes_chunked` / `send_bytes_chunked_with_tag`
- `receive_bytes_chunked` / `receive_bytes_chunked_with_tag`
实现细节:使用 `tag` 发送长度前缀,使用 `tag + 1` 发送分片数据;接收端自动拼包。