通过提供矢量数据类型即可对单指令流多数据流 (SIMD) 类型的运算轻松进行建模与综合。许多运算符都重载,以便为矢量类型提供 SIMD 行为。AMD Vitis™ HLS 库可提供 hls::vector<T, N>
类型的参考实现,用于表示单指令流多数据流 (SIMD) 矢量,其定义如下。
-
T
:表示矢量保存的元素类型,可以是用户定义的类型,该类型必须提供常用的算术运算。 -
N
:矢量包含的元素数量,必须为正整数。 - 当
T
的位宽和N
均为 2 的幂整数时,即可实现最佳性能。
Vitis HLS 提供了模板类型 hls::vector
,可用于定义 SIMD 操作数。在并行执行这些运算的综合期间,使用此类型执行的所有运算都映射到硬件。这些运算可在 II=1 的流水打拍循环内执行。以下示例显示了如何定义和使用含 8 个整数元素的矢量:
typedef hls::vector<int, 8> t_int8Vec;
t_int8Vec intVectorA, intVectorB;
.
.
.
void processVecStream(hls::stream<t_int8Vec> &inVecStream1,hls::stream<t_int8Vec> &inVecStream2, hls::stream<int8Vec> &outVecStream)
{
for(int i=0;i<32;i++)
{
#pragma HLS pipeline II=1
t_int8Vec aVec = inVecStream1.read();
t_int8Vec bBec = inVecStream2.read();
//performs a vector operation on 8 integers in parallel
t_int8Vec cVec = aVec * bVec;
outVecStream.write(cVec);
}
}
如需了解更多信息,请参阅 HLS 矢量库。请参阅 GitHub 上的 Vitis-HLS-Introductory-Examples/Modeling/using_vectors 以获取示例。