卷积滤波器建模 - 2023.2 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 简体中文

本节焦点是有关使用 VSC 进行卷积滤波器建模的高层次探讨,不涉及有关实现本身的低层次细节。在顶层,CU 作为包含存储器接口来建模,它使用三个 8 位旨在(即,char*)指向输入数据、输出数据和滤波系数的颜色值。此外还会向 CU 传递部分其他常量参数,如偏差、图像高度和图像宽度。

头文件 conv_acc_filter.hpp 会声明 compute() 封装文件函数(用于主机代码与软件交互)以及一个或多个处理元素 (PE)。在此示例中,只有一个名为 krnl_conv 的 PE。

在 VSC 中,所有加速器都应编写为衍生自 VPP_ACC 基本类的类。在用户代码中,继承自 VPP_ACC 类的每个类都应设计为加速器,并编译为硬件。具体来说,子类应提供名为 compute() 的函数,这是已编译的硬件加速器的软件入口点,如以下示例所示。每个衍生的类都应具有唯一的名称,以表示唯一的计算单元函数。

#pragma once
#include "common.hpp"
#include "vpp_acc.hpp"
 
class conv_acc : public VPP_ACC<conv_acc, /*NCU*/3>
{
 
    ACCESS_PATTERN(src,SEQUENTIAL);
    ACCESS_PATTERN(coeffs, SEQUENTIAL);
    ACCESS_PATTERN(dst, SEQUENTIAL);
    // Data copy macros : specifies that size of data to be copied for kernel call in
    // case the kernel can process variable size data.
    DATA_COPY(src, src[width*height]);
    DATA_COPY(coeffs, coeffs[FILTER_V_SIZE*FILTER_H_SIZE]);
    DATA_COPY(dst, dst[width*height]);
 
     // Kernel DDR connections
    SYS_PORT(coeffs, DDR[0]);
    SYS_PORT(src, DDR[0]);
    SYS_PORT(dst, DDR[0]);
 
 
public:
 static void compute(
        char                 *coeffs,
        float                factor,
        short                bias,
        unsigned short       width,
        unsigned short       height,
        unsigned char        *src,
        unsigned char        *dst
        );
 static void krnl_conv(
        char                *coeffs,
        float                factor,
        short                bias,
        unsigned short       width,
        unsigned short       height,
        unsigned char        *src,
        unsigned char        *dst
        );
};

此头文件用于定义不同对象的数量,包括 CU 的顶层接口。它会声明 2 个静态函数:compute()krnl_conv()compute() 函数充当主机侧的软件入口点,从向 CU 发送数据的 send_while 线程调用(此处为 conv_acc 类)。krnl_conv() 函数会实现 CU 的所有功能。

头文件还会定义 VSC 的任意内核建模需要指定的某些其他重要事项: