分块矩阵乘法的程序性能
实验四 分块矩阵乘法的程序性能
一、实验目的
本次实验比较分块矩阵乘法与普通矩阵乘法的性能,并考察分块大小对分块矩阵乘法性能的影响。
二、实验原理 1、 矩阵相乘
为简单起见,本次实验矩阵相乘中的矩阵都是方阵,行数和列数都为 n 。
2、 程序性能
本次实验中考察的程序性能指的是程序的CPU 执行时间。在C 语言程序中,可以考虑利用clock()函数来计算某段代码执行的CPU 时间。
注意,clock()的精度为1ms ,对于比较小的矩阵相乘,可能精度不够。如果需要使用高精度的计时方法,可以考虑利用CPU 内的实时时钟计数器(RTSC ),或性能计数器(Performance Counter)。
3、分块矩阵乘法
1、普通矩阵乘法是采用三层循环完成,如下图所示。
2、分块的矩阵乘法为了利用局部性提高Cache (高速缓存)利用率,采用了如下所示代码。
请编写普通矩阵乘法和分块矩阵乘法的实验和测试代码,记录实验结果。 另外,本次实验还需要研究不同分块大小对性能的影响,请编写相应的实验和测试代码,并记录实验结果。
三、实验步骤
void mmm (double * a , double * b , double * c , int n ) { }
void mmm2(double * a , double * b , double * c , int n ) {
const int B = 10; int i , j , k ; int i1, j1, k1;
for (i = 0; i
for (j = 0; j
for (k = 0; k
for (i1 = i ; i1
for (j1 = j ; j1
for (k1 = k ; k1
c [i1 * n + j1] += a [i1 * n + k1] * b [k1 * n + j1];
int i , j , k ;
for (i = 0; i
for (j = 0; j
for (k = 0; k
c [i * n + j ] += a [i * n + k ] * b [k *n + j ];
}
inline double compute_time(clock_t begin , clock_t end ) { }
int main () { }
clock_t start = clock (); mmm (a , b , c , n );
std ::cout
std ::cout
double * a = (double *)malloc (sizeof (double )* n * n ); double * b = (double *)malloc (sizeof (double )* n * n ); double * c = (double *)malloc (sizeof (double )* n * n ); memset (a , 0, sizeof (double ) * n * n ); memset (b , 0, sizeof (double ) * n
* n ); memset (c , 0, sizeof (double ) * n * n );
return static_cast(static_cast((end - begin )) / static_cast(CLOCKS_PER_SEC));
}
}
}
}
四、实验结果
1、N = 50和N=100时,结果如下图所示:
2、N = 150和N=200时,结果如下图所示:
3、N=250和N=300时,结果如下图所示:
4、N=350和N=400时,结果如下图所示:
5、N=450和N=500时,结果如下图所示:
6、N=550和N=600时,结果如下图所示:
7、N=650和N=700时,结果如下图所示:
8、N=750和N=800时,结果如下图所示:
9、N=850和N=900时,结果如下图所示:
10、N=950和N=1000时,结果如下图所示:
五、结果分析
3、由上图可看出,分块算法比普通算法执行的CPU 时间明显缩短了,分块算法更为实用。
六、实验感想
通过本次实验了解了不同算法执行的CPU 时间之间的差别。