关于IPP 矩阵乘法的performance的一点研究
在前面的帖子中,youxia000提出了Ippmul_mv_64f的效率问题研究。针对他的问题,我做了一系列的测试。
下面我将列出我的一些测试结果,权当抛砖引玉。
测试代码:
我主要测试了4种代码,都是实现矩阵与向量的乘法,矩阵的大小都是4×4,向量为4×1,由于单次运算时间较短,我让每种运算都循环执行1000000 次。
代码段中,a是矩阵,b是向量,矩阵a可以用二维数组或者一维数组表达
1) a是二维数组
for(int j=0;j<4;j++)
for(int k=0;k<4;k++)
result[j] += b[k] * a[j][k];
2> a是一维数组
for (i = 0; i < N; i++) {
for (j=0; j<N; j++) {
result[i] += a[N*i+j] * b[j];
}
}
3> a是二维数组,同时将<1>中的for循环展开
Result[0] = b[0] * a[0][0] + b[1] * a[0][1] + b[2] * a[0][2] + b[3] * a[0][3];
Result[1] = b[0] * a[1][0] + b[1] * a[1][1] + b[2] * a[1][2] + b[3] * a[1][3];
Result[2] = b[0] * a[2][0] + b[1] * a[2][1] + b[2] * a[2][2] + b[3] * a[2][3];
Result[3] = b[0] * a[3][0] + b[1] * a[3][1] + b[2] * a[3][2] + b[3] * a[3][3];
4>IPP实现mv乘法,IPP中a只能是一维数组
IppStatus status = ippmMul_mv_64f((const Ipp64f*) a, src1Stride1, src1Stride2,
src1Width, src1Height, (const Ipp64f*) b, src2Stride2,
src2Len, result, dstStride2);