#directed-acyclic-graph #dag #graph-node #schedule #solver

dagga

用于调度创建、读取、写入和消耗资源的节点有向无环图

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 算法

Download history 871/week @ 2024-03-11 259/week @ 2024-03-18 303/week @ 2024-03-25 328/week @ 2024-04-01 83/week @ 2024-04-08 116/week @ 2024-04-15 51/week @ 2024-04-22 337/week @ 2024-04-29 33/week @ 2024-05-06 274/week @ 2024-05-13 80/week @ 2024-05-20 115/week @ 2024-05-27 55/week @ 2024-06-03 23/week @ 2024-06-10 70/week @ 2024-06-17 122/week @ 2024-06-24

273 每月下载量
用于 6 个 crate (3 直接)

MIT/Apache

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 或类似工具):dagga 示例调度

依赖关系

~1.5MB
~40K SLoC