为什么代码的位置会影响C ++的性能?

cho*_*_uc 8 c++ performance

我正在运行测试性能,发现更改代码的顺序可以使其速度更快,而不会影响结果。

性能通过使用chrono库的时间执行来衡量。

vector< vector<float> > U(matrix_size, vector<float>(matrix_size,14));
vector< vector<float> > L(matrix_size, vector<float>(matrix_size,12));
vector< vector<float> > matrix_positive_definite(matrix_size, vector<float>(matrix_size,23));

for (i = 0; i < matrix_size; ++i) {         
   for(j= 0; j < matrix_size; ++j){
//Part II : ________________________________________
    float sum2=0;               
    for(k= 0; k <= (i-1); ++k){
      float sum2_temp=L[i][k]*U[k][j];
      sum2+=sum2_temp;
    }
//Part I : _____________________________________________
    float sum1=0;       
    for(k= 0; k <= (j-1); ++k){
      float sum1_temp=L[i][k]*U[k][j];
      sum1+=sum1_temp;
    }           
//__________________________________________
    if(i>j){
      L[i][j]=(matrix_positive_definite[i][j]-sum1)/U[j][j]; 
    }
    else{
       U[i][j]=matrix_positive_definite[i][j]-sum2;
    }   
   }
}
Run Code Online (Sandbox Code Playgroud)

我使用g++ -O3(Intel i5 / Win10中的GCC 7.4.0)进行编译。我更改了第一部分和第二部分的顺序,如果在第二部分之前执行第二部分,则会得到更快的结果。怎么回事?

这是整个程序的链接

Max*_*kin 5

我将尝试同时运行两个版本,perf stat -d <app>并查看性能计数器的区别在哪里。

进行基准测试时,您可能希望固定CPU频率,因此它不会影响您的分数。


在32字节边界上对齐循环通常可以将性能提高8-30%。有关更多详细信息请参见X86中因代码放置而导致性能不稳定的原因-Zia Ansari,英特尔

尝试使用编译代码-O3 -falign-loops=32 -falign-functions=32 -march=native -mtune=native