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

news2024/9/22 7:23:28

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 = 8

void read_arr(hls::stream<int>& arr_stream, int in_arr[H][W][C])
{
    #pragma HLS inline off

    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 << in_arr[h][w][c];  
           } 
        }
    }
}


void compute_arr_on_stream( hls::stream<int>& arr_stream)
{
    #pragma HLS inline off

    int 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 dataflow

    hls::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.coloradmin.cn/o/1964779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

str字符串常量,字符指针char * str的存储方式,以及如何赋值的

在使用字符指针时&#xff0c;第一种为通常的情况。 这次主要关注第二种情况&#xff1a;把字符串赋值给字符指针变量&#xff0c;pa中存储的不是这串字符&#xff0c;而是字符串的首字符的地址。 abcdef作为一个常量字符串程序会把其放在一个单独的内存区域&#xff0c;pa存储…

C++ Primer 总结索引 | 第十七章:标准库特殊设施

仍有一些标准库设施在很多应用中都是有用的&#xff1a;tuple、bitset、正则表达式以及随机数。还将介绍一些附加的I/O库功能&#xff1a;格式控制、未格式化I/O和随机访问 1、tuple 类型 1、tuple 是类似 pair 的模板。不同 tuple 类型的成员类型也不同&#xff0c;但一个 t…

基于SpringBoot+Vue的在线政务服务中心(带1w+文档)

基于SpringBootVue的在线政务服务中心(带1w文档) 本在线政务服务中心管理系统应用在线政务服务中心&#xff0c;数据库采用的是Mysql数据库&#xff0c;并且选择了java语言和SpringBoot框架进行开发项目&#xff0c;在项目开发过程中&#xff0c;实现了系统功能模块的安全性、实…

基于SpringBoot+Vue的来访管理系统(带1w+文档)

基于SpringBootVue的来访管理系统(带1w文档) 本系统为了数据库结构的灵活性所以打算采用MySQL来设计数据库[1]&#xff0c;而java技术[2]&#xff0c; B/S架构则保证了较高的平台适应性。文中主要是讲解了该系统的开发环境、要实现的基本功能和开发步骤&#xff0c;并主要讲述了…

删除链表的倒数第N个结点(LeetCode)

题目 给你一个链表&#xff0c;删除链表的倒数第个结点&#xff0c;并且返回链表的头结点。 示例1&#xff1a; 输入&#xff1a;&#xff0c; 输出&#xff1a; 示例2&#xff1a; 输入&#xff1a;&#xff0c; 输出&#xff1a; 示例3&#xff1a; 输入&#xff1a;&#x…

HCL实验1:两台PC通过交换机ping通

2台PC机器的Ip地址必须在同一子网 PC_2的ip地址和子网掩码配置如下 PC_3的ip地址和子网掩码配置如下 将接口管理启用 在PC_2的主机上ping PC_3的ip

万科云城 科技驱动的产城融合未来开放式智慧园区

随着科技的飞速发展&#xff0c;产城融合正成为推动城市发展的新引擎&#xff0c;而智慧园区作为产城融合建设的承载体&#xff0c;通过云、边、端等新型基础设施的不断完善&#xff0c;将生产、生活等功能板块有机结合&#xff0c;打破物理边界&#xff0c;重塑科技空间与服务…

人工智能已经到来,下一步会是什么?

人工智能 (AI) 一词诞生于 1955 年&#xff0c;当时一小群科学家游说洛克菲勒基金会资助达特茅斯研讨会&#xff0c;这是一项为期两个月的项目&#xff0c;其目的是“找到如何让机器使用语言、形成抽象和概念、解决现在只能由人类解决的各种问题并自我完善”。 人工智能的快速…

C++ 二叉树-递归与层序遍历

二叉树的题目根据不同的题目特点需要用不同的递归算法或者层序遍历实现。 递归三要素 根据题目要求&#xff1a;确定递归函数的参数和返回值&#xff1b;根据题目要求&#xff1a;确定递归函数的终止返回条件&#xff1b;根据题目要求&#xff1a;确定单层的递归逻辑。 层序…

系统架构设计师体系(高级)——开篇

哈哈&#xff0c;架构体系终于开篇了&#xff01;需要说明的是软考架构偏向于技术层面&#xff0c;对数据、业务和应用方向需要再开设新专栏。同时&#xff0c;笔者编写的内容大多基于培训、阅读和其他途径的综合整理&#xff0c;并不代表已经具有高级架构知识体系。希望读者可…

DjangoRF-10-过滤-django-filter

1、安装pip install django-filter https://pypi.org/ 搜索django-filter基础用法 2、进行配置 3、进行内容调试。 4、如果碰到没有关联的字段。interfaces和projects没有直接关联字段&#xff0c;但是interface和module有关联&#xff0c;而且module和projects关联&#x…

程序员转型AI大模型好转吗?成功率高吗?

前言 在程序员圈子中&#xff0c;技术转型近年来一直是热门话题。随着AI技术的迅猛发展&#xff0c;优秀人才短缺&#xff0c;程序员向AI大模型转型似乎成为了一条通往职场先机的路径。但是&#xff0c;这条转型之路是否容易走&#xff0c;成功率又如何呢&#xff1f; 一、程…

刷题了: 110.平衡二叉树 | 257. 二叉树的所有路径 |404.左叶子之和 | 222.完全二叉树的节点个数

110.平衡二叉树 文章讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html 视频讲解:https://www.bilibili.com/video/BV1Ug411S7my/?spm_id_from333.788&vd_sourcee70917aa6392827d1ccc8d85e19e8375 题目链接:https://leetcode.cn…

MySQL从jsonarray获取某个字段的所有数据

表结构。表里的order_goods_info_vo_list是jsonarray字段 CREATE TABLE pdd_charge_back_bantuo (id int(11) NOT NULL AUTO_INCREMENT,shopname varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 店铺名,charge_back_sn varchar(64) COLLATE utf8mb4_bin DEFAULT NULL …

8. Spring Ai之入门到精通(超级详细)

简介 2024年5月30号Spring AI 的 1.0.0 里程碑 1 版本发布。表明版本已正在巩固&#xff0c;并且大部分主要错误和问题已经解决&#xff0c;API基本已确定&#xff0c;不会发生很大的变化。 在与大模型集成方面&#xff0c;继LangChain4j之后&#xff0c;又一重大的框架诞生。标…

捷径,这世上有没有捷径

Q&#xff1a;大师&#xff0c;这个世界上有没有捷径&#xff1f; A&#xff1a;有呀&#xff0c;有捷径呀 Q&#xff1a;大师&#xff0c;那我要怎么走&#xff1f; A&#xff1a;你错啦&#xff0c;不要想着走捷径&#xff0c;因为捷径不是用来走的&#xff0c;捷径是用来飞的…

计算机网络03

文章目录 重传机制超时重传快速重传SACK 方法Duplicate SACK 滑动窗口流量控制操作系统缓冲区与滑动窗口的关系窗口关闭糊涂窗口综合症 拥塞控制慢启动拥塞避免算法拥塞发生快速恢复 如何理解是 TCP 面向字节流协议&#xff1f;如何理解字节流&#xff1f;如何解决粘包&#xf…

设计界的福音:Figma中文官网,你不知道的秘密

Figma是一个基于浏览器的协作式 UI 设计工具&#xff0c;从推出至今受到 越来越多UI设计师的青睐。Figma可以在所有主流操作系统中使用&#xff0c;无论你是Mac还是Windows&#xff0c;都可以运行。无需本地保存&#xff0c;在线多人协作&#xff0c;这样轻量化的工作模式深受大…

【秋招突围】2024届秋招笔试-OPPO笔试题-第一套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新 OPPO 春秋招笔试题**汇总&#xff5e; &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; ✨ 笔试合集传送们 -> &#x1f9f7;春秋招笔试合集 &#x1f380; 01.K小姐的快…

R安装Matrix的版本问题

今天遇到一个奇怪的问题 Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck vI[[j]]) :载入了名字空间‘Matrix’ 1.4-1&#xff0c;但需要的是> 1.6.0其实我一直没搞明白&#xff0c;Matrix是cran上面的包嘛 为什么Rstudio上面又不现实呢&…