Vitis HLS 研讨会精彩回放及问答详解

在 8 月 3 日举行的针对如何利用 AMD Vitis™ HLS 提高任务级并行性的网络研讨会中,我们深入探讨了任务级并行性的相关优势和使用方法。本次研讨会中我们收到了来自广大用户和网友的热情提问,针对代表性较强的问题,专家在线进行了集中答疑,研讨会后我们另精选出部分高频问题在本文中做出进一步解答。若您需要学习全部直播内容,欢迎点击阅读原文或扫描下方二维码观看回放。

答疑专家:

Lauren Gao(高亚军)

AMD 资深战略应用工程师

1. 所谓多任务,在 C/C++ 代码编写方面是否有新的规则或要求?或是会自动进行多任务的切分?

需要手工在 C++ 代码里明确指定可并行执行的任务(用 task,添加头文件 hls_task.h),同时可并行执行的 task 接口(对应 C++ 函数的形参)必须是 stream 或 stream_of_blocks。

2. 数据驱动型设计要求反馈指的是什么呢?可以举个例子吗?

数据驱动型支持反馈不是要求反馈,例如:funcA 输出给 funcB, funcB 输出给 funcC,funcC 的有一个输出给到 funcA 构成反馈支路。简单地说,数据流向不是单一向前的。

3. 具体代码应用中怎么快速识别出那两种并行任务的区别在哪里?

要从数据流的角度考虑,例如,数据流单一流动且后续用到的数据依赖于之前函数的输出,这种情况下是控制驱动型。funcA -> funcB -> funcC -> funD

如果数据流形成分支,但仍有依赖关系,比如 funcA -> funcB1,同时 funcA -> funcB2,那么 funcB1 和 funcB2 就是并行执行的两个任务,这就是数据驱动型。

4. 我们在使用 C/C++ 描述算法时,只需关注算法本身就可以了,但是 FPGA 好像不是这样,比如 C/C++ 没有时序的概念, HLS 如何解决这个问题?

HLS 工作原理主要有两大内容:Schedule,这个过程是提取状态控制的过程,判断什么时候执行什么操作;Binding,这个过程是指定这些操作用 FPGA 内的什么资源来实现。前者管理时序,后者管理资源。

5. 请问在直播讲解的示例中,Data_TLP 为什么能带来这么大的性能提升?示例中任务不是多么复杂,为什么 DATAFLOW 的延迟和 II 会那么高?

因为 DATA_TLP 是多个任务并行执行,而 DATAFLOW 尽管相比于原始已经有了并行性,但是一种流水的方式,所以延迟和II 都会比纯粹的并行多任务要大。

6. Stream 如果是 fifo,可以通过 pragma 指定深度吗?

可以不用 pragma 指定,在定义 stream 时就可以指定,例如:hls_stream,当然也可以通过 pragma STREAM 指定。

7. HLS 是否对硬件有特殊要求?

使用 Vitis HLS,只要芯片型号是 AMD Xilinx™ 7 系列 FPGA 到 Versal™ Adaptive SoC 芯片就可以。

8. Task 这个语法,在 2023 之前的版本里支持吗?

从 Vitis HLS 2022.2 版本开始支持。

9. HLS 能编写成一个 IP,用于流片吗?

这个需要先了解 HLS 的本质:它是把高层次语言比如 C++/C 描述的算法转换成传统的硬件语言,最终在 FPGA 上实现。采用 AMD Vitis HLS 时,选择的目标芯片只能是 AMD 的 FPGA。但从广义上来讲,如果生成的 RTL 代码不受具体 FPGA 芯片型号的限制,可以封装成 IP 使用,但到流片还有很大一段距离。

10. 请问 HLS 在做协议组帧方面,与 Verilog 相比是否更有优势?

HLS 在复杂算法方面的实现上更有优势,像这种协议组帧更适合用 HDL 比如 Verilog 或 VHDL 描述。

11. HLS 设计的验证如何保证充分性?

这个要从 C++ 测试平台的代码覆盖率角度考虑,要专门的工具来测试代码覆盖率,所以要保证验证的重复性就要保证代码覆盖率为 100%。

12. 要用好 HLS 有没有学习 Verilog 的必要?

如果你是软件工程师,没有 FPGA 背景知识,那么学习 HLS 需要先了解一下 FPGA 的内部结构和工作机制,没有多大必要专门学习 Verilog。

13. 如何对 HLS 工程进行时钟频率的提升优化?

首先,要从算法本身考虑,结合数据流进行算法分割。此外还有两个方面要考虑:一是代码风格,尽可能保证 C++ 代码风格遵循 HLS 的规范,二是如何使用 pragma,通过 pragma 来改善性能。

14. HLS 的线性代数库被移除后,还有什么库函数可以方便地实现矩阵乘法吗?

HLS 线性代数库并没有被移除,而是统一放到了 Vitis Library 里了,可从这里下载:

https://github.com/Xilinx/Vitis_Libraries

这里既有矩阵乘也有矩阵分解。

15. HLS 封装的 IP 能像 Verilog 那样做参数化选择吗?

所谓 HLS 封装 IP 是指 Vitis HLS 把最终生成的 RTL 代码封装为 IP 供 Vivado 使用,这时已经完成了 C/C++ 到 RTL 代码的转换,所以封装的 IP 是无法参数化的。

16. 本来模块单独没有时序问题,加上 DATAFLOW 后时序问题就出现了,而且定位不到问题点,DATAFLOW 是否会影响时序?

DATAFLOW 会增加 Memory 的开销,也就增加了资源利用率,间接影响时序。但你要先具体看一下时序问题出现在哪里。

更多关于 Vitis HLS 多任务并行性参考示例可访问:

https://github.com/Xilinx/Vitis-HLS-Introductory-Examples/tree/master/Ta...

最新文章

最新文章