FPGA在深度学习技术中的应用实现
深度学习与FPGA的结合正在引发越来越多的关注,本系列教程将带您走完一条完整的技术路线:用C++编写推理代码,借助高级综合(HLS)将其转化为硬件描述,最终在FPGA上实现运行。上一篇我们已经基于MNIST数据集完成了网络模型的训练,从本篇开始,正式进入推理代码的C++实现阶段。本次聚焦卷积层——先
深度学习与FPGA的结合正在引发越来越多的关注,本系列教程将带您走完一条完整的技术路线:用C++编写推理代码,借助高级综合(HLS)将其转化为硬件描述,最终在FPGA上实现运行。上一篇我们已经基于MNIST数据集完成了网络模型的训练,从本篇开始,正式进入推理代码的C++实现阶段。本次聚焦卷积层——先编写代码,再验证其正确性(包括C验证和C/RTL协同验证,这是HLS开发的标准流程)。
卷积层实现详解
上一篇文章简单介绍了卷积层对图像执行滤波操作,但并未深入探讨输入输出通道的处理方式以及图像边缘的应对策略。既然要动手实现,这些技术细节就必须逐一拆解清楚。
输入输出通道的处理方式
在常规图像处理(如对RGB图像做去噪)中,卷积操作通常独立作用于每个通道(R/G/B)——G通道的像素不会影响R通道的计算结果。下图展示了这种各通道独立处理的方式。

然而,在卷积神经网络中,情况截然不同:每个输出通道的值由所有输入通道共同决定。换句话说,对于输出图像上的某一点(输出通道、Y坐标、X坐标),所有输入通道及其周围像素区域都要参与计算,计算量因此大幅提升。

顺便一提,那种每个通道独立进行卷积的做法,在深度学习领域有一个专门名称——深度可分离卷积(Depthwise Convolution)。它常用于减少计算量的网络结构,例如MobileNet(相关论文:https://arxiv.org/abs/1704.04861)。
图像边缘的填充策略
卷积操作中,边缘像素因缺少周围像素而成为经典难题。卷积神经网络通常采用两种应对方式:
- 无填充(Valid):输出图像尺寸小于输入图像,减小量等于滤波器尺寸减1。如下图所示,当卷积核大小为3(中心像素±1)时,输出图像的宽度和高度都会减少2个像素,因为边缘外侧无法进行卷积。

- 零填充(Same):先在输入图像四周补上一圈0,再执行卷积,从而保持输出图像尺寸不变。若卷积核大小为3,则输入图像每边需填充1个像素的0,宽度和高度各增加2。

本模型中所有卷积层均采用零填充策略。
C代码实现
将上述逻辑用C语言表达出来,大致代码如下:
void conv2d(const float* x, const float* weight, const float* bias, int32_t width, int32_t height,
int32_t in_channels, int32_t out_channels, int32_t ksize, float* y) {
for (int32_t och = 0; och < out_channels; ++och) {
for (int32_t h = 0; h < height; ++h) {
for (int32_t w = 0; w < width; ++w) {
float sum = 0.f;
for (int32_t ich = 0; ich < in_channels; ++ich) {
for (int32_t kh = 0; kh < ksize; ++kh) {
for (int32_t kw = 0; kw < ksize; ++kw) {
int32_t ph = h + kh - ksize/2;
int32_t pw = w + kw - ksize/2;
// zero padding
if (ph < 0 || ph >= height || pw < 0 || pw >= width) {
continue;
}
int64_t pix_idx = (ich * height + ph) * width + pw;
int64_t weight_idx = ((och * in_channels + ich) * ksize + kh) * ksize + kw;
sum += x[pix_idx] * weight[weight_idx];
}
}
}
// add bias
sum += bias[och];
y[(och * height + h) * width + w] = sum;
}
}
}
}
函数的参数说明如下:
- 输入:
x(输入图像,形状[in_channels, height, width]),weight(权重,形状[out_channels, in_channels, ksize, ksize]),bias(偏置,形状[out_channels]) - 输出:
y(输出图像,形状[out_channels, height, width]) - 参数:
width、height、in_channels、out_channels、ksize
在内存布局上,可将其想象为三维数组 float x[in_channels][height][width] 的结构。卷积层的主体是一个六重循环:前三层用于定位输出图像上的某个像素,后三层则在该位置执行卷积运算。
零填充的实现(第24~26行)并未实际创建一块补零的内存,而是通过判断访问坐标是否越界来跳过那些“不存在”的像素,这种方式更加高效。第31行执行乘累加核心操作,该操作需要重复 out_channels * height * width * in_channels * ksize * ksize 次——数量极其庞大。正因计算量巨大,卷积层往往占据了卷积神经网络绝大部分执行时间,这也是为什么GPU和FPGA(拥有大量计算单元)比CPU更适合此类任务。第37行是加偏置操作,它独立于输入通道和核大小的循环,计算开销几乎可以忽略不计。
运算正确性检查
代码编写完成后,需要确认其运行结果是否正确。我们的方法是将 conv2d 的输出与 PyTorch 的 C++ API(libtorch)计算出的结果进行比对,检查两者是否足够接近。每个测试包含两个步骤:
- C 验证
- C/RTL 协同验证
C 验证 与普通软件开发流程类似,使用 gcc 编译源代码,检查计算结果是否符合预期。
C/RTL 协同验证 则需要借助 AMD-Xilinx 的 Vitis HLS 工具。HLS 首先将 C 源码转换为 Verilog HDL 等硬件描述语言,然后在 Vivado 中对生成的 RTL 进行功能仿真——将类似 C 验证的输入数据送入所创建的电路,检查输出是否正确。下面通过实际运行代码来展示这一过程。源代码将在稍后发布。
运行环境
本环境基于 Linux 机器(不支持 Windows/Mac)。由于预装的 gcc 版本存在差异,测试基于 Ubuntu 18.04 构建。如果自行搭建环境遇到困难,可以参考思路。所需工具如下:
- Vivado 2020.2(推荐 2019.2)
- cmake >= 3.11(cmake 版本要求高于 apt 默认安装的版本,但可以下载预构建的二进制包
cmake-*-Linux-x86_64.tar.gz)
C 验证
测试代码位于 /tests/ref/conv2d.cc 中(细节此处不再展开),本质上是随机测试。构建步骤如下:
$ mkdir /build
$ cd /build
$ cmake .. -DVIVADO_HLS_ROOT=/tools/Xilinx/Vivado/2022.2
$ cmake --build .
运行测试(无报错即通过):
$ ctest -V -R "conv2d_ref"
C/RTL 协同验证
使用 HLS 启动协同验证:
$ ctest -V -R "conv2d_hls_cosim"
该过程大约需要5分钟。命令执行后会自动生成 HLS 项目文件,可用于检查高级综合结果和 RTL 仿真波形。打开 HLS 的方法:
$ vitis_hls &
在 HLS 界面中点击“打开项目”,导航到 /build/tests/hls/conv2d/conv2d_hls_cosim 目录,确认即可。

随后,您便可以在报告中查看“Performance Estimates”(性能估测)给出的电路预计性能,以及“Utilization Estimates”(资源利用率)显示的资源占用情况。点击顶部红框区域还可调出仿真波形。

波形图显示,大约在2000.00ns时即可输出 y 的第一个值。

由此可见,我们几乎没有深入硬件细节,仅通过HLS就将卷积层的计算逻辑转化为可工作的电路。当然,当前电路只是“能跑”,尚未进行任何优化——后续文章将一步步对其进行打磨。
总结
本篇我们用C++实现了卷积层,并通过了验证。接着借助HLS进行了高级综合,在C/RTL协同验证中也没有出现问题。接下来,我们需要思考如何让它运行得更快。
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:FPGA在深度学习技术中的应用实现要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
相关热点针对谷歌地图评论的AI工具Roast My Spot,能巧妙地将用户评价转化为幽默的吐槽内容。只需输入一段咖啡馆、博物馆或快餐店的客观评价,它便能生成令人捧腹的调侃语句。这并非简单的文字替换,而是融合真实反馈与犀利幽默,为平淡的评论增添趣味调料。 Roast My Spot是什么? 简单理解,它借助
需求人群 究竟哪些人最需要这款智能衣橱工具?简单来说,就是那些衣柜塞得满满当当、每天早晨却依然觉得没衣服可穿的用户。它不仅能提供精准的穿搭建议,还能帮你避开“买来买去都是同一种风格”的陷阱,把衣橱里那些被遗忘的单品重新唤醒,发挥最大价值。 使用场景 1 只需用手机扫描衣柜中的衣物,Klëm-ai就
先明确一个核心认知:慧播星(百度慧播星),是百度在电商直播赛道中布局的一款重磅AI数字人直播工具。通俗地说,它是一个由AI驱动的虚拟主播平台,商家可以快速“生成”一位数字人主播,系统自动产出直播脚本、互动话术,连直播间背景都能由AI帮你设计完成。终极目标很简单——让直播带货变得更高效、更经济、更持续
数字人视频制作目前已有不少工具可供选择,但能够真正实现高度定制化与高还原度的产品却寥寥无几。D-Human 作为其中的佼佼者,正逐渐成为行业关注的焦点。 简而言之,D-Human 并非仅限于模板化的简单工具,而是一个名副其实的数字人数字孪生平台。用户能够根据实际需求,精细定制数字人的外观形象——从五
- 日榜
- 周榜
- 月榜
热点快看
