重要: 要在代码中使用
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. 运算 运算 表达式 小于 <
小于或等于 <=
等于 ==
不同 !=
大于或等于 >=
大于 >