基于FPGA的卷积网络加速(1)

2023-10-30

 

vivado hls是用高级语言设计硬件电路的IDE,vivado sdsoc则用于软硬件协同也就是arm传数据到FPGA,FPGA把结果传回到FPGA,开发人员不需要知道繁琐的接口的写法,只需要指定硬件函数和调用就可以。

卷积神经网络加速,最基础的也很重要的一部分就是卷积层加速了,调好一个卷积层函数或者写成模板函数,多个串联起来,就可以在硬件上实现一个卷积神经网络了。所以,这里想总结一下最基本也是很重要的一部分,卷积层并行计算的代码的写法。

下图是一个卷积层比较常规的写法(伪代码),输入图像特征图input_fm[N][Tr+K][Tc+K],权重weights[M][N][K][K],输出特征图output_fm[M][Tr][Tc],N是输入通道,M是输出通道,Tr和Tc是输出行和列。也就是一行一行地计算output_fm的像素点。

                                      

卷积层计算中三个数组和它们下表的数据依赖性对应关系如下图所示,比如input_fm的(地址)和trr与i同时相关(其他索引固定的情况下)有依赖关系dependent。但是对于tii(其他索引固定)只有一个对应的input_fm(地址),因此independent。而too的取值和input_fm(地址)没有关系,所以是irrelevent。

                   

为什么要在乎这些呢?主要是因为并行计算要求数据也要并行,比如上面想并行做K*K个乘法,就需要能够并行地从内存中读取9个权重和9个输入,权重倒是还好说比较容易分割,但是对于输入来说分割就比较困难了,(不太容易分割数组ARRAY_PARTITION )很容易造成混乱。所以需要调整卷积层计算的循环:

                

调整之后的for循环计算卷积伪代码如上图所示,即并行做Tn*Tm个乘加运算,对于Tn来说和weight和input_fm数据依赖性是independent即一个ti只对应一个地址(其他索引固定),同样的,对Tm来说和weight与output_fm数据依赖性是independent。Tm和Tn分别对input_fm和output_fm是irrelevant的。

所以最里层的两个循环并行计算,就可以很容易找到对应的数据并行访问需求,再通过ARRAY_PARTITION指令,就能够实现卷积并行计算(data parallel)。

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于FPGA的卷积网络加速(1) 的相关文章

  • 因果推断 - 基础知识

    目录 因果关系之梯 因果图的路径结构 阻断 d 分离 混杂 结构因果模型 SCM 版权 转载前请联系作者获得授权 声明 部分内容出自因果关系之梯 已获得原作者授权 参考书籍 The Book of Why Judea Pearl 因果关系之
  • 什么是回调函数Callback----自己的一点理解

    何为回调函数 若把函数的指针作为函数参数传递给一个函数 当这个指着被用来调用它所指向的函数时 我们将该指针所指向的函数称为回调函数 回调函数与普通函数最大区别在于函数的调用 对普通函数而言 函数实现者可以直接拿来用 可以直接将它放在main

随机推荐

  • 金山逍遥网 sersync 服务器实时镜像同步方案

    金山逍遥网 sersync 服务器实时镜像同步方案 1 sersync rsync原理 2 inotify和sersync同步的区别 3 配置sersync rsync实现实时同步 2台centos7 4 一台装sersync一台装rsyn
  • 『网络安全』蜜罐到蜜网入门指南(三)蜜罐内部组成分析

    原创不易 点个赞呗 如果喜欢 关注 收藏不迷路 前言 大家好 网络安全 蜜罐到蜜网入门指南 进入第三篇 通过前面的内容 我们知道了什么是蜜罐以及蜜罐的作用和分类等 点击下方链接 可快速查看 相关文章 网络安全 蜜罐到蜜网入门指南 一 蜜罐初
  • php执行命令的函数和方法

    PHP提供4个专门的执行外部命令的函数 exec system passthru shell exec 1 exec 原型 string exec string command array output int return var 说明
  • Win10+Ubuntu双系统 使用EasyUEFI修复Ubuntu引导启动项

    某同事安装了Win10 Ubuntu双系统 有一天电脑突然坏了开不了机 把硬盘拆下放到别的机器上 发现是直接进入Win10系统 而不是grub选择界面 进F12也找不到ubuntu的启动项 最开始我先使用 Win10 Ubuntu双系统修复
  • 在项目中添加天气预报功能

    查看当地的天气情况 调用七日的天气预报情况 天气预报 注册账号获取appid和APPSecret使用 https www tianqiapi com api 图标可以直接在网站上下载
  • CoreDNS 惊现诡异 bug,导致服务大面积中断

    Sealos 公众号已接入了 GPT 4 完全免费 欢迎前来调戏 原文链接 https juejin cn post 7277471908417110053 我是 LEE 老李 一个在 IT 行业摸爬滚打 17 年的技术老兵 事件背景 某天
  • Flutter开发(十二)—— 页面跳转与返回

    示例代码 以下代码展示页面跳转与返回 抛开所有复杂因素 只展示最简单的跳转 第一个页面 点击按钮时onPressed 进行相应 通过 Navigator push 和 MaterialPageRoute 进行页面跳转功能实现 第二个页面 点
  • python中百分数如何表达_Python转换百分数表示法

    YAML中任何以百分号结尾的数字序列都将 通常作为字符串标量加载 因为 不会 标量匹配任何其他模式 尤其是不匹配整数的模式 或浮动 当然 您可以递归地遍历数据结构 从YAML和patch加载 但是如果在 数据结构 用于构造特定对象 递归到这
  • passwd: Authentication token manipulation error----linux

    author skatetime 2009 04 11 更改centos4 7 linux的root密码 报 passwd Authentication token manipulation error 如下所示 root ticket A
  • react移动端适配

    一 自定义方法配置 1 使用JavaScript动态设置根元素的字体大小 为了实现响应式的自适应效果 可以结合JavaScript根据屏幕大小动态设置根元素的字体大小 可以使用window innerWidth获取窗口的宽度 然后根据需要的
  • Q_PROPERTY

    一 定义 Qt提供了一个成熟的属性系统 Q PROPERTY是一个宏 用来在类中声明一个属性 由于该特性是Qt所特有的 需要moc进行编译 故必须继承QObject 查看Qt助手 我们可以看到如下定义 看不懂 其实 这是一个正则表达式 我们
  • Selenium Web自动化测试框架实践

    功能实现 自动运行用例 自动生成测试报告 自动断言与截图 自动将最新测试报告发送到指定邮箱 自动生成测试报告 数据 页面元素 测试用例分离 执行日志 分布式执行 配置化文件 元素 数据 实践功能 https passport csdn ne
  • AUC,ROC我看到的最透彻的讲解

    面试的时候 一句话说明AUC的本质和计算规则 AUC 一个正例 一个负例 预测为正的概率值比预测为负的概率值还要大的可能性 所以根据定义 我们最直观的有两种计算AUC的方法 1 绘制ROC曲线 ROC曲线下面的面积就是AUC的值 2 假设总
  • 前端异步编程的进化之旅 promise generator aysnc/await

    promise generator aysnc await 1 三者都是异步编程的解决方案 不同的是 promise为较早出来的 其次generator 最后为async await 三者象征了前端进行解决异步编程的进化路程 promise
  • 接口的概念及接口的方法是怎么使用的

    接口 一个完成某些特定功能的类 是一个功能的集合 语法为 接口修饰符 interface 接口名称 成员变量和方法的声明 成员变量默认为public static final类型 类不能多继承 但可通过接口实现多层继承 接口既可以多层继承
  • Opencv-C++笔记 (11) : opencv-图像二值化与LUB查找表

    文章目录 一 概述 二 THRESH BINARY和THRESH BINARY INV 三 THRESH TRUNC 四 THRESH TOZERO和THRESH TOZERO INV 五 THRESH OTSU和THRESH TRIANG
  • Python爬虫进阶必备

    X天下密码加密分析 本次的受害者 aHR0cHM6Ly9wYXNzcG9ydC5mYW5nLmNvbS8 分析 通过输入错误密码抓包查看加密字段 图1 1 图1 1 直接通过检索pwd 定位加密位置 图1 2 图1 2 根据检索结果给对应的
  • 完美解决 IDEA plugins 插件搜索不出结果

    进入设置 勾选Auto detect proxy settings 输入URL http 127 0 0 1 1080 点击OK 最后 重启 IEDA 即可
  • 注解 @Transactional 事务类内调用不生效问题及解决办法

    Transactional 内部调用例子 在 Spring 的 AOP 代理下 只有目标方法由外部调用 目标方法才由 Spring 生成的代理对象来管理 这会造成自调用问题 若同一类中的其他没有 Transactional 注解的方法内部调
  • 基于FPGA的卷积网络加速(1)

    vivado hls是用高级语言设计硬件电路的IDE vivado sdsoc则用于软硬件协同也就是arm传数据到FPGA FPGA把结果传回到FPGA 开发人员不需要知道繁琐的接口的写法 只需要指定硬件函数和调用就可以 卷积神经网络加速