矢量访问速度比矩阵访问快吗?

时间:2012-07-30 15:03:23

标签: gcc compilation g++

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

我尝试了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)占案例1和3的2倍。案例3比案例1快一点。 我在我的C ++编译器(g ++)中使用-O2参数

我能理解为什么矢量比矩阵更快:(但我会喜欢一些解释)。 但是我无法理解为什么案例3比案例1更快,我想象乘法过程会使事情变慢并且不会使事情变得更快。 我不明白为什么,即使差异是0.002(可能是时间和处理器使用时间(我想))

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

矢量通常更快?

由于

1 个答案:

答案 0 :(得分:1)

案例2最慢的原因是因为它有一个更多的间接层。

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

1和3之间的差异非常小。摆弄优化选项已经产生了不同,所以在这里,没有人能够通过了解您正在使用的确切机器给出肯定的答案。这里最好的(也是唯一合理的)方法是查看生成的汇编程序代码。一个原因可能是在一个版本中你的循环变量很长,而在另一个版本中没有(因此你在那里进行元素地址计算),这取决于你的cpu,这可能会有所不同。

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