此问题在此处已有答案:
Accessing elements of a matrix row-wise versus column-wise(3个答案)
14天前关闭。
void row_order (){
char A[1024][1024] = {0};
char B[1024][1024] = {0};
char C[1024][1024] = {0};
for(int i = 0 ; i<1024;i++){
for(int j = 0 ; j<1024;j++){
C[i][j] = A[i][j] * B[i][j];
}
}
}
int main() {
for(int i = 0 ; i< 1000; i++){
row_order();
}
}
==〉C[j][i] = A[j][i] * B[j][i];
通过交换C数组中的i和j变量,代码的性能提高了400%。这是什么原因?[i][j][j][i]
1条答案
按热度按时间xqk2d5yq1#
在第一种情况下,
C[i][j] = A[i][j] * B[i][j];
,您在附近位置访问内存。例如,对于
i=0
、j=0
和1
,您将访问位置接近的A[0][0]
、A[0][1]
。因此,当CPU加载A[0][0]
时,它有一些机会将A[0][0]
、A[0][1]
、A[0][2]
...后面的值放入缓存。在第二种情况下,
C[j][i] = A[j][i] * B[j][i];
,您访问存储器在遥远位置例如,对于
i=0
、j=0
和1
,您将访问位置较远的A[0][0]
和A[1][0]
。因此,当CPU加载A[0][0]
时,它没有机会同时加载将在您可以在此处进行测试:tio.run
其行为与
int
相同(减少数组大小)。关于缓存的一些阅读:
请注意,使用
-O2
选项,您的代码将更快,因为它可以被优化,请尝试在www.example.com查看它godbolt.org