描述
DATAFLOW 编译指示可启用任务级流水打拍,允许函数和循环在其操作过程中重叠,增加 RTL 实现的并发度,并增加设计的整体吞吐量。
在 C 语言描述中,所有操作均按顺序执行。如无限制资源的任何指令(如 pragma HLS
allocation
),则 Vitis HLS 工具会尝试最大限度减小时延并提高并发。但是,数据依赖关系可能对此施加限制。例如,访问阵列的函数或循环必须先完成对阵列的所有读写访问后才能完成操作。这样会阻止下一个使用该数据的函数或循环开始操作。DATAFLOW 优化支持函数或循环中的操作在前一个函数或循环尚未完成其所有操作时就开始操作。
当指定 DATAFLOW 编译指示化后,HLS 工具会分析顺序函数或循环之间的数据流,并基于乒乓 RAM 或 FIFO 创建通道,以允许使用者 (consumer) 函数或循环在生产者 (producer) 函数或循环完成前即开始操作。这样即可允许函数或循环并行操作,从而降低时延,并提升 RTL 吞吐量。
如果未指定启动时间间隔(任一函数或循环与下一个函数或循环的开始时间间隔的周期数),那么 HLS 工具会尝试最大限度减小启动时间间隔,且数据一旦可用即开始操作。
config_dataflow
命令可用于指定数据流优化中使用的默认存储器通道和 FIFO 深度。要使 DATAFLOW 优化正常工作,数据必须逐一流经设计中的每个任务。以下编码样式会阻止 HLS 工具执行的 DATAFLOW 优化。如需了解更多详情,请参阅 控制驱动的任务级并行度的限制。
- 单一生产者使用者违例
- 任务间的反馈
- 任务的有条件执行
- 含多个退出条件的循环
最后,DATAFLOW 优化不含任何分层实现。如果子函数或循环包含可能受益于 DATAFLOW 优化的其他任务,那么必须对该循环、子函数或子函数的内联应用 DATAFLOW 优化。
语法
将 C 语言源代码中的编译指示置于区域、函数或循环的边界内。
#pragma HLS dataflow [disable_start_propagation]
-
disable_start_propagation
:(可选)禁用起始 FIFO 的创建,起始 FIFO 用于向内部进程传输起始令牌。此类 FIFO 有时可能会成为性能瓶颈。
示例
在 wr_loop_j
循环内指定 DATAFLOW 优化。
wr_loop_j: for (int j = 0; j < TILE_PER_ROW; ++j) {
#pragma HLS DATAFLOW
wr_buf_loop_m: for (int m = 0; m < TILE_HEIGHT; ++m) {
wr_buf_loop_n: for (int n = 0; n < TILE_WIDTH; ++n) {
#pragma HLS PIPELINE
// should burst TILE_WIDTH in WORD beat
outFifo >> tile[m][n];
}
}
wr_loop_m: for (int m = 0; m < TILE_HEIGHT; ++m) {
wr_loop_n: for (int n = 0; n < TILE_WIDTH; ++n) {
#pragma HLS PIPELINE
outx[TILE_HEIGHT*TILE_PER_ROW*TILE_WIDTH*i+TILE_PER_ROW*TILE_WIDTH*m+TILE_WIDTH*j+n] = tile[m][n];
}
}