当前位置: 首页 > news >正文

Vitis HLS 学习笔记--控制驱动与数据驱动混合编程

目录

1. 简介

2. 示例分析

2.1 代码分析

2.2 控制驱动TLP的关键特征

2.3 数据驱动TLP的关键特征

3. 总结


1. 简介

在 HLS 硬件加速领域,Vitis HLS 提供了强大的抽象并行编程模型。这些模型包括控制驱动和数据驱动的任务级并行性(TLP),它们是硬件设计优化的基石。控制驱动TLP通过#pragma HLS dataflow指令实现函数的并行执行,而数据驱动TLP则利用hls::task类将函数转化为并行任务。这篇博文将深入探讨这两种并行性的特点,并通过代码示例展示它们在实际硬件设计中的应用,揭示如何有效地结合这两种模型以提升硬件性能和加速复杂算法的执行。

2. 示例分析

2.1 代码分析

#include "hls_np_channel.h"
#include "hls_task.h"

void worker(hls::stream<int>& in, hls::stream<int>& out) {
    int i = in.read();
    int o = i * 2 + 1;
    out.write(o);
}

void read_in(int* in, int n, hls::stream<int>& out) {
    for (int i = 0; i < n; i++) {
        out.write(in[i]);
    }
}

void write_out(hls::stream<int>& in, int* out, int n) {
    for (int i = 0; i < n; i++) {
        out[i] = in.read();
    }
}

void dut(int in[16], int out[16], int n) {
    hls_thread_local hls::split::round_robin<int, 4> split1;
    hls_thread_local hls::merge::round_robin<int, 4> merge1;
#pragma HLS dataflow

    read_in(in, n, split1.in);

    // Task-Channels
    hls_thread_local hls::task t[4];
    for (int i = 0; i < 4; i++) {
#pragma HLS unroll
        t[i](worker, split1.out[i], merge1.in[i]);
    }

    write_out(merge1.out, out, n);
}

功能分析:

  • worker:从输入流中读取数据,进行处理(乘2加1),然后将结果写入输出流。
  • read_in:从输入数组中读取数据,写入到输出流。
  • write_out:从输入流中读取数据,写入到输出数组。

2.2 控制驱动TLP的关键特征

#pragma HLS dataflow 指示HLS工具启用数据流模式,让不同的函数可以并行执行,它是控制驱动TLP的关键特征,具体体现如下:

  • read_in 函数和 split1 模块将数据分发到不同的通道。
  • 四个 worker 函数并行处理数据。
  • write_out 函数和 merge1 模块从不同的通道收集数据并写入输出数组。

此外,顶层函数 void dut(int in[16], int out[16], int n)  中,参数 in 和 out 均为外部存储器。

2.3 数据驱动TLP的关键特征

hls::task是一个任务通道,它允许将函数作为任务并行执行,它是数据驱动TLP的关键特征

示例代码中,worker函数被封装成任务并分配给四个hls::task实例,每个实例处理输入数据流的一部分,并将结果发送到合并通道。

hls::split::round_robin和hls::merge::round_robin是用于数据分割和合并的工具,它们支持数据流中的并行处理。split1将输入数据流平均分配给四个工作任务,而merge1则将这些任务的输出合并回单个数据流。

#pragma HLS unroll指令用于完全展开循环,确保所有任务并行执行。

3. 总结

在Vitis HLS中,控制驱动(Control-driven)和数据驱动(Data-driven)的并行性是高效硬件设计的两个关键组成部分。控制驱动并行性通过#pragma HLS dataflow指令实现,允许不同函数在数据准备好时即刻并行执行,从而优化整体性能。数据驱动并行性则通过hls::task类实现,它将函数封装为可并行执行的任务。这两种技术的结合,使得设计者能够充分利用硬件资源,实现复杂算法的高效执行。通过示例代码的分析,我们可以看到如何在实践中应用这些并行编程模型,以及它们如何协同工作以达到最佳的硬件加速效果。

相关文章:

  • 常见排序算法之选择排序
  • python之生成器表达式
  • 数字水印 | 附彩色图像论文:盲式水印嵌入的方法
  • 汽车软件单元测试分析
  • 当没用git工具是怎么快速下载项目
  • 2024年5月个人工作生活总结
  • Mac电脑重置网络命令
  • 多语言for循环遍历总结
  • 学习java第九十天
  • Linux文本处理三剑客之awk命令
  • 房地产销售管理系统具备哪些功能?
  • 下载安装nvm,使用nvm管理node.js版本
  • Linux - 高级IO
  • 10- Redis 键值对数据库是怎么实现的?
  • 人工智能专业现代学徒制人才培养质量评价体系构建
  • 2024.06.04【读书笔记】丨生物信息学与功能基因组学(第十章 多序列比对的基本概念与应用 第四部分)【AI测试版】
  • github有趣项目:Verilog在线仿真( DigitalJS+edaplayground)
  • 000002 - Hadoop环境安装
  • [Algorithm][动态规划][回文串问题][回文子串][最长回文子串][分割回文串Ⅳ]详细讲解
  • 深度解读CharGPT基本原理
  • 戴维·珀杜宣誓就任美国驻华大使
  • 农行原首席专家兼浙江省分行原行长冯建龙主动投案被查
  • “子宫内膜异位症”相关论文男性患者样本超六成?福建省人民医院展开调查
  • 中俄合拍电影《红丝绸》将于今年9月在中国上映
  • 十大券商看后市|A股风险偏好有回升空间,把握做多窗口
  • 贵州省委省政府迅速组织开展黔西市游船倾覆事故救援工作