0

我正在将 c++ 与 openmp 一起使用,并且担心以下两种方式在组织数据时的计算效率:

(1)

struct A
{ 
    int n;
    double v;
    double f[3];
    ....
};

struct A A_array[1000];

对比

(2)

int n[1000];
double v[1000];
double f[3][1000];
......

如果选项(2)更好,哪个for循环可能更快?

for (i=0;i<3;i++)
  for(j=0;j<1000;j++)
      { ......}

对比

for (j=0;j<1000;j++)
  for(i=0;i<3;i++)
      { ......}
4

1 回答 1

0

这实际上取决于您如何使用不同变体中的数据。单独的数组意味着如果你只使用 的f[3]一部分struct,你不会在缓存中得到“污染”,这样效率更高。另一方面,如果您正在加载nv并且f[3]每次,那么您

顺便说一句,我认为你会更喜欢double f[1000][3];f[3][1000];除非你真的使用 的数据f[x][y],其中y的变化比 更频繁x。由于其中的每个元素f相距很远[相隔 8000 字节],x因此在这种情况下经常更改会导致内存控制器和缓存严重的局部性跳跃,这肯定不会有效。

在几乎所有关于性能的问题中,细节都非常重要,你可以拥有几乎相同的数据,你可以用它们做几乎相同的事情,只需对算法或使用模式进行一些小改动就会对性能产生很大的影响。总是,总是,基准测试(并确保您启用合理级别的优化,在调试模式下编译的性能基准测试代码完全有缺陷,因为对于小块代码,速度差异可能是 10 倍)。

于 2013-06-17T14:37:27.370 回答