相关疑难解决方法(0)

在迭代2D数组时,为什么循环的顺序会影响性能?

可能重复:
这两个for循环中的哪一个在时间和缓存性能方面更有效

下面是两个几乎相同的程序,除了我切换ij变量.它们都运行在不同的时间.有人能解释为什么会这样吗?

版本1

#include <stdio.h>
#include <stdlib.h>

main () {
  int i,j;
  static int x[4000][4000];
  for (i = 0; i < 4000; i++) {
    for (j = 0; j < 4000; j++) {
      x[j][i] = i + j; }
  }
}
Run Code Online (Sandbox Code Playgroud)

版本2

#include <stdio.h>
#include <stdlib.h>

main () {
  int i,j;
  static int x[4000][4000];
  for (j = 0; j < 4000; j++) {
     for (i = 0; i < 4000; i++) {
       x[j][i] = i …
Run Code Online (Sandbox Code Playgroud)

c optimization performance for-loop cpu-cache

350
推荐指数
6
解决办法
4万
查看次数

矩阵乘法:矩阵大小差异小,时序差异大

我有一个矩阵乘法代码,如下所示:

for(i = 0; i < dimension; i++)
    for(j = 0; j < dimension; j++)
        for(k = 0; k < dimension; k++)
            C[dimension*i+j] += A[dimension*i+k] * B[dimension*k+j];
Run Code Online (Sandbox Code Playgroud)

这里,矩阵的大小由表示dimension.现在,如果矩阵的大小是2000,运行这段代码需要147秒,而如果矩阵的大小是2048,则需要447秒.所以虽然差别没有.乘法是(2048*2048*2048)/(2000*2000*2000)= 1.073,时间上的差异是447/147 = 3.有人可以解释为什么会发生这种情况吗?我预计它会线性扩展,但这不会发生.我不是要尝试制作最快的矩阵乘法代码,只是试图理解它为什么会发生.

规格:AMD Opteron双核节点(2.2GHz),2G RAM,gcc v 4.5.0

程序编译为 gcc -O3 simple.c

我也在英特尔的icc编译器上运行了这个,并看到了类似的结果.

编辑:

正如评论/答案中所建议的那样,我运行了维度= 2060的代码,需要145秒.

继承完整的计划:

#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>

/* change dimension size as needed */
const int dimension = 2048;
struct timeval tv; 

double timestamp()
{
        double t;
        gettimeofday(&tv, NULL);
        t = tv.tv_sec + (tv.tv_usec/1000000.0); …
Run Code Online (Sandbox Code Playgroud)

c algorithm performance matrix-multiplication

74
推荐指数
5
解决办法
1万
查看次数

用于迭代2D数组的嵌套循环的哪种排序更有效

在时间(缓存性能)方面,嵌套循环在迭代2D阵列中的哪一个排序更有效?为什么?

int a[100][100];

for(i=0; i<100; i++)
{
   for(j=0; j<100; j++)
   {
       a[i][j] = 10;    
   }
}
Run Code Online (Sandbox Code Playgroud)

要么

for(i=0; i<100; i++)
{
   for(j=0; j<100; j++)
   {
      a[j][i] = 10;    
   }
}
Run Code Online (Sandbox Code Playgroud)

c performance for-loop cpu-cache

72
推荐指数
5
解决办法
7078
查看次数

c ++ 2d数组访问速度根据[a] [b]顺序变化?

可能重复:
为什么我的程序在完全循环8192个元素时会变慢?

我一直在修补一个程序,我用它来简单地总结一个二维数组的元素.一个错字导致了至少在我看来,一些非常奇怪的结果.

处理数组时,矩阵[SIZE] [SIZE]:

for(int row = 0; row < SIZE; ++row)
    for(int col = 0; col < SIZE; ++col)
        sum1 += matrix[row][col];
Run Code Online (Sandbox Code Playgroud)

运行得非常快,但上面的行sum1 ...被修改:

sum2 += matrix[col][row]
Run Code Online (Sandbox Code Playgroud)

正如我在没有意识到的情况下偶然做过的那样,我注意到我的运行时间显着增加.为什么是这样?

c++ arrays multidimensional-array

11
推荐指数
2
解决办法
4303
查看次数

缓存内存如何工作?

今天我在计算机组织课上,老师谈到了一些有趣的事情.谈到为什么缓存有效时,他说:

for (i=0; i<M; i++)
   for(j=0; j<N; j++)
      X[i][j] = X[i][j] + K; //X is double(8 bytes)
Run Code Online (Sandbox Code Playgroud)

用第二行改变第一行是不好的.你对此有何看法?为什么会这样?

c optimization caching computer-architecture

9
推荐指数
3
解决办法
5842
查看次数