仅当循环中更新的变量为本地变量时,计算才被优化

时间:2019-01-14 07:34:21

标签: c++ vectorization compiler-optimization

对于以下功能,具有优化功能的代码被矢量化,并且计算在寄存器中执行(返回值在eax中返回)。生成的机器代码例如在这里:https://godbolt.org/z/VQEBV4

int sum(int *arr, int n) {
  int ret = 0;
  for (int i = 0; i < n; i++)
    ret += arr[i];
  return ret;
}

但是,如果我使ret全局变量(或类型为int&的参数),则不使用向量化,并且编译器在每次迭代中将更新的ret存储到内存中。机器代码:https://godbolt.org/z/NAmX4t

int ret = 0;

int sum(int *arr, int n) {
  for (int i = 0; i < n; i++)
    ret += arr[i];
  return ret;
}

我不明白为什么在后一种情况下不能进行优化(寄存器中的矢量化/计算)。没有线程,即使增量也不是原子执行的。而且,这种行为在编译器(GCC,Clang,Intel)之间似乎是一致的,因此我相信一定有原因。

1 个答案:

答案 0 :(得分:3)

如果ret不是本地而是全局的,则arr可能会别名为ret,从而减​​少了优化的机会。