目录
1. 示例集合概述
2. 内容分析
2.1 array_partition
2.2 bind_op_storage
2.3 burst_rw
2.4 critical_path
2.5 custom_datatype
2.6 dataflow_stream
2.7 dataflow_stream_array
2.8 dependence_inter
2.9 gmem_2banks
2.10 kernel_chain
2.11 lmem_2rw
2.12 loop_pipeline
2.13 loop_reorder
2.14 partition_cyclicblock
2.15 plram_access
2.16 port_width_widening
2.17 shift_register
2.18 simple_vadd
2.19 wide_mem_rw
3. 学习规划
1. 示例集合概述
这个 Xilinx Vitis 加速示例集合提供了一系列的 Vitis HLS 教程和示例:Vitis HLS Examples at 2022.1Vitis_Accel_Examples. Contribute to Xilinx/Vitis_Accel_Examples development by creating an account on GitHub.https://github.com/Xilinx/Vitis_Accel_Examples/tree/2022.1/cpp_kernels
如果您是新手,这些示例将帮助您快速上手并理解 Vitis HLS 开发环境和编程模型。对于有经验的开发者来说,这些示例可以作为性能优化和高级功能实现的参考。
2. 内容分析
2.1 array_partition
矩阵乘法(行 x 列),演示如何通过数组分区来实现更好的性能。
2.2 bind_op_storage
向量加法,如何使用BIND OP和STORAGE来获得更好的实现风格。
2.3 burst_rw
AXI4 主接口突发读写。
2.4 critical_path
展示一种普通的编程风格,可能会导致关键路径问题,并降低设计时序。通过更好的编程风格,可以改进设计时序。
2.5 custom_datatype
RGB到HSV转换的例子,用于演示C语言内核中自定义数据类型的使用。在内核操作和内核与全局内存之间的内存接口中使用自定义数据类型。
2.6 dataflow_stream
HLS的数据流允许用户将多个任务调度在一起,以实现更高的吞吐量。
2.7 dataflow_stream_array
多阶段向量加法的简单示例,用于演示HLS C内核代码中流数组的使用。
2.8 dependence_inter
使用 DEPENDENCE 编译指令,指定连续循环迭代中对缓冲区的依赖关系,使得编译器可以进行展开/流水线操作以获得更好的性能。
2.9 gmem_2banks
如何使用多个ddr和在每个DDR中创建缓冲区。
2.10 kernel_chain
级联矩阵乘法,启用了ap_ctrl_chain,以展示如何重叠多次内核调用的排队以获得更高的性能。
2.11 lmem_2rw
如何利用本地内存的两个端口。
2.12 loop_pipeline
演示使用流水线操作。
2.13 loop_reorder
一个简单的矩阵乘法(行 x 列)的例子,用于演示如何通过循环重排来获得更好的流水线II因子。
2.14 partition_cyclicblock
使用数组块和循环分区来提高内核的性能。
2.15 plram_access
矩阵乘法,使用PLRAM。
2.16 port_width_widening
如何通过调整内核端口宽度来优化资源利用率而不损失性能
2.17 shift_register
这个例子展示了如何在每个时钟周期中移动寄存器中的值。
2.18 simple_vadd
一个简单的向量加法。
2.19 wide_mem_rw
这是一个简单的向量加法示例,用于演示使用 ap_uint<512> 数据类型进行宽内存访问。基于输入参数类型,V++编译器将计算出全局内存和内核之间的内存数据宽度。对于这个示例,使用了 ap_uint<512> 数据类型,所以内存数据宽度将是16 x (整数位宽) = 16 x 32 = 512 bit。
3. 学习规划
"学而时习之,不亦乐乎"就是说,学习并掌握这些优化指令,并通过社交媒体分享它们,岂不是一件令人愉悦的事情吗?掌握这些优化指令不仅能够加深我们对Vitis库的理解,而且对于高效地实现硬件算法也极为有益。我已经单独分享了一些相关内容,当我使用到某个具体的优化指令时,我会详细解释其作用和重要性。