Openmp-C ++效率:一组结构与几个数组

时间:2013-06-17 14:21:06

标签: c arrays structure openmp performance

我在openmp中使用c ++,并且关注以下两种组织数据的计算效率:

(1)

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

struct A A_array[1000];

VS

(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++)
      { ......}

VS

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

1 个答案:

答案 0 :(得分:0)

这实际上取决于您如何使用不同变体中的数据。单独的数组意味着如果您只使用f[3]的{​​{1}}部分,则缓存中不会出现“污染”,这会更有效。另一方面,如果您每次都加载structnv,那么您

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

在几乎所有关于性能的问题中,DETAILS非常重要,你可以拥有几乎相同的数据,你几乎使用相同的东西,只有一些算法或使用模式的微小变化将对性能产生巨大影响。永远,始终,基准(并确保您启用合理的优化级别,在调试模式下编译的性能基准测试代码是完全和完全缺陷的,因为对于小块代码,差异可以是速度的10倍)。