英特尔文档没有说明是否有例如数组的乘法和加法:
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];
OR
for(i=0; i<N; i++) c[i] = c[i] + a[i]*b[i];
对于大型阵列,存在显着的性能差异。据我所知,当使用STL向量完成这样的向量运算时,前者就完成了。
提前感谢您的答案!
答案 0 :(得分:1)
icc 12.1中的数组表示法生成了临时表达,因为这是Fortran所做的,它看起来更安全。然后我们发现,正如问题所指出的那样,临时性可以产生很大的性能影响。因此,在icc 13.0(以及public specification)中修改了数组符号,因此不会生成临时符号。
不生成临时符合C ++的“带有最小惩罚的抽象”的理念,以及C / C ++不会为结构赋值生成临时性的事实。
另见我ISC 2012 tutorial的幻灯片33。