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) です。

代わりに、サイクルのプリンシパルに OpenMP プラグマを強制する gcc または clang でコンパイルした場合:

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

実行時間は、330% の CPU 時間で 3 秒に低下します。

Polly がメイン サイクルを並列化できないのはなぜですか?

4

0 に答える 0