IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> SDSOC加速实录-(1)加速工具及库的概述 -> 正文阅读

[嵌入式]SDSOC加速实录-(1)加速工具及库的概述

做的项目到了第二个阶段,从单纯的写代码到需要对算法硬件加速。本人也是第一次接触HLS和SDSOC,记录一下小白的学习心得,可能有不准确的地方,见谅。

简单介绍:

  • 系统:ubuntu16.04.4
  • 平台:zcu102
  • 软件:SDx/SDSOC-v2018.3
  • 代码内容:图像处理
  • 文章内容:xfopencv库、opencv库的使用,如何使用SDSOC加速算法

1.概述

1.1关于xfopencv问题

问题1:什么是xfopencv库?

回答:
①处理图像的时候都用opencv,但是xfopencv已经根据相关语法对opencv中某些函数针对硬件设备进行了加速和优化,直接调用即可。
②xfopencv发布于2018年年度,命名空间为xf::,输入矩阵为xf::Mat,其目的是取代原来的hls::库。
③随着技术的进步,xfopencv已经逐渐淘汰,最高版本仅支持到vivado_hls-v2019.2.
使用详情:请登陆Xilinx官网查看文档UG1233
下载详情:请登录Github官网搜索“xfopencv”

问题2:xfopencv的处理流程是?

回答:

//1.使用cv::Mat来读取图像,这个过程是从sd卡向DRAM读取图片的过程
//2.将cv::Mat图像拷贝到xf::Mat,初始化该函数需要<图像长宽>、<像素的数据类型>、<每个时钟处理像素数>  
//3.调用xfopencv的内置函数,这里需要使用xf::Mat类型,该过程是处理过程
//4.从xf::Mat拷贝到cv::Mat,该过程是从DRAM向sd卡写入图片的过程

1.2关于SDSOC问题

问题1:SDSOC如何加速?

回答:SDSOC主要面向软件编程人员,大概率不需要懂硬件的知识(如果有更好),但你需要懂得你手中的板卡处理上限是什么?
其处理流程为:

//1.写好C/C++代码,并找出计算密集的函数/模块(后续将进行加速)
//2.使用HLS语法对函数内部/函数接口进行优化
    ①函数内部用于循环的展开/并行;
    ②函数的接口用于数据的传输,尤其是图像数据从PS到PL的传输需要着重优化
//3.根据仿真结果的处理表现,重复优化上述过程

对于SDSOC这个工具的使用来说,最重要的一步骤就是硬件加速,对应着在项目界面(project explore)中添加要加速的硬件函数(Haradware Funcion),引出了下面的问题

问题2:已知SDSOC编译指令为sds++,编译工具对应板卡的系统编译工具,其编译过程是一个交叉编译的过程。在对硬件函数进行编译的时候有什么需要注意的事项?

回答:
需要注意三点:
①不使用bool类型的数组
②不对顶层硬件函数的接口使用hls::stream
③不对顶层硬件函数进行接口优化,但可以指定生成接口

//创建AXI接口
#pragma SDS data zero_copy(): Use to generate a shared memory interface
//创建FIFO接口
#pragma SDS data access_pattern(argument:SEQUENTIAL)

查看例程<mmultadd.h>:
<#pragma SDS>类指令在头文件中出现,目的是以声明的形式创建函数传输端口
<#pragma HLS>类指令在函数体内出现,目的是向计算密集函数内添加基于HLS工具的硬件加速语句

  • 头文件中,声明了函数<mmult()>和函数<madd()>的数据传输端口形式为FIFO,FIFO可以理解为顺序读取。
  • 如果不使用#pragma SDS指令来制定端口的话,则会使用默认端口形式RAM,RAM可以理解为随机读取。
  • 随机读取对于某些特定的处理任务产生影响,因此请指定适合处理任务的数据传输端口
#ifndef _MMULTADD_H_
#define _MMULTADD_H_

#define N 32

/**
* Design principles to achieve best performance
*
* 1. Declare secquential access to stream data into accelerators via a hardware FIFO 
*    interface.  Otherwise, the default RAM interface requires all data to arrive
*    before starting HLS accelerator
*/
#pragma SDS data access_pattern(A:SEQUENTIAL, B:SEQUENTIAL, C:SEQUENTIAL)
void mmult (float A[N*N], float B[N*N], float C[N*N]);

#pragma SDS data access_pattern(A:SEQUENTIAL, B:SEQUENTIAL, C:SEQUENTIAL)
void madd(float A[N*N], float B[N*N], float C[N*N]);

#endif /* _MMULTADD_H_ */

查看<mmult.cpp>,其中带<#>的语句就是向计算密集函数内添加基于HLS工具的硬件加速语句

`#include <stdio.h>
#include <stdlib.h>
#include "mmultadd.h"

/**
*
* Design principles to achieve II = 1
* 1. Stream data into local RAM for inputs (multiple access required)
* 2. Partition local RAMs into N/2 sub-arrays for fully parallel access (dual-port read)
* 3. Pipeline the dot-product loop, to fully unroll it
* 4. Separate multiply-accumulate in inner loop to force two FP operators
*
*/
void mmult (float A[N*N], float B[N*N], float C[N*N]) 
{
    float Abuf[N][N], Bbuf[N][N];
#pragma HLS array_partition variable=Abuf block factor=16 dim=2 
#pragma HLS array_partition variable=Bbuf block factor=16 dim=1
    
   for(int i=0; i<N; i++) {
        for(int j=0; j<N; j++) {
#pragma HLS PIPELINE
              Abuf[i][j] = A[i * N + j];
              Bbuf[i][j] = B[i * N + j];
         }
    }
 
    for (int i = 0; i < N; i++) {
         for (int j = 0; j < N; j++) {
#pragma HLS PIPELINE
              float result = 0;
              for (int k = 0; k < N; k++) {
                   float term = Abuf[i][k] * Bbuf[k][j];
                   result += term;
              }
              C[i * N + j] = result;
         }
    }
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:03:54  更:2022-07-20 19:04:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 17:18:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计