arceos-parallel
路径:
test-suit/arceos/task/parallel类型:测试入口 crate 分层:测试层 / ArceOS 并行执行与同步回归 版本:0.1.0文档依据:Cargo.toml、src/main.rs、qemu-riscv64.toml
arceos-parallel 通过“把 200 万个数分片给 16 个任务并求和”的固定工作负载,验证 ArceOS 的多任务、join、等待队列屏障以及多核并行路径是否仍然正确。它不是在提供并行框架,而是在拿一条可复现的并发计算链做系统回归。
核心边界非常清楚:它不是线程池、不是并行算法库,也不是性能 benchmark;它只是用一个固定工作负载证明并行任务、同步屏障和结果归并没有坏。
架构设计
1.1 工作负载结构
这个 crate 的主线分三步:
- 用固定随机种子生成
NUM_DATA = 2_000_000个u64数据。 - 主线程串行计算一次期望结果
expect。 - 16 个任务并行处理各自的切片,最后主线程
join所有任务并汇总结果。
这让它同时具备:
- 正确性基线:串行
expect - 并行路径:多任务分片求和
- 收敛点:所有子任务
join
1.2 自制 barrier 的作用
源码里的 barrier() 不是多余的,它明确让所有任务在完成自己的局部计算后,在同一个同步点汇合,然后再统一继续。对 ax-std 场景,它使用:
AxWaitQueueHandleax_wait_queue_wait_until()ax_wait_queue_wake()
这相当于顺手把等待队列同步路径也带进了测试。
1.3 真实调用链
此外,main() 一开始还故意调用了一次“永不满足条件、500ms 超时返回”的 ax_wait_queue_wait_until(),专门验证超时路径能返回 true。
核心功能
2.1 工作负载本身在测什么
每个任务对自己负责的区间执行整数平方根近似 sqrt() 并求和。这个计算不复杂,但足够耗时,能让:
- 任务真正并行运行一段时间
join与屏障逻辑有机会暴露问题- 结果可通过串行基线精确比对
2.2 为什么要保留串行 expect
如果只跑并行求和,没有独立的串行基线,就很难判断:
- 是同步错了
- 是任务丢了
- 还是局部计算本身错了
用同一份数据先算出 expect,可以把并行路径的错误直接归因到调度、同步或归并。
2.3 边界澄清
这个 crate 不应该被当成:
- 并行运行时抽象
- 高性能计算示例
- 自动负载均衡策略验证工具
它只是一个“结果可核对、同步点明确”的并发回归入口。