本节焦点是有关使用 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 的任意内核建模需要指定的某些其他重要事项: