4 个版本
0.2.1 | 2023年7月15日 |
---|---|
0.2.0 | 2023年4月2日 |
0.1.1 | 2023年3月16日 |
0.1.0 | 2023年3月11日 |
#928 in 算法
273 每月下载量
用于 6 个 crate (3 直接)
46KB
1K SLoC
dagga 🌿
一个用于调度有向无环图的 crate。
特性
- 节点
创建
资源语义 - 节点
读取
资源语义,即借用 写入
资源语义,即可变/独占借用消耗
资源语义,即移动- 节点依赖关系
- 节点 X 必须在节点 Y 之前运行 ( 之前 )
- 节点 X 必须在节点 Y 之后运行 ( 之后 )
- 屏障 - 在屏障之前添加的节点将始终在屏障之前调度,而在屏障之后添加的节点将始终在屏障之后调度
示例用法
- 使用依赖关系、共享和独占资源调度并行操作
- 调度渲染图中的步骤
- 调度 ECS 中的系统批次
- 调度音频图中的音频节点
示例
use dagga::*;
// Create names/values for our resources.
//
// These represent the types of the resources that get created, passed through
// and consumed by each node.
let [a, b, c, d]: [usize; 4] = [0, 1, 2, 3];
// Add the nodes with their dependencies and build the schedule.
// The order they are added should not matter (it may cause differences in
// scheduling, but always result in a valid schedule).
let dag = Dag::<(), usize>::default()
.with_node({
// This node results in the creation of an `a`.
Node::new(()).with_name("create-a").with_result(a)
})
.with_node({
// This node creates a `b`.
Node::new(()).with_name("create-b").with_result(b)
})
.with_node({
// This node reads `a` and `b` and results in `c`
Node::new(())
.with_name("create-c")
.with_read(a)
.with_read(b)
.with_result(c)
})
.with_node({
// This node modifies `a`, but for reasons outside of the scope of the types
// expressed here (just as an example), it must be run before
// "create-c". There is no result of this node beside the side-effect of
// modifying `a`.
Node::new(())
.with_name("modify-a")
.with_write(a)
.with_read(b)
.run_before("create-c")
})
.with_node({
// This node consumes `a`, `b`, `c` and results in `d`.
Node::new(())
.with_name("reduce-abc-to-d")
.with_move(a)
.with_move(b)
.with_move(c)
.with_result(d)
});
dagga::assert_batches(
&[
"create-a, create-b", /* each batch can be run in parallel w/o violating
* exclusive borrows */
"modify-a",
"create-c",
"reduce-abc-to-d",
],
dag.clone(),
);
您还可以让 dagga
创建一个 dot 图文件以可视化调度(使用 graphiz 或类似工具):
依赖关系
~1.5MB
~40K SLoC