我正在运行测试性能,发现更改代码的顺序可以使其速度更快,而不会影响结果。
性能通过使用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)进行编译。我更改了第一部分和第二部分的顺序,如果在第二部分之前执行第二部分,则会得到更快的结果。怎么回事?
这是整个程序的链接。
我将尝试同时运行两个版本,perf stat -d <app>
并查看性能计数器的区别在哪里。
进行基准测试时,您可能希望固定CPU频率,因此它不会影响您的分数。
在32字节边界上对齐循环通常可以将性能提高8-30%。有关更多详细信息,请参见X86中因代码放置而导致性能不稳定的原因-Zia Ansari,英特尔。
尝试使用编译代码-O3 -falign-loops=32 -falign-functions=32 -march=native -mtune=native
。