前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HLS之任务级并行编程

HLS之任务级并行编程

作者头像
Lauren的FPGA
发布2023-08-18 13:18:36
5540
发布2023-08-18 13:18:36
举报
文章被收录于专栏:Lauren的FPGA
C语言的处理机制是顺序执行的,而FPGA本身是并行处理的,为此,VitisHLS 2022.2引入了任务级并行编程。

Vitis HLS 2022.2新增了hls::task库,以一种简单的方式创建纯净的stream kernel模型,即任务的输入/输出只能是hls::stream或hls::stream_of_blocks。这大大减少了使用C++模拟并行处理模型时对stream是否为空的检查。

我们从一个简单的例子开始看看如何使用hls::task。如下图所示代码片段。代码低19行为子函数splitter,用于把输入stream上读取的数据按奇偶分别传送到两个输出stream上。代码第27行和第31行分别为子函数odds和evens,用于对输入数据流进行处理。代码第35行为顶层函数odds_and_evens。在函数体内,第36行和第37行创建了本地局部数据流s1和s2,第39行~第41行创建了3个task。hls::task后紧跟task名,之后括号内的参数分别为函数名和输入/输出流(也称之为输入/输出通道)。这里需要注意的是本地局部数据流s1和s2(也就是task的输入输出通道)以及task本身都要声明为hls_thread_local,以保证顶层函数在被调用时它们是激活的状态。另外,看似这里没有#include <hls_task.h>,这是因为该条语句已在test.h中声明了。

使用hls::task建模时是有一些限制的。例如,只能访问本地存储单元(数组);标量和数组对task而言是本地的且不能当作参数传递;必须明确指明并行性;使用循环时只支持flp和frp,不支持stp。hls::task可以和传统的dataflow混合使用,同时可借助hls::split将一个通道的数据分发给多个通道进行处理,也可以借助hls::merge将多个通道的数据合并为一个通道。

上述代码在Vitis HLS 2023.1下可查看其Schedule视图、dataflow视图、timeline trace视图分别如下图所示。

C/RTL协同仿真结果如下图所示。可以看到out1和out2同时输出,这表明task t1 t2和t3是并行处理的。

Copyright @ FPGA技术驿站

转载事宜请私信 | 获得授权后方可转载

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA技术驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档