浏览本指南目录
Scheduler 负责连接任务执行、依赖关系与数据搬移。ACE-Echo 1.0 区分 Gem5 DAG 运行、已编译 Scheduler 包及应用契约运行。
| 操作 | 范围 |
|---|---|
run dag |
通过所选 Gem5 Scheduler 模型执行图 |
scheduler build |
编译 Scheduler,生成 l1.elf/l1.bin |
run application --scheduler-engine contract |
解码固件中的应用计划并由模型执行 |
| 完整 Scheduler 固件执行 | 标量 CPU/外设后端尚未成为已验证的 1.0 模式 |
使用生成产物
先编译 DAG,再使用同次运行记录的 JSON、组合 BIN 和任务镜像路径。以下展示命令形式,所有 /path/to/ 路径需替换为实际产物。
./ace-echo --config .ace-echo/host/local.toml scheduler build \
--backend .ace-echo/host/backend.json \
--dag-name my_dag --dag-json /path/to/dag.json \
--dag-bin /path/to/dag.bin
没有运行时输入的全静态 DAG 可使用 –auto-static-main。动态输入需要匹配的启动程序与输入约定。
./ace-echo --config .ace-echo/host/local.toml run application \
--backend .ace-echo/host/backend.json \
--l1-elf /path/to/l1.elf --scheduler-engine contract --mode fast
成功运行能说明什么
读取覆盖范围、输出比较和时序边界。应用契约运行成功不等于完整标量 Scheduler 固件执行,也不代表新的 RTL 通过。硬件和 RTL 验证仍需配套源码、工具链和测试输入。
进一步阅读:动态输入、RTL 证据、发布验证范围。旧 dagInfoPaser.py/l1_main 属于历史集成路径。
为 L1 准备 DAG
保留同一次编译的 JSON、组合 BIN 与任务镜像。JSON 描述接口顺序和大小,二进制实现该约定。只重编 BAS 却沿用旧调度元数据,即使各组件独立构建成功,也可能产生不匹配的包。
平台打包步骤生成 fire_dag 消费的 C 数据符号,不要手写嵌入图镜像或重排描述符。图中没有 dag_input/dfedata 时可使用静态自动启动程序;否则选用提供运行时输入的 main 源码。
fire_dag API 参考
当前 Scheduler 在 dagfire.h 中公开此宏:
fire_dag(DAGname, DAGInputNum, DAGOutputNum,
/* ordered input pointers, then ordered output pointers */);
这是签名示意;实际调用需要匹配的生成符号和指针参数。
| 参数 | 含义 | 选择依据 |
|---|---|---|
DAGname |
生成符号的前缀 token | 对应打包图名称,不是运行时字符串 |
DAGInputNum |
运行时输入指针数 | 生成元数据 |
DAGOutputNum |
图输出指针数 | 生成元数据 |
| 后续输入指针 | 输入缓冲区 | 元数据记录顺序 |
| 后续输出指针 | 输出存储 | 元数据记录顺序 |
宏注册图、搬移图/任务/参数元数据,并提供输入输出绑定。它不是可移植的阻塞 C 函数;读取输出或启动依赖图之前,需要沿用匹配启动程序中的完成/FIFO 协议。
两个运行时输入的示例
假设图声明如下:
dfedata char dfe_input[4388]
dag_input short nCellid[1]
return_value short subFrameNum[1]
若生成元数据把输入排列为 nCellid、dfe_input,则即使上面声明顺序相反,调用也应遵循元数据顺序:
#include "dagfire.h"
// Include the generated DAG symbols supplied by the packaging step.
static short nCellid[1] __attribute__((aligned(64))) = {2};
static char dfe_input[4388] __attribute__((aligned(64)));
// Example allocation: leave space for the task's aligned scalar return.
static unsigned char subFrameNum_storage[64] __attribute__((aligned(64)));
void launch_example(void) {
// Populate dfe_input before launch.
fire_dag(dag_name, 2, 1, nCellid, dfe_input, subFrameNum_storage);
// Use the matching launcher's completion protocol before reading output.
}
这是集成片段,dag_name 及生成符号代表实际打包图。旧示例元数据把 nCellid 放前面,调用却先传 dfe_input,这里已统一。输出分配需覆盖生产任务实际返回的字节及 ABI 填充;BAS 的 short[1] 本身不能证明运行时只写两个字节。
连接多个 DAG
- 用相同后端编译并打包各图。
- 按各自元数据绑定输入和输出存储。
- 通过匹配的运行协议启动生产图。
- 等待规定的完成信号,再将输出作为下一图的输入。
- 消费者完成前保留缓冲区,核对跨图类型、字节数及生命周期。
应用契约模型解码受支持的计划和绑定,不模拟任意 L1 main C 控制流。新启动程序即便编译通过,也可能超出契约解码器支持范围,应检查应用覆盖报告。
旧版 dagInfoPaser 工作流
维护原 l1_main 目录布局的用户仍可使用:
cd /path/to/legacy-project/l1_main
python3 ./dagInfoPaser.py YOUR_DAG
在 daginfo/YOUR_DAG.txt 查看接口顺序,再更新对应 source/l1.cpp 及缓冲区声明。旧例使用 l1_api.h;当前包使用 dagfire.h 和生成的打包数据。复现旧应用时,目录与头文件应完整匹配同一版本。
旧直接路径为 dsl/bin/<dag>.bin、dsl/final_output/<dag>.json、dsl/venus_test/ir/<task>.hex。当前平台统一收集到运行产物,并构建隔离的 Scheduler 源码副本。
集成问题排查
| 现象 | 检查项 |
|---|---|
| 生成符号不存在 | 图 token 前缀及生成头文件/镜像 |
| 输入交换 | 元数据与 fire_dag 指针顺序 |
| 输出存储被覆盖 | 实际返回字节、填充和生命周期 |
| 图启动但应用输出陈旧 | 完成处理及依赖图时序 |
| 构建成功但契约运行失败 | 计划格式、动态输入和覆盖报告 |
| 重编译后结果不同 | JSON、BIN、任务镜像与 L1 包来自同一匹配构建 |
新增应用时,结合生成产物阅读 fire_dag 宏和动态输入约定。
