2

我尝试使用 llvm 和 polly 编译以下简单代码。

main() {
  ...
  for(i=1; i<N-1; i++) {
    for(j=1; j<N-1; j++) {
      B[i][j] = median(i,j);
    }
  }
  ...
}

int median(int i, int j) {
  float median_v[9];
  int di, dj, m;
  m=0;
  for(di=-1; di<=1; di++) {
    for(dj=-1; dj<=1; dj++) {
      median_v[m++] = A[i+di][j+dj];
    }
  }      
  qsort(median_v, 9, sizeof(float), cmp);
  return median_v[4];    
}

使用:

> clang -O3 -mllvm -polly -mllvm -polly-parallel -lgomp median.c

但执行时间为 12 秒,CPU 时间为 99%(N=5000)。

相反,如果使用 gcc 或 clang 强制 OpenMP pragma on principal for cycle 编译:

...
#pragma omp parallel for collapse(2)
for(i=1; i<N-1; i++) {
...

执行时间下降到 3 秒,CPU 时间为 330%。

为什么 Polly 不能并行化主循环?

4

0 回答 0