2

我正在使用科学计算代码。如果可能的话,我想稍微改进一下。我用放大器检查代码。最耗时(大量使用)的代码是:

double a = 0.0;
for(j = 0; j < n; j++) a += w[j]*fi[((index[j] + i)<<ldf) + k];

对我来说,它只是 w 和 fi 的点积。我想知道:

  1. 英特尔编译器会自动执行吗?(我的意思是将循环视为两个向量化数组的点积。)
  2. 有没有办法改进代码?(我的意思是可能定义另一个与 w 大小相同的数组 a1。然后所有相乘的数字都可以存储在 a1 中(展开循环?)。最后求和。)
  3. 其他建议?

我正在使用带有视觉工作室的并行作曲家 2013。任何想法都会被欣赏!:)

4

1 回答 1

2

你可以首先注意到你总是k在你的fi数组中偏移一个固定的数量......我假设它是 type double*。那么为什么不在k循环之前只偏移一次呢?

double *fik = fi + k;

事实上,你对i. 该值(index[j] + i) << ldf相当于(index[j] << ldf) + (i << ldf)。所以,你得到:

double *fik = fi + k + (i << ldf);
double a = 0.0;
for(j = 0; j < n; j++) a += w[j] * fik[ index[j]<<ldf ];

应该快一点,除非编译器已经决定为你这样做。

于 2012-10-03T03:09:25.607 回答