我尝试使用 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 不能并行化主循环?