我使用的芯片是msp430fr5992,开发环境是IAR7.10.
我的项目中用到了矩阵的运算,并且数据类型为float,直接用c代码写的矩阵乘法(result=float*float+float*float........)太耗时,本来想使用LEA功能来提高运算效率,但是最近看了看TI提供的MSP_DSPLIB里面的关于矩阵计算的API以及例程,入参都是定点数啊,有没有什么好的办法能实现快速float类型的矩阵运算(加法、减法、乘法)。
我刚刚按照把 float 矩阵扩大N倍后取整再带入矩阵乘法的API计算,再把返回的结果缩小N*N倍,虽然计算的结果是正确的,但是耗时比用float直接乘加还多了1倍多。所以这个方法不行,时间主要开销在了计算前后数据的扩大和缩小上了。与需求相违背。我测试的矩阵大小是2*4和4*2。代码如下:
DSPLIB_DATA(result1,4)
_iq31 result1[2][2];
DSPLIB_DATA(inputAA,4)
_iq31 inputAA[2][4];
DSPLIB_DATA(inputBB,4)
_iq31 inputBB[4][2];
float re[2][2],re1[2][2] ;
#define QQ31 2147483648
void test_LEA(void)
{
msp_status status;
msp_matrix_add_q15_params addParams;
msp_matrix_sub_q15_params subParams;
msp_matrix_mpy_q15_params mpyParams;
msp_matrix_mpy_iq31_params mpyParams31;
float a[2][4],b[4][2];
uchar i,j;
//入参矩阵赋值
a[0][0]=0.034545; a[0][1]=0.065063;a[0][2]=0.004028;a[0][3]=0;
a[1][0]=0.034545; a[1][1]=0.004028;a[1][2]=0.004028;a[1][3]=0;
b[0][0]=0.006072; b[0][1]=0.009124;
b[1][0]=0.001007;b[1][1]=0.001342;
b[2][0]=0.001678; b[2][1]=0.002014;
b[3][0]=0;b[3][1]=0;
//数据扩大
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
{inputAA[i][j]=(long)(a[i][j]*10000000000);}
}
for(i=0;i<4;i++)
{
for(j=0;j<2;j++)
{inputBB[i][j]=(long)(b[i][j]*10000000000);}
}
//设置参数及调用矩阵乘法API
mpyParams31.srcARows = 2;
mpyParams31.srcACols = 4;
mpyParams31.srcBRows = 4;
mpyParams31.srcBCols = 2;
status =msp_matrix_mpy_iq31(&mpyParams31, *inputAA, *inputBB, *result1);
//返回结果转为float 再缩小
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{re[i][j]=result1[i][j];}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{re[i][j]=re[i][j]*QQ31/10000000000/10000000000;}
}
CSN_0;
//下面是直接计算的代码
re1[0][0]= a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]+a[0][3]*b[3][0];
re1[0][1]= a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1]+a[0][3]*b[3][1];
re1[1][0]= a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0]+a[1][3]*b[3][0];
re1[1][1]= a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1];
}
时间分布如下:
1.两个float型入参扩大用了460us,
2.调用矩阵乘法API计算用了112us(使用LEA功能)
3.对API返回结果经行缩小用了480us
而直接用result=float*float+float*float......的方式写的代码用时为460us。
备注:我的单片机MCLK为21MHz(用的是内部的DOC)
希望有知道能够实现快速float型矩阵乘法运算方法的高手指点一下,不胜感激。