Graph Algorithms in Rayon
5 months ago
- #rust
- #parallelism
- #rayon
- Wild链接器使用rayon实现并行化,主要通过`par_iter`,但在图探索场景下面临挑战——无法预先知晓工作量
- 初始方案:采用`spawn_broadcast`配合自定义任务共享和作业控制。复杂度高且与其他rayon特性不兼容
- 第二方案:通过`rayon::scope`实现作用域生成。虽因堆内存分配导致开销较大,但比自定义作业控制更简洁
- 第三方案:通道+`par_bridge`组合。减少堆分配但引入复杂性,与`par_iter`配合时可能出现死锁
- 基于通道的方案存在组合性问题,特别是涉及可变借用和混合不同工作队列时
- 潜在解决方案:异步/等待机制可能提供更好的任务管理,避免rayon的线程抢占问题
- 考虑回归作用域生成方案,尽管存在堆分配,但因其更好的可组合性
- 未来希望减少堆分配,可能通过修改rayon对小闭包的处理来实现
- 鸣谢支持Wild项目开发的赞助者