Vitis HLS 学习笔记--Stream Chain Matrix Multiplication

目录

1. 简介

2. 示例解析

2.1 示例功能说明

2.2 函数说明 

2.2.1 mmult 函数

2.2.2 mm2s 函数

2.2.3 s2mm 函数

2.2.4 总示意图

3. 总结


1. 简介

这是一个包含使用数据流的级联矩阵乘法的内核。该内核启用了 ap_ctrl_chain,以展示如何重叠多个内核调用队列以提供更高的性能。 ap_ctrl_chain 允许内核在完成当前内核操作之前开始处理下一个内核操作。

2. 示例解析

2.1 示例功能说明

这个例子展示了链式内核和简单内核之间的性能差异。

#pragma HLS INTERFACE s_axilite port = return bundle = control
#pragma HLS INTERFACE ap_ctrl_chain port = return bundle = control

示例包含两个内核:

1. krnl_simple_mmult:使用 ap_ctrl_hs 协议的内核。

#pragma HLS INTERFACE ap_ctrl_hs port = return

2. krnl_chain_mmult:使用 ap_ctrl_chain 协议的内核;

#pragma HLS INTERFACE ap_ctrl_chain port = return

ap_ctrl_chain 实现一组块级控制端口,用于启动设计操作、继续操作,并指示设计何时空闲、完成以及准备好新的输入数据。 ap_ctrl_chain 接口模式与 ap_ctrl_hs 类似,但提供额外的输入信号 ap_continue 来施加背压。 Xilinx 建议在将 Vivado HLS 块链接在一起时使用 ap_ctrl_chain 块级 I/O 协议。

#include "ap_axi_sdata.h"
#include "ap_int.h"
#include "hls_stream.h"
#include "krnl_mmult.hpp"
extern "C" {
void krnl_simple_mmult(int* a, int* b, int* c, int* d, int* output, int dim) {
#pragma HLS INTERFACE m_axi port = a offset = slave bundle = gmem0
#pragma HLS INTERFACE m_axi port = b offset = slave bundle = gmem1
#pragma HLS INTERFACE m_axi port = c offset = slave bundle = gmem2
#pragma HLS INTERFACE m_axi port = d offset = slave bundle = gmem3
#pragma HLS INTERFACE m_axi port = output offset = slave bundle = gmem3
#pragma HLS INTERFACE s_axilite port = a
#pragma HLS INTERFACE s_axilite port = b
#pragma HLS INTERFACE s_axilite port = c
#pragma HLS INTERFACE s_axilite port = d
#pragma HLS INTERFACE s_axilite port = output
#pragma HLS INTERFACE s_axilite port = dim
#pragma HLS INTERFACE s_axilite port = return
#pragma HLS INTERFACE ap_ctrl_hs port = return#pragma HLS STABLE variable = a
#pragma HLS STABLE variable = b
#pragma HLS STABLE variable = c
#pragma HLS STABLE variable = d
#pragma HLS STABLE variable = outputhls::stream<pkt> strm_a, strm_b, strm_c, strm_d;hls::stream<int> strm_ctrl_trans1, strm_ctrl_trans2, strm_ctrl_trans3, strm_ctrl_trans4, strm_ctrl_trans5;int tmp = dim;strm_ctrl_trans1.write(tmp);#pragma HLS STREAM variable = strm_ctrl_trans1 depth = 2
#pragma HLS STREAM variable = strm_ctrl_trans2 depth = 2
#pragma HLS STREAM variable = strm_ctrl_trans3 depth = 2
#pragma HLS STREAM variable = strm_ctrl_trans4 depth = 2
#pragma HLS STREAM variable = strm_ctrl_trans5 depth = 2#pragma HLS STREAM variable = strm_a depth = 64
#pragma HLS STREAM variable = strm_b depth = 64
#pragma HLS STREAM variable = strm_c depth = 64
#pragma HLS STREAM variable = strm_d depth = 64#pragma HLS DATAFLOWmm2s(a, strm_a, strm_ctrl_trans1, strm_ctrl_trans2);mmult(strm_a, b, strm_ctrl_trans2, strm_b, strm_ctrl_trans3);mmult(strm_b, c, strm_ctrl_trans3, strm_c, strm_ctrl_trans4);mmult(strm_c, d, strm_ctrl_trans4, strm_d, strm_ctrl_trans5);s2mm(strm_d, output, strm_ctrl_trans5);
}
}

2.2 函数说明 

  • mm2s 函数:这个函数将矩阵的行读入并写入一个流,同时发送控制信号以指示矩阵的大小。
  • mmult 函数:这个函数实现了矩阵乘法。它首先读取控制信号来确定矩阵的大小。然后,它创建了四个临时数组来存储矩阵的行、列、乘积和最终结果。接下来,它使用三个循环来计算每个结果元素的值,通过将相应行和列的元素相乘和相加得到。
  • s2mm 函数:这个函数将矩阵的结果读入并写入一个流,同时发送控制信号以指示矩阵的大小。

下面分别对三个函数展开说明:

2.2.1 mmult 函数

// Template to avoid signature conflict in sw_em
template <int DUMMY = 0>
void mmult(hls::stream<pkt>& strm_a,int* b,hls::stream<int>& strm_ctrl_trans2,hls::stream<pkt>& strm_out,hls::stream<int>& strm_ctrl_trans3) {int dim = strm_ctrl_trans2.read();strm_ctrl_trans3.write(dim);int size = dim * dim;int buf_a[MAT_DIM][MAT_DIM];int buf_b[MAT_DIM][MAT_DIM];int buf_out[MAT_DIM][MAT_DIM];int temp_sum[MAT_DIM];int i, j, itr;// Auto-pipeline is going to apply pipeline to these loops
read_strm_in1:for (itr = 0, i = 0, j = 0; itr < size; itr++, j++) {if (j == dim) {j = 0;i++;}pkt temp = strm_a.read();buf_a[i][j] = temp;}read_mm_in2:for (itr = 0, i = 0, j = 0; itr < size; itr++, j++) {if (j == dim) {j = 0;i++;}buf_b[i][j] = b[i * dim + j];}mmult_strm_1:for (int row = 0; row < dim; row++) {mmult_strm_2:for (int col = 0; col < dim; col++) {int result = 0;mmult_strm_3:for (int l = 0; l < dim; l++) {
// As the outer loop is not a perfect loop
#pragma HLS loop_flatten offresult += buf_a[row][l] * buf_b[l][col];}buf_out[row][col] = result;}}write_strm_out:for (itr = 0, i = 0, j = 0; itr < size; itr++, j++) {if (j == dim) {j = 0;i++;}pkt temp;temp = buf_out[i][j];strm_out.write(temp);}
}

2.2.2 mm2s 函数

template <int DUMMY = 0>
void mm2s(       int* a,hls::stream<pkt>& strm_a,hls::stream<int>& strm_ctrl_trans1,hls::stream<int>& strm_ctrl_trans2)
{int dim = strm_ctrl_trans1.read();strm_ctrl_trans2.write(dim);int size = dim * dim;// Auto-pipeline is going to apply pipeline to this loop
mm2s:for (int i = 0; i < size; i++) {pkt p1;p1 = a[i];strm_a.write(p1);}
}

2.2.3 s2mm 函数

template <int DUMMY = 0>
void s2mm(hls::stream<pkt>& strm_in,int* output,hls::stream<int>& strm_ctrl_trans5)
{int dim = strm_ctrl_trans5.read();int size = dim * dim;write_output:for (int i = 0; i < size; i++) {pkt temp = strm_in.read();output[i] = temp;}
}

 

2.2.4 总示意图

3. 总结

这个内核的核心功能是通过使用数据流和级联矩阵乘法来提高性能。它利用了 ap_ctrl_chain 协议,这允许内核在当前操作完成后立即开始下一个操作,从而实现了更高的并行性和效率。内核包含两个版本:简单的 krnl_simple_mmult 和链式的 krnl_chain_mmult。简单版本使用 ap_ctrl_hs 协议,而链式版本使用 ap_ctrl_chain 协议,后者提供了额外的控制信号来管理内核操作的流程。

示例代码展示了如何使用这些内核进行矩阵乘法。mm2s 函数读取矩阵的行并发送控制信号,mmult 实现了矩阵乘法操作,而 s2mm 函数将结果写入流。这些函数通过数据流和控制信号的协同工作,实现了高效的内核调用和数据处理。

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

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

相关文章

2024年最好用的精简系统推荐!旧电脑福音!

精简版电脑系统经过精心优化&#xff0c;去除了冗余功能&#xff0c;保留了核心功能&#xff0c;让用户的操作更加便捷高效&#xff0c;同时也具备强大的兼容性和稳定性&#xff0c;整体操作体验感很好。但是&#xff0c;许多新手用户不知道在哪里才可以找到好用的精简版系统&a…

Mojo崛起:AI-first 的编程语言能否成为新流行?

眨眼之间&#xff0c;你可能会错过又一种编程语言的发明。 有个笑话说&#xff0c;程序员花费20%的时间编写代码&#xff0c;80%的时间决定使用什么语言。 事实上&#xff0c;编程语言如此之多&#xff0c;以至于我们不确定实际有多少种。据估计&#xff0c;至少有700种编程语…

【Android 11】AOSP Settings添加屏幕旋转按钮

前言 这里是客户要求添加按钮以实现屏幕旋转。屏幕旋转使用adb的命令很容易实现&#xff1a; #屏幕翻转 adb shell settings put system user_rotation 1 #屏幕正常模式 adb shell settings put system user_rotation 0这里的值可以是0&#xff0c;1&#xff0c;2&#xff0c…

中国天辰×蓝卓丨共创行业级工业操作系统,加速培育新质生产力!

6月17日&#xff0c;中国天辰工程有限公司&#xff08;以下简称“中国天辰”&#xff09;党委委员、总经理梁军湘一行莅临蓝卓&#xff0c;双方就工业互联网平台合作进行座谈交流。蓝卓总经理谭彰、副总经理蓝照斌、总经理助理俞益标&#xff0c;以及中控技术副总裁吴才宝、大客…

Altair 人工智能技术助力MABE预测消费者行为,实现设备性能优化

主要看点 行业&#xff1a; 家电行业 挑战&#xff1a; 企业面临的挑战是如何利用已收集的大量数据&#xff0c;深入了解消费者在产品使用过程中对某些保鲜程序的影响。 Altair 解决方案&#xff1a; Altair采用了Altair RapidMiner人工智能平台来解决问题&#xff0c;特别是…

docker安装消息队列mq中的rabbit服务

在现代化的分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;已经成为了一种不可或缺的组件。RabbitMQ作为一款高性能、开源的消息队列软件&#xff0c;因其高可用性、可扩展性和易用性而广受欢迎。本文将详细介绍如何在Docker环境中安装RabbitMQ服务…

八股系列 Flink

Flink 和 SparkStreaming的区别 设计理念方面 SparkStreaming&#xff1a;使用微批次来模拟流计算&#xff0c;数据已时间为单位分为一个个批次&#xff0c;通过RDD进行分布式计算 Flink&#xff1a;基于事件驱动&#xff0c;是面向流的处理框架&#xff0c;是真正的流式计算…

访问学者谈CSC青年骨干教师项目出国经历及感受

CSC青年骨干教师出国研修项目实施已近20年&#xff0c;越来越多的青年教师成为该项目的受益者。知识人网小编推荐该项目资助老师谈谈在加拿大卡尔加里大学访学一年的经历及感受。 国家留学基金委&#xff08;以下简称CSC&#xff09;高等学校青年骨干教师出国研修项目&#xff…

个股期权有哪些股票?金融新手必须知道!

今天带你了解个股期权有哪些股票&#xff1f;在中国的股票市场中&#xff0c;个股期权是一种衍生品&#xff0c;允许投资者购买或卖出特定股票的期权合约。 个股期权有哪些股票&#xff1f; 个股期权是指在特定时间内&#xff0c;以特定价格买入或卖出特定数量的某只个股的权利…

lombok.jar包,解决 java: 找不到符号 符号: 类 __

打开设置在这里添加这样一小句话. -Djps.track.ap.dependenciesfalse

赛氪网荣膺“创新型中小企业”称号,科技创新再显卓越实力

近日&#xff0c;北京市经济和信息化局揭晓了2024年度3月份北京市创新型中小企业的光荣名单&#xff0c;其中北京环球赛乐科技有限公司&#xff08;简称赛氪网&#xff09;脱颖而出&#xff0c;再度展现其在创新领域的卓越实力&#xff01; 作为早已跻身“高企之光”行列的佼佼…

COUNTIF函数除计数,还可排序哦

COUNTIF函数除统计个数外&#xff0c;还可以排序哦&#xff01; 近期工作中遇到一个场景“对不同类型的人员按办理量进行排序”&#xff0c;前期只是对同一种类型进行排序&#xff0c;经过查阅资料&#xff0c;可以用COUNTIF函数解决问题&#xff0c;今天就把COUNTIF函数的用法…

EarMaster pro 7 For Mac软件下载-EarMaster Pro(音乐赏析进阶专业版)V6.1下载附加详细安装步骤

EarMaster pro 7 For Mac最新版是一款相当专业的听力训练和音乐理论练习软件&#xff0c;这个EarMaster pro 7 For Mac版带来了全的操作界面&#xff0c;并且更新了课程信息&#xff0c;内置了2000多种课程供用户选择&#xff0c;可以用于听耳训练、视唱和节奏训练等操作。 安 …

视频太大了怎么缩小内存

我们在分享视频的时候&#xff0c;有时候会遇到过视频文件太大&#xff0c;无法发送或者上传的情况&#xff0c;别担心&#xff0c;今天我就来给大家分享一个简单有效的方法&#xff0c;让你的视频变得更小&#xff0c;更方便分享&#xff01; 打开 “51视频处理官网 的网站。上…

学校分体空调集控系统

学校分体空调集控系统是一种先进的温度控制解决方案&#xff0c;它主要针对学校等公共场所的空调管理需求而设计。该系统通过集中控制和管理多台分体空调设备&#xff0c;实现了更高的能效、更便捷的操作和更舒适的室内环境。 需求与挑战&#xff1a;学校教学楼、办公楼、实验楼…

智能血糖仪的条码二维码读取设备选型经验分享

智能科技的快速发展&#xff0c;推动医疗辅助设备朝着更加智能、操作更便捷的方向发展&#xff0c;便携式血糖仪已经成为糖尿病患者日常监测血糖的重要工具&#xff0c;但传统血糖仪的检测结果需要用户自己判断&#xff0c;缺乏数据分析很容易出错&#xff0c;而便携式智能血糖…

为啥找对象千万别找大厂男,还好我不是大厂的。。

网上看到一大厂女员工发文说&#xff1a;找对象千万别找大厂男&#xff0c;理由说了一大堆&#xff0c;无非就是大厂男为了逃避带娃&#xff0c;以加班为由宁愿在工位上玩游戏也不愿回家。当然这种观点有的人赞同有的人反对。 网友精彩评论&#xff1a; --------------下面是今…

Python基础教程——20个让人眼前一亮的逻辑妙用!

文末免费赠精品编程资料~~ Python不仅仅是一种编程语言&#xff0c;它还是解决问题的艺术&#xff0c;充满了让人拍案叫绝的“小巧思”。通过这15个小技巧&#xff0c;你不仅能提升编程技能&#xff0c;还能让你的代码更加优雅、高效。让我们一探究竟吧&#xff01; 1. 列表推…

终于把TikTok账号养好了!我是如何做的?

对于很多刚开始运营TikTok的新手小白来说&#xff0c;都会有一个同样的疑问&#xff0c;那就是&#xff1a;TikTok到底需不需要养号&#xff1f;这里明确告诉大家是需要养号的&#xff0c;今天就把我自己实操过的养号经验和策略总结出来&#xff0c;分享给大家。 一、什么是Tik…

2025年计算机毕业设计题目参考

今年最新计算机毕业设计题目参考 以下可以参考 springboot洗衣店订单管理系统 springboot美发门店管理系统 springboot课程答疑系统 springboot师生共评的作业管理系统 springboot平台的医疗病历交互系统 springboot购物推荐网站的设计与实现 springboot知识管理系统 springbo…