我在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++)
{ ......}
答案 0 :(得分:0)
这实际上取决于您如何使用不同变体中的数据。单独的数组意味着如果您只使用f[3]
的{{1}}部分,则缓存中不会出现“污染”,这会更有效。另一方面,如果您每次都加载struct
,n
和v
,那么您
顺便说一下,我认为您更喜欢f[3]
而不是double f[1000][3];
,除非您确实使用f[3][1000];
的数据,其中f[x][y]
的变化频率高于y
1}}。由于x
中的每个元素相距很远[相隔8000个字节],因此在这种情况下经常更改f
会导致内存控制器的严重局部性跳跃。缓存,肯定不会有效。
在几乎所有关于性能的问题中,DETAILS非常重要,你可以拥有几乎相同的数据,你几乎使用相同的东西,只有一些算法或使用模式的微小变化将对性能产生巨大影响。永远,始终,基准(并确保您启用合理的优化级别,在调试模式下编译的性能基准测试代码是完全和完全缺陷的,因为对于小块代码,差异可以是速度的10倍)。