HLS 矢量库 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文
重要: 要在代码中使用 hls::vector 对象,请包含头文件 hls_vector.h。如需获取矢量应用示例,请参阅 GitHub 上的 Vitis-HLS-Introductory-Examples/Modeling

矢量数据类型用法

通过提供矢量数据类型即可轻松对 SIMD 类型矢量运算进行建模与综合。AMD Vitis™ HLS 矢量数据类型可按如下方式定义,其中 T 是原语或用户定义的类型,其中定义了大部分算术运算。N 是大于 0 的整数。声明矢量类型变量后,它可像任何其他原语类型的变量一样用于执行算术运算和逻辑运算。

#include <hls_vector.h>
hls::vector<T,N>  aVec;
提示:T 的位宽和 N 均为 2 的幂整数时,即可实现最佳性能。

存储器布局

对于定义为 hls::vector<T,N> 的任何矢量类型,存储器应保证连续、大小为 sizeof(T)*N 并对齐到最大 2 的幂值,因此,分配的大小至少为 sizeof(T)*N。具体来说,当 N 为 2 的幂并且 sizeof(T) 同样为 2 的幂时,vector<T, N> 即对齐到其总大小。这与大部分架构上的矢量实现都匹配。

提示: sizeof(T)*N 为 2 的幂整数值时,分配的大小将精确设为 sizeof(T)*N,否则分配的大小将更大以保证能够对齐。

以下示例显示了按上述方式与自身对齐的矢量类的定义。

constexpr size_t gp2(size_t N)
{
    return (N > 0 && N % 2 == 0) ? 2 * gp2(N / 2) : 1;
}
 
template<typename T, size_t N> class alignas(gp2(sizeof(T) * N)) vector
{
    std::array<T, N> data;
};

以下是另一个对齐示例:

hls::vector<char,8> char8Vec; // aligns on 8 Bytes boundary
hls::vector<int,8> int8Vec; // aligns on 32 byte boundary

要求和依赖关系

Vitis HLS 矢量类型需支持 C++ 14 或更高版本。它与标准报头之间存在如下依赖关系:

  • <array>
    • std::array<T, N>
  • <cassert>
    • assert
  • <initializer_list>
    • std::initializer_list<T>

受支持的运算

  • 初始化:
    hls::vector<int, 4> x; // uninitialized
    hls::vector<int, 4> y = 10; // scalar initialized: all elements set to 10
    hls::vector<int, 4> z = {0, 1, 2, 3}; // initializer list (must have 4 elements)
    hls::vector<ap_int, 4> a; // uninitialized arbitrary precision data type
  • 访问:
    operator[] 支持访问该矢量的各元素,类似于标准阵列:
    x[i] = ...; // set the element at index i
    ... = x[i]; // value of the element at index i
  • 算术:

    以递归方式定义,依靠 T 的匹配运算。

    表 1. 算术运算
    运算 就地 表达式 归约(左折)
    加法 += + reduce_add
    减法 -= - 非结合
    乘法 *= * reduce_mult
    除法 /= / 非结合
    取余 %= % 非结合
    按位 AND &= & reduce_and
    按位 OR |= | reduce_or
    按位 XOR ^= ^ reduce_xor
    左移 <<= << 非结合
    右移 >>= >> 非结合
    递增前 ++x 一元运算符
    递减前 --x 一元运算符
    递增后 x++ 一元运算符
    递减后 x-- 一元运算符
  • 比较:

    矢量按字典顺序(返回布尔值):

    表 2. 运算
    运算 表达式
    小于 <
    小于或等于 <=
    等于 ==
    不同 !=
    大于或等于 >=
    大于 >