摘要:如何计算矩阵乘法,这个大家都知道。通常情况下,我们都是用以下代码实现的:for(i=0;i<n;++i) for(j=0;j<n;++j){ sum=0; for(k=0;k<n;++k) sum+=A[i][k]*B[k][j]; C[i][j]+=sum;}但是考虑了高速缓存的问题后,其实有一种更好的实现方式:for(i=0;i<n;++i) for(k=0;k<n;++k){ r=A[i][k]; for(j=0;j<n;++j) C[i][j]+=r*B[k][...
阅读全文
摘要:在前一篇博客里,我们提出了三种常见的循环优化的方法,主要包括:减少不必要的计算,减少不必要的函数调用,减少不必要的内存访问。这三种方法跟特定的机器的特性无关,具有很强的通用性。今天,我们本着榨干机器最后一滴性能的原则,再进一步提出几种跟指令执行有关系的优化方法。一.循环展开循环展开可以减少循环的次数,对程序的性能带了两方面的提高。一是减少了对循环没有直接贡献的计算,比如循环计数变量的计算,分支跳转指令的执行等。二是提供了进一步利用机器特性进行的优化的机会。例子:优化前的代码见前一篇博客里的sum3.优化后:void sum4(vec_ptr v,data_t *dest){int i;int
阅读全文
摘要:一.代码移动将在循环里面多次计算,但是结果不会改变的计算,移到循环外面去。例子:优化前:void lower1(char *s){int i;for(i=0;i<strlen(s);++i) if(s[i]>='A'&&s[i]<='Z') s[i]-=('A'-'a');}优化后:void lower2(char *s){int i;int len=strlen(s);for(int i=0;i<len;++i) if(s[i]>='A'&&s[i]&
阅读全文