Intel阵列表示法向量运算

时间:2013-08-12 07:19:55

标签: c intel cilk-plus

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

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向量完成这样的向量运算时,前者就完成了。

提前感谢您的答案!

1 个答案:

答案 0 :(得分:1)

icc 12.1中的数组表示法生成了临时表达,因为这是Fortran所做的,它看起来更安全。然后我们发现,正如问题所指出的那样,临时性可以产生很大的性能影响。因此,在icc 13.0(以及public specification)中修改了数组符号,因此不会生成临时符号。

不生成临时符合C ++的“带有最小惩罚的抽象”的理念,以及C / C ++不会为结构赋值生成临时性的事实。

另见我ISC 2012 tutorial的幻灯片33。