我在AM572x EVM的c66xDSP上编写程序,发现循环内自己编写的矩阵乘法程序非常耗时,整个循环大概用了40s,于是找到DSPLIB中对应的矩阵乘法函数
void DSPF_sp_mat_mul (float *x1, const int r1, const int c1, float *x2, const int c2, float *restrict y);
我将该函数替代我自己编写的矩阵乘法函数brmul(),再次运行代码,整个循环依旧耗时40s,按照我的假设,DSPLIB应该是有硬件优化的,那为什么在耗时上并没有体现呢?另外,我在PC端调用这段代码耗时都不超过40S,而DSP又是专门用于计算的,请问谁能给我解释一下我的问题出现在哪里呢?
Shine:
dsplib是经过优化的库。
请问你的代码是在哪里运行的?片上RAM还是DDR3?如果放在DDR3,需要使能cache和EDMA提高性能。
bin xu7:
回复 Shine:
我是在AM572x SDK中的IPC例子中修改的,不是很清楚代码是在哪里运行的,假如我是在DDR3中运行的,请问我该如何使能cache和EDMA?是否有参考文档的链接?
Denny%20Yang99373:
回复 bin xu7:
使能cache就是把程序和数据的地址范围CACHE MAR打开,速度会提高跟多
yongqing wang:
按道理DSP加速的应该会更快,应为DSP至少有偶硬件乘法器,可能你的循环中还有别的比较耗时
bin xu7:
回复 yongqing wang:
我发现了耗时所在问题,但确不明白为什么这样,我的循环如下:
for(i2=0; i2<Right_height; i2=i2+Jnumber) {for(j2=0; j2<Right_width; j2=j2+Jnumber){double rx,ry;uvToUndistortedUV(j2+1,i2+1,u20,v20,du2,dv2,f2,k21,k22,k23,k24,&rx,&ry);//得到极线的各系数,并存在m2F中m2[0] = rx;m2[1] = ry;//m2[0] = 1; //m2[1] = 1;m2[2] = 1; //DSPF_sp_mat_mul(R2,3,3,m2,2,m2F);brmul(m2,R2,1,3,3,m2F);//m2F对应于左相机图uv坐标 } }我的循环中调用了两个函数,当我第二个矩阵乘法函数brmul()的输入m2与去畸变函数uvToUndistortedUV()的输出没有关联时,整个循环的耗时不超过1s,而如代码所示,若m2与uvToUndistortedUV()的输出rx,ry相关联时,整个循环耗时多达40s,这让我很疑惑,我并没有使用并行编程,不应该会差别如此之大。
bin xu7:
回复 bin xu7:
我的循环中调用了两个函数,当我第二个矩阵乘法函数brmul()的输入m2
与去畸变函数uvToUndistortedUV()的输出没有关联时,整个循环的耗时
不超过1s,而如代码所示,若m2与uvToUndistortedUV()的输出rx,ry相关联时,整个循环耗时多达40s,这让我很疑惑,我并没有使用并行编程,不应该会差别如此之大。