2

英特尔文档没有说明是否有,例如数组的乘法和加法:

c[:] = c[:] + a[:]*b[:]

它会执行以下操作:

for(i=0; i<N; i++) tmp[i] = a[i]*b[i];
for(i=0; i<N; i++) c[i] = c[i] + tmp[i];

或者

for(i=0; i<N; i++) c[i] = c[i] + a[i]*b[i];

对于大型阵列,存在显着的性能差异。据我所知,当使用 STL 向量完成此类向量运算时,前者已完成。

预先感谢您的回答!

4

1 回答 1

1

icc 12.1 中的数组表示法生成了临时值,因为这是 Fortran 所做的,而且看起来更安全。然后我们发现,正如问题所指出的那样,临时人员会对性能产生很大的影响。因此数组符号在 icc 13.0(和公共规范)中进行了修改,因此不会生成临时符号。

不生成临时对象符合 C++ 的“以最小代价进行抽象”的理念,以及 C/C++ 不为结构分配生成临时对象的事实。

另请参阅我的ISC 2012 教程的幻灯片 33 。

于 2013-08-13T14:33:40.763 回答