Vitis HLS 完美嵌套循环通过 m_axi 接口读取DDR 的迭代次数细粒度控制实验 — 问题描述

1 自媒体账号

目前运营的自媒体账号如下:

  • 哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.com
  • CSDN 【雪天鱼】: 雪天鱼-CSDN博客

QQ 学习交流群

  • FPGA科研硕博交流群 910055563 (进群有一定的学历门槛,长期未发言会被请出群聊,主要交流FPGA科研学术话题)
  • CNN | RVfpga学习交流群(推荐,人数上限 2000) 541434600
  • FPGA&IC&DL学习交流群 866169462


  • 关键词
    dataflow 、 stream(fifo)、流水线突发、顺序突发、迭代次数细粒度控制、完美嵌套循环
  • 实验环境
    Vitis HLS 2021.1、 Vivado 2021.1(用于进行协同仿真)

2 问题描述 (公开)

所发现的设计问题:
现有一个三层嵌套循环通过 M_AXI 接口对全局存储器进行读取,如果此时对迭代次数进行细粒度控制,会导致模块延迟大约增加为原来的2倍。

image.png|625

设计描述:设计内部包含两个模块,一个是Read模块,通过 AXI4 存储器映射接口(m_axi) 与 全局存储器(PS 的 DDR)进行通信,该接口支持双向通信,但这里 Read 模块只负责从 DDR 读取数据到设计内部的 FIFO 中,然后 Compute 模块从 FIFO 中取出一个数据进行其他操作。

代码如下:

// H = 20, W =15, C = 8void read_arr(hls::stream<int>& arr_stream, int in_arr[H][W][C])
{#pragma HLS inline offfor(int h=0; h < H; h++){for(int w=0; w < W; w++){for(int c=0; c < C; c++){#pragma HLS pipeline//if (h >= 10 ) return;//if (h >= 10 && w >= 5) return;arr_stream << in_arr[h][w][c];  } }}
}void compute_arr_on_stream( hls::stream<int>& arr_stream)
{#pragma HLS inline offint value;for(int h=0; h < H; h++){for(int w=0; w < W; w++){for(int c=0; c < C; c++){#pragma HLS pipeline//if (h >= 10) return;//if (h >= 10 && w >= 5) return;arr_stream >> value;cout<<" arr_stream["<<h<<"]["<<w<<"]["<<c<<"] = "<<value<<endl;} }}
}void compute_arr(int in_arr[H][W][C])
{#pragma HLS interface m_axi depth=20*15*8 port=in_arr offset=slave bundle=inout #pragma HLS inline off#pragma HLS dataflowhls::stream<int> arr_stream("arr_stream");read_arr(arr_stream, in_arr);compute_arr_on_stream(arr_stream);
}

其中 read_arr() 函数对应 read 模块, 用于读取数组数据到 FIFO中; compute_arr_on_stream() 函数对应 compute模块,用于从FIFO中取数据并打印;compute_arr() 函数是模块顶层。
FIFO深度默认为2。所以在 read_arr 执行过一次后,会同时执行 read_arr 和 compute_arr_on_stream 函数,即在写入一个数据到FIFO的同时会读取一个数据出来进行其他操作,这是我们所期望的结果。

接下来将会展示增加【细粒度迭代次数控制】语句对协同仿真得到性能(延迟)的影响。

2.1 【版本 1.0】 无迭代次数控制

不进行迭代次数控制,所有迭代都执行完。代码无需进行改变。
我们期望的迭代总次数(trip count) = HxWxC = 20x15x8 = 2400

  • 综合报告
    image.png
    三层嵌套循环被展平了,迭代总次数为 2400 与预期一致。

仿真代码:

void test_compute_arr()
{int in_arr[H][W][C];for(int h=0; h < H; h++){for(int w=0; w < W; w++){for(int c=0; c < C; c++){in_arr[h][w][c] = h*W*C + w*C + c; // index}}}compute_arr(in_arr);
}
  • 协同仿真报告
    image.png|800
    延迟和综合报告基本一致。

2.2 【版本 2.0】 迭代次数的细粒度控制

现在对此三层嵌套循环的迭代次数进行控制,取消最内部代码的该行语句注释即可。

if (h >= 10 && w >= 5) return;

即通过h和w的值来控制外两层循环的迭代进行,期望的迭代总次数为 10x15x8 + 5x8 = 1240

  • 综合报告
    image.png
    II 和 trip count 的推断和版本 1.0 一致,但由于需要硬件实现 if 条件语句,资源用的会多点。这里说明编译器是没法根据 这种涉及多层循环迭代控制的 IF语句来推断真实的迭代次数的,也就不会进行专门的优化。
    即 If 语句会被实现为 Read 模块中的硬件逻辑,在每次迭代中都需要进行执行,但我们期望的结果是编译器能识别到具体在哪一个迭代结束。具体的对比将在下文进行说明。

  • 协同仿真报告
    image.png|800

协同仿真的打印结果是正确的,打印到 arr_stream[10][4][7] = 1239 结束,正确识别出了在何时结束函数,但延迟却不是预期中的 1240 左右,反而几乎是 1240 的两倍。

2.3 相关视频介绍

综上所述,对于此设计,通过 if 语句来进行迭代次数的细粒度控制时,会导致模块产生额外的延迟。
那么,具体的导致额外延迟的原因是什么?如何解决该问题?以确保可以在实现细粒度迭代次数控制的同时,不产生额外的延迟。

问题描述对应的我的B站视频链接:https://www.bilibili.com/video/BV1mEvse8ECQ

如果对此问题的原因以及解决方法感兴趣的话,可观看本人的充电视频:https://www.bilibili.com/video/BV1LTv4e2EVL
18元

视频内容包括:
【问题解决方面】

  • 额外延迟产生的具体原因分析
  • 两种解决方案
  • 对于通过 M_AXI 接口读取全局存储器的设计心得总结
    【Vitis HLS 工具使用方面】
  • M_AXI 接口 突发传输相关信号 和 协同仿真其他波形信号的分析
  • Vitis HLS 设计C综合、C仿真、 C/RTL 协同仿真 操作演示
  • C综合 和 C/RTL 协同仿真综合报告中 Performance 部分的分析

提供的配套资料:

  • 测试代码 / 工程 (已在 Vitis HLS 2021.1 上运行过)
  • 完整文档

声明: 基本概念参考了 Xilinx 的 UG1399 手册,实验制定以及结果分析均个人原创,建议勿拍。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387952.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费!OpenAI发布最新模型GPT-4o mini,取代GPT-3.5,GPT-3.5退出历史舞台?

有个小伙伴问我&#xff0c;GPT-4O mini是什么&#xff0c;当时我还一脸懵逼&#xff0c;便做了一波猜测&#xff1a; 我猜测哈&#xff0c;这个可能是ChatGPT4o的前提下&#xff0c;只支持文本功能的版本&#xff0c;速度更快 结果&#xff0c;大错特错。 让我们一起看看Open…

【简单介绍Gitea】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

吴恩达老师机器学习-ex4

梯度检测没有实现。有借鉴网上的部分 导入相关库&#xff0c;读取数据 因为这次的数据是mat文件&#xff0c;需要使用scipy库中的loadmat进行读取数据。 通过对数据类型的分析&#xff0c;发现是字典类型&#xff0c;查看该字典的键&#xff0c;可以发现又X&#xff0c;y等关…

类和对象【下】

一、类的默认成员函数 默认成员函数从名字就告诉我们何为默认成员函数&#xff0c;即&#xff1a;用户没有实现&#xff0c;编译器默认自动实现的函数。 这时你不禁一喜&#xff0c;还有这好事&#xff0c;编译器给我打工&#xff0c;那么&#xff0c;我们今天都来了解一下都有…

漏洞复现-路由器TOTOLINK-A6000R-RCE

本文来自无问社区&#xff0c;更多漏洞信息可前往查看http://wwlib.cn/index.php/artread/artid/14996.html 0x01 产品简介 TOTOLINK A6000R是一款性能卓越的无线路由器&#xff0c;采用先进的技术和设计&#xff0c;为用户提供出色的网络体验。其支持最新的Wi-Fi标准&#x…

锅总详解开源组织之ASF

ASF是什么&#xff1f;ASF孵化的顶级项目有哪些&#xff1f;ASF顶级项目商用化有哪些&#xff1f;涉及的版权是什么&#xff1f;应用案例有哪些&#xff1f;衍生项目及其关联是什么&#xff1f;希望本文能帮您解答这些疑惑&#xff01; 一、ASF简介 Apache Software Foundati…

Centos7.6安装Nginx(yum安装和源码安装)

Centos7.6安装Nginx&#xff08;yum安装和源码安装&#xff09; 简介 yum安装 源码安装 安装后的事情 常见问题 简介 Nginx&#xff08;发音为“engine X”&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也可以作为邮件代理服务器使用。它被广泛应用于高流量…

程序员面试中的“八股文”:是助力还是阻力?

“八股文”在实际工作中是助力、阻力还是空谈&#xff1f; 作为现在各类大中小企业面试程序员时的必问内容&#xff0c;“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢&#xff1f;有IT人士不禁发出疑问&#xff1a;程序员面试考…

使用 ChatGPT 检测媒体偏见的潜力和局限性

概述 随着数字时代的到来&#xff0c;信息瞬间传遍全球&#xff0c;但其中也不乏各种偏见。媒体偏见"&#xff0c;即对某些观点的选择性报道&#xff0c;会影响人们对某一事件或问题的看法&#xff0c;并对公众舆论产生重大影响。事实上&#xff0c;许多人都认为主要媒体…

Data Augmentation数据增强

目录 数据增强是什么 为什么数据增强 数组增强分类 有监督数据增强 无监督数据增强 数据增强是什么 数据增强又称数据扩增&#xff0c;是一种通过应用合理且随机的变换&#xff08;例如图像位移、旋转&#xff09;来增加训练集多样性的技术。让有限的数据产生等价于更多数…

现在有什么赛道可以干到退休?

最近&#xff0c;一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传&#xff0c;也不知道是真是假&#xff0c;好巧不巧今天刷热点的时候又看到一条这样的热点&#xff1a;现在有什么赛道可以干到退休&#xff1f; 点进去看了几条热评&#xff0c;第一条热评说的…

自动化测试概念篇

目录 一、自动化 1.1 自动化概念 1.2 自动化分类 1.3 自动化测试金字塔 二、web自动化测试 2.1 驱动 2.2 安装驱动管理 三、selenium 3.1 ⼀个简单的web自动化示例 3.2 selenium驱动浏览器的工作原理 一、自动化 1.1 自动化概念 在生活中&#xff1a; 自动洒水机&am…

为什么说脱离决策的数据分析都是无用功

如果你问我数据分析师最重要的能力是什么&#xff0c;我的回答是数据驱动决策&#xff0c;这是数据分析师最值钱的能力&#xff0c;没有之一。 因为数据的价值在于挖掘&#xff0c;与业务和市场进行关联&#xff0c;找到机会点。抛开这个&#xff0c;数据本身一文不值&#xf…

deployment

一.deployment rc和rs控制器都是控制pod的副本数量的&#xff0c;但是&#xff0c;他们两个有个缺点&#xff0c;就是在部署新版本pod或者回滚代码的时候&#xff0c;需要先apply资源清单&#xff0c;然后再删除现有pod&#xff0c;通过资源控制&#xff0c;重新拉取新的pod来实…

杭州东网约车管理再出行方面取得的显著成效

随着科技的飞速发展&#xff0c;网约车已成为人们日常出行的重要选择。在杭州这座美丽的城市&#xff0c;网约车服务更是如雨后春笋般蓬勃发展。特别是杭州东站&#xff0c;作为杭州的重要交通枢纽&#xff0c;网约车管理显得尤为重要。近日&#xff0c;沧穹科技郑重宣告已助力…

昇思25天学习打卡营第XX天|Pix2Pix实现图像转换

Pix2Pix是一种基于条件生成对抗网络&#xff08;cGAN&#xff09;的图像转换模型&#xff0c;由Isola等人在2017年提出。它能够实现多种图像到图像的转换任务&#xff0c;如从草图到彩色图像、从白天到夜晚的场景变换等。与传统专用机器学习方法不同&#xff0c;Pix2Pix提供了一…

Java抽象类和抽象方法

以下文章只是自己十分粗浅的理解&#xff0c;和简单的使用方法&#xff0c;没有很深度的学习理解 Java的抽象类和抽象方法都是使用abstract关键字进行修饰。 抽象类 声明格式&#xff1a;" abstract 权限修饰符 class 类名 {...} " 抽象方法 声明格式&#xff1a;“…

Seata 入门与实战

一、什么是 Seata Seata 是一款开源的分布式事务解决方式&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式事务解决方案。 二、Seata 组成 事务协调者&#xff08;Transacti…

数据结构 - 红黑树

文章目录 前言一、红黑树介绍1、红黑树的概念2、红黑树的性质 二、实现红黑树1、基本框架2、插入3、删除4、查找5、测试红黑树6、红黑树代码 三、红黑树性能四、AVL树和红黑树的差别 前言 红黑树是一种二叉搜索树&#xff0c;所以学习前需要学会基本的二叉搜索树&#xff0c;并…

OnlyOffice在线部署

部署服务环境&#xff1a;Centos7.6 curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash 安装yum-utils工具 yum install yum-utils 添加nginx.repo源(Nginx官网有最新版&#xff0c;直接copy即可) vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx st…