Openmp-C++;效率:一个结构阵列与多个阵列 我使用OpenMP的C++,并关注以下两种方式在组织数据方面的计算效率:

Openmp-C++;效率:一个结构阵列与多个阵列 我使用OpenMP的C++,并关注以下两种方式在组织数据方面的计算效率:,c,arrays,structure,openmp,performance,C,Arrays,Structure,Openmp,Performance,(一) vs (二) 若选项(2)更好,那个么哪个for循环可能更快 for (i=0;i<3;i++) for(j=0;j<1000;j++) { ......} for(i=0;i这实际上取决于您如何使用不同变体中的数据。单独的数组意味着,如果您仅使用struct的f[3]部分,则缓存中不会出现“污染”,这更有效。另一方面,如果您在n、v和f中加载[3] 每次,您 顺便说一句,我想你更喜欢double f[1000][3];而不是f[3][1000];,除非你真

(一)

vs

(二)

若选项(2)更好,那个么哪个for循环可能更快

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

for(i=0;i这实际上取决于您如何使用不同变体中的数据。单独的数组意味着,如果您仅使用
struct
f[3]
部分,则缓存中不会出现“污染”,这更有效。另一方面,如果您在
n
v
f中加载[3] 
每次,您

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

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

int n[1000];
double v[1000];
double f[3][1000];
......
for (i=0;i<3;i++)
  for(j=0;j<1000;j++)
      { ......}
for (j=0;j<1000;j++)
  for(i=0;i<3;i++)
      { ......}