嵌套for循环中的性能计算[duplicate]

tcomlyy6  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(127)

此问题在此处已有答案

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]

xqk2d5yq

xqk2d5yq1#

在第一种情况下,C[i][j] = A[i][j] * B[i][j];,您在附近位置访问内存。
例如,对于i=0j=01,您将访问位置接近的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=0j=01,您将访问位置较远的A[0][0]A[1][0]。因此,当CPU加载A[0][0]时,它没有机会同时加载将在
您可以在此处进行测试:tio.run
其行为与int相同(减少数组大小)。
关于缓存的一些阅读:

请注意,使用-O2选项,您的代码将更快,因为它可以被优化,请尝试在www.example.com查看它godbolt.org

相关问题