Xilinx Vitis HLS教程1–Vitis HLS概述[01/12]

Xilinx Vitis HLS教程1–Vitis HLS概述[01/12]

  • 前言
  • 1 软件工程师的设计原则
    • 1.1 简介
    • 1.2 吞吐量和性能
    • 1.3 架构问题
    • 1.4 FPGA编程的3大范式
      • 1.4.1 生产者-消费者范式
      • 1.4.2 流式数据范式
      • 1.4.3 流水线范式
    • 1.5 3种范式结合

前言

项目中使用到Xilinx Zynq UltraScale+ MPSoC ZCU102 开发板,领导指示研究”xilinx软件自带的c语言综合器”。对于一个硬件一窍不通的我来说,甚至不知道问题是什么,怎么用,怎么学。

花了两天时间看了板子的硬件组成,上电启动步骤,主要参考文件:

最简单的例子是单生产者-单消费者范式,两者借助有限大小的缓冲区(buffer)进行沟通。缓存满时,生产者可以选择等待或者丢弃数据。消费者每取出一份数据,就notify通知生产者又可以塞数据了。缓存空时,消费者也可以等待。一旦生产者塞入一份数据,就唤醒沉睡中的消费者。

单生产者-单消费者范式可以通过进程间通信(inter-process communication)实现,典型地用监视器(monitor)或信 量(semaphores)。如果设计的不好,可能陷入死锁(deadlock)状态,两个进程都停滞不前,等待被唤醒。

然而,就单生产者-单消费者而言,通信模式强映射到先进先出 (FIFO) 或乒乓 (PIPO) buffer实现。这种类型的通道提供高效的数据通信,而无需依赖信 量、互斥(mutex)或监视器进行数据传输。这种基于锁(lock)的设计性能差,难以使用和调试。PIPO 和 FIFO 是受欢迎的选择,因为它们避免了端到端原子同步( atomic synchronization)。

生产者-消费者编程范式(两者通信封装在buffer中)使程序员免于担心memory models或其他不确定性行为(如条件竞争)。基于这种范式设计出来的 络称之为“数据流 络”(dataflow network):接受数据流,对流上的数据做处理,再输出数据流。如此,并行程序的复杂性就被抽象掉了。

注意,step1导入数据和step4导出数据应该尽量压缩(例如将一些动作放到step2),以获得更大的并发性。最后,喂数据要足够快而不至于拖累整体性能。

1.4.2 流式数据范式

stream是一个非常重要的概念:它代表无限的、连续更新的数据集,“无限”指不知道size或者不限制size。steam可以理解成在源进程和目的进程之间单向流动的数据,数据可以是纯标量也可以是buffer。

流式范式迫使您从数据访问模式(或序列)的角度进行思考。在软件中,数据的随机存储访问仿佛没有代价,但是在硬件层面,进行顺序访问(可以转换为stream)增益却非常大。将算法分解成用stream数据进行通信的生产者-消费者范式有很多好处。1. 它允许程序员以顺序方式定义算法,而由编译器负责提取并行化部分;2. 任务间的同步等复杂性被抽象掉了;3. 它允许生产者和消费者任务同时处理数据,这是提高吞吐量的关键;4. 代码更简洁。

正如1.2.4.1小节所述,生产者消费者范式的通信方式常为FIFO或PIPO缓存。先进先出buffer简单来说就是一个固定大小的队列,主要优点是只要队列有一份数据,消费者就可以立即开始工作。先进先出buffer的主要缺点是,生产/消费速率不同,不恰当的size可能会导致死锁,在多生产者-多消费者场景这个问题尤其突出。乒乓buffer也就“双buffer”,就是一个buffer保存旧数据,这样消费者可以看到完整的数据;同时另一个buffer是生产者正在创建新一轮数据。当新一轮数据块完成并且有效时,消费者和生产者交替访问两个buffer。因此,使用乒乓buffer可提高设备的整体吞吐量,并有助于防止最终的瓶颈。PIPO的主要优点是能自动匹配生产/消费速率,并创建一个既高性能又无死锁的通信通道。(PIPO缺点是什么mark>)

下面举个加法的实例,task1、2产生随机数,task3取数据做加法,task4输出结果。task之间的连接通常是FIFO队列。

pipeline是可以用于多种级别抽象的典型宏观架构优化范式。例如,上例是task级别流水线,pipeline也可以应用于指令级别( instruction-level pipelining,ILP)。pipeline技术是生产者-消费者范式中保持buffer非空、保持繁忙工作的关键。

由于pipeline在不同时间执行相同函数的资源也相同,因此它被认为是静态优化技术的一种。因为它需要对每个任务的lantency完全了解。也正因此,低层次指令流水线技术不能用于task latency不确定的数据流 络。

1.5 3种范式结合

用户程序的最主要优化点在于函数和循环。
函数优化
当今的优化工具典型地在函数级别下功夫。每个函数可以转换为一个特定的硬件组件。每个这样的硬件组件如同一个class申明,在最红的硬件设计中可以创建多个改组件的实例。每个硬件组件由由很多个更小的预定义组件组合而成,例如加减乘除。虽然不支持递归,但是支持函数之间互相调用。小而不常用的函数也可以写成内嵌形式,如同软件函数中的inline。此时,inline函数可以使用外层函数的资源。将设计构造为一组通信函数有助于在执行这些函数时推断并行性。
循环优化
循环体的反复执行天然就适合进行并行化,常见的转换有pipeline和unroll。这些转换可以是存储系统优化,可以映射到多核,也可以映射到SIMD指令。在自然科学和工程领域,经常看到对大数据矩阵的element-wise操作,例如卷积。这些操作可以用嵌套循环表示,如果循环之间存在数据依赖,那还需要解依赖、重写算法,再做并行化。

举个例子,4个任务分别ABCD,形成diamond通信模式,输入输出分别为vecIn和vecOut:

可见BC之间没有依赖关系,如果顺序调用两次,则流水形如: (A; B ; C; D;A; B ; C; D) ,称为“串联任务图”;
BC并行执行,则流水形如: (A; (B || C); D); (A; (B || C); D) ,称为“串并联任务图”;类似的可以处理其他有向无环任务图。

在 FPGA 上,您可以探索哪些其他形式的并行性是可用的。比如两次调用之间有没有依赖任务之间有没有依赖的整体吞吐量取决于单个任务的最低吞吐量,这个例子就涉及所提到的3大范式:生产者-消费者、流式数据、pipeline。

Xilinx Vitis HLS教程1--Vitis HLS概述[01/12]

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年7月7日
下一篇 2021年7月7日

相关推荐