Intel®高层次综合编译器专业版: 最佳实践指南

ID 683152
日期 12/04/2023
Public
文档目录

8.4.1. 启用 Intel® HLS Compiler来推断数据通路缓冲区容量要求

许多情况下, Intel® HLS Compiler可自动将缓冲区容量添加到任务系统设计的数据通路中以实现设计的最大吞吐量。遵循最佳实践有助于 Intel® HLS Compiler在需要时将数据通路缓冲容量有效添加到设计中。

例如,请考虑以下运行两个独立任务的设计。
component foo() {
  // Parse/compute data for tasks
  ihc::launch<task1>(data1);
  ihc::launch<task2>(data2);

  auto r1 = ihc::collect<task1>();
  auto r2 = ihc::collect<task2>();
  // Usage of r1, r2
}
下图显示在组件第三次调用开始时任务系统的状态,以及数据在先前调用操作的整个流水线中的位置。
图 43. 通过任务系统的多个组件调用的数据流圆形循环代表组件的流水型阶段,其中数字表示来自组件foo不同调用的数据位置。该图显示正在进行的组件的3个调用。


该图中,Entry代表2个独立启动调用,并且Exit代表2个独立收集调用。

Entry仅在两个任务可以接收数据(即,两个任务都具有可用缓冲容量)时,才为他们提供接收工作。同样的,Exit仅当两个结果都可用时才使用此结果。

如果Task1Task2具有相同数量的流水线级,则数据通路将以全吞吐量执行。调用程序函数中需要一些数据通路容量,以确保调用程序可时持续发布launch调用指令,与此同时collect调用指令等待任务函数完成。编译器自动添加此数据通路缓冲容量。

如果两个任务的流水线深度不同,设计就会遇到瓶颈,因为流水线深度要较浅的任务在等待其他任务完成时,不够缓冲容量来存储完成的结果。这样,就可向任务中较浅流水线深度的launchcollect调用指令添加缓冲容量。有关添加启动/收集缓冲容量的详细信息,请参阅必要时对设计明确添加缓冲容量

Intel® HLS Compiler尝试自动平衡数据通路缓冲容量,但其仅可在设计遵循具体实践时才能自动添加数据通路容量。

使用以下最佳实践获得任务系统设计的最大吞吐量:
  • 组件或任务函数应执行以下操作之一:
    • 自主完成所有工作,且无需启动其他任务。
    • 作为发布ihc::launchihc::collect调用的协调器运行,但不做任何工作。
  • 如果吞吐量是您设计中的优先考虑内容,就请避免使用同一任务函数的多个ihc::launchihc::collect调用指令,否则,就只能通过在循环中迭代来重复使用函数的调用指令。
  • 将同一任务函数的ihc::launchihc::collect调用指令保留在相同块内。

    使用Graph Viewer查看 High-Level Design Reports中设计的块结构来确定您的调用指令位于相同块中。

  • 避免使用“if条件”限制ihc::launchihc::collect调用指令。

    如果使用“if条件”限制ihc::launchihc::collect调用指令,则请对ihc::launchihc::collect调用指令使用相同的“if条件”。