在 8 月 3 日举行的针对如何利用 AMD Vitis HLS 提高任务级并行性的网络研讨会中,我们深入探讨了任务级并行性的相关优势和使用方法。本次研讨会中我们收到了来自广大用户和网友的热情提问,针对代表性较强的问题,专家在线进行了集中答疑,研讨会后我们另精选出部分高频问题在本文中做出进一步解答。
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 里了。
这里既有矩阵乘也有矩阵分解。
15. HLS 封装的 IP 能像 Verilog 那样做参数化选择吗?
所谓 HLS 封装 IP 是指 Vitis HLS 把最终生成的 RTL 代码封装为 IP 供 Vivado 使用,这时已经完成了 C/C++ 到 RTL 代码的转换,所以封装的 IP 是无法参数化的。
16. 本来模块单独没有时序问题,加上 DATAFLOW 后时序问题就出现了,而且定位不到问题点,DATAFLOW 是否会影响时序?
DATAFLOW 会增加 Memory 的开销,也就增加了资源利用率,间接影响时序。但你要先具体看一下时序问题出现在哪里。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !