【问题标题】:Is vector access faster than matrix access?向量访问比矩阵访问快吗?
【发布时间】:2012-07-30 15:03:23
【问题描述】:

我创建了一个非常简单的代码来了解向量访问是否比矩阵访问更快。

我尝试了 3 件事:

1:创建一个包含 100.000.000 个 int 元素的向量:

int *matrix=(int*)malloc(sizeof(int)*100000*1000)
for(long int=x;x<100000*1000;x++)matrix[x]=1;

2:创建一个大小相同的矩阵:

int ** matrix=(int**)malloc(sizeof(int*)*100000);
for(long int=0; x<100000;x++){
   matrix[x]=(int*)malloc(sizeof(int*)*1000);
}
for(int x=0; x<100000;x++){
   for(int y=0;y<1000;y++){
     matrix[x][y]=1;
   }
}

3:创建相同的向量,但在其中写入矩阵

for(int x=0; x<100000;x++){
   for(int y=0;y<1000;y++){
     matrix[(x*1000)+y]=1;
   }
}

总是矩阵访问(CASE 2)需要 2 倍于案例 1 和 3。案例 3 比案例 1 快一点。 我在我的 C++ 编译器 (g++) 中使用 -O2 参数

我可以理解为什么向量比矩阵更快:(但我会喜欢一些解释)。 但我不明白为什么案例 3 比案例 1 快,我想乘法过程会减慢很多事情,而不是让它更快。 我不明白为什么,即使差异是 0.002(可能是时间和当时的处理器使用情况(我想))

如果我在没有优化的情况下编译所有 3 个案例,案例 2 比案例 1 慢,案例 3。 因此,如果没有优化过程,情况 1 会更快。

Vector 通常更快?

谢谢

【问题讨论】:

    标签: gcc compilation g++


    【解决方案1】:

    案例 2 最慢的原因是因为它多了一层间接性。

    在情况 1 和 3 中,您从内存中获取所需的元素。而在情况 2 中,您首先必须从内存中获取行/列数组的地址,然后才能从所需元素中获取。在现代计算机中,内存访问是最昂贵的操作(就执行而言),难怪它要慢得多。

    1 和 3 的差异正如预期的那样非常小。摆弄优化选项已经产生了影响,因此在这里没有人可以在知道您使用的确切机器的情况下给您一个明确的答案。这里最好的(也是唯一合理的)方法是查看生成的汇编代码。一个原因可能是在一个版本中您的循环变量很长,而在另一个版本中则不是(因此您在那里进行元素地址计算),这取决于您的 CPU,这可能会有所不同。

    编辑:你的措辞选择得很糟糕,因为没有矩阵内存访问。记忆总是平坦的。矩阵寻址只是您放在顶部的“虚拟”寻址(直接像您在 3 中所做的那样)或间接(通过使用例如为您完成它的不同语言,例如 fortran)。因此,您或多或少可以区分矩阵的不同内存布局。在 3 中,您将矩阵作为矩阵中的一大块,而在 2 中,您将其逐行/逐列地保存在内存中,其缺点是它多了一层间接性(但有优点是您可以更快地执行某些操作,例如交换到行,并且对于垃圾收集器可能更好)。还有许多其他方法可以将矩阵存储在内存中(尤其是如果您必须处理稀疏矩阵)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 2013-05-14
      • 2017-12-05
      • 2019-04-07
      • 2021-09-24
      • 2019-06-14
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多