【问题标题】:Openmp-C++ efficiency: an array of structures vs. several arraysOpenmp-C++ 效率:结构数组与多个数组
【发布时间】:2013-06-17 14:21:06
【问题描述】:

我在使用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++)
      { ......}

【问题讨论】:

    标签: c arrays structure openmp performance


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-29
      • 2011-08-03
      • 2017-04-03
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      相关资源
      最近更新 更多