最近在利用HLS实现卷积计算,仿真阶段计算结果出现了一点问题,计算结果只是无序间隔出错,而不是连续的一块数据出错,检查代码后,发现并没有语法错误或者数组index错误,算法上也不存在问题。
在对比以前在VS上写的卷积代码后发现了一个不容易察觉的问题:数组初始化
以下是在VS2017上定义一个数组并初始化的代码:
int main()
{
int arr[4][4] = {0};
return 0;
}
通过这个方式,VS编译器会自动对未初始化的数组元素进行0初始化。
然而,在vivado HLS 2018.2利用上述方式初始化数组:
#include "ap_int.h"
typedef ap_int<32> D32
int main()
{
D32 out[6][24][24] = {0};
for(int k = 0; k < 6; k++){ // 打印验证
for(int i = 0; i < 24; i++){
for(int j = 0; j < 24; j++){
cout << out[k][i][j] << ", ";
}
cout << endl;
}
cout << endl;
}
return 0;
}
数组初始化打印结果如下图,可以看到,并不是所有元素都被初始化为0,因此在传入函数时,如果函数内没有对该数组元素进行初始化,则会出现意想不到的错误。
因此,为安全起见,定义的局部数组建议手动用循环初始化。