【Vitis Accel】3 - HLS Kernel 示例代码分析(1/2)


前言

前一篇文章大致介绍了 Vitis 开发环境,那么接下来通过实现向量加法的简单 Hello World 进一步了解 Vitis 的 Host 和 Kernel 结构。

工程文件:Github - Hello World (HLS C/C++ Kernel)


代码分析:Kernel - vadd.cpp

1. 代码结构

代码结构:load / compute / store
在这里插入图片描述

2. 关键词解释

  • load / store:尽可能高效地完成数据在 Kernel 和 Host 之间的流动
  • compute:表现为一系列运算函数(compute functions),数据通过 HLS streams 传递,包含一组嵌套的循环。
  • HLS steams:hls::stream在运算函数之间传递数据,具有阻塞(blocking)逻辑的特征,可以在函数之间同步变量值
  • Dataflow pragma:指示 compiler 使能任务级(task-level)流水,是并行、流水执行 load / compute / store 的必要步骤
  • vector 数据类型:hls::vector,vector 的长度由 I/O 端口的宽度决定。将计算单元的宽度设置成与 I/O 端口的宽度相同可以更高效的使用资源。

3. 代码逐段分析

3.1 参数定义

// vdd.cpp line 61-70
// Includes
#include <hls_vector.h>
#include <hls_stream.h>
#include "assert.h"

#define MEMORY_DWIDTH 512
#define SIZEOF_WORD 4
#define NUM_WORDS ((MEMORY_DWIDTH) / (8 * SIZEOF_WORD))

#define DATA_SIZE 4096

// TRIPCOUNT identifier
const int c_size = DATA_SIZE;
  • 可以在 Includes中看到我们将要使用的两种数据类型hls::streamhls::vector。前者在运算函数之间阻塞地传递数据,后者主要用于 I/O 端口。

  • 在计算NUM_WORDS时,由于一个 kernel 端口的最大值为 512 bits,因此有

    NUM_WORDS = 512 bits / (8 bits per byte * 4 byte per word)

  • DATA_SIZE规定了我们实际需要运算的数据长度,一般远长于 I/O 端口宽度。在本例中,我们待求和的数据是DATA_SIZE个 int 型数据

// host.cpp line 29
size_t vector_size_bytes = sizeof(int) * DATA_SIZE;
  • 最后一句对tripcount的设置与 HLS pragma loop_tripcount 的设置有关。语法为

    #pragma HLS loop_tripcount min=<int> max=<int> avg=<int>
    

    min, max, avg 分别对应循环

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值