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 がメイン サイクルを並列化できないのはなぜですか?