gpt4 book ai didi

c++ - 为什么内存访问这么慢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:07:37 24 4
gpt4 key购买 nike

我遇到了与内存访问有关的非常奇怪的性能问题。代码片段是:

#include <vector>
using namespace std;

vector<int> arrx(M,-1);
vector< vector<int> > arr(N,arrx);

...
for(i=0;i<N;i++){
for(j=0;j<M;j++){
//>>>>>>>>>>>> Part 1 <<<<<<<<<<<<<<
// Simple arithmetic operations
int n1 = 1 + 2; // does not matter what (actually more complicated)
// Integer assignment, without access to array
int n2 = n1;

//>>>>>>>>>>>> Part 2 <<<<<<<<<<<<<<
// This turns out to be most expensive part
arr[i][j] = n1;
}
}

N 和 M - 是 1000 - 10000 左右的一些常数。当我编译此代码(发布版本)时,如果第 2 部分被注释,大约需要 15 个时钟来完成它。对于这部分,执行时间上升到 100+ 个时钟,因此慢了将近 10 倍。我希望赋值操作比简单的算术操作便宜得多。如果我们不使用数组,这实际上是正确的。但是对于那个数组,分配似乎要昂贵得多。我还尝试了 1-D 数组而不是 2-D - 结果相同(2D 显然更慢)。我还使用了 int** 或 int* 而不是 vector< vector< int >> 或 vector< int > - 结果还是一样。

为什么我在数组赋值中的表现如此糟糕,我可以修复它吗?

编辑:另一个观察:在给定代码的第 2 部分中,如果我们将赋值从

更改为
arr[i][j] = n1;  // 172 clocks

n1 = arr[i][j];  // 16 clocks

速度(评论中的数字)上升。更有趣的是,如果我们改变这一行:

arr[i][j] = n1; // 172 clocks

arr[i][j] = arr[i][j] * arr[i][j]; // 110 clocks

速度也高于简单分配从内存读取和写入内存有什么区别吗?为什么我会得到如此奇怪的表现?

提前致谢!

最佳答案

你的假设真的是错误的...

  1. 写入主内存比做一个简单的加法要慢得多。
  2. 如果你不写,那就是很可能会完全优化循环。

关于c++ - 为什么内存访问这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8918923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com