[Bug libgomp/103976] New: Very large overhead for if(false) openmp pragmas
nickpapior at gmail dot com
gcc-bugzilla@gcc.gnu.org
Tue Jan 11 09:12:43 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103976
Bug ID: 103976
Summary: Very large overhead for if(false) openmp pragmas
Product: gcc
Version: 11.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libgomp
Assignee: unassigned at gcc dot gnu.org
Reporter: nickpapior at gmail dot com
CC: jakub at gcc dot gnu.org
Target Milestone: ---
In OpenMP it may be beneficial to not use OpenMP in a region given that the
calculated workload is very small.
Something like this:
test.c:
#include <stdio.h>
int main(int narg, char args[]) {
float sum = 0.;
int i, j;
for ( i = 1 ; i<=100000000 ; i++) {
#ifdef _OPENMP
#pragma omp parallel for private(j) reduction(+:sum) if(0)
#else
// Just to have something that resembles the omp-if
if ( sum >= -1. ) {
#endif
for (j = 1 ; j<= 10 ; j++)
sum += 1./j;
#ifndef _OPENMP
}
#endif
}
printf("%15.7e\n", sum);
}
Never mind the faulty results, the idea is the culprit here.
I get the following timings:
gcc -O3 -o a.out test.c && time ./a.out
./a.out 1.60s user 0.00s system 99% cpu 1.604 total
gcc -O3 -o a.out test.c -fopenmp && time ./a.out
./a.out 9.13s user 4.62s system 99% cpu 13.743 total
Fortran has the same behaviour.
test.F90:
program main
real :: sum
integer :: i, j
sum = 0.
do i = 1, 100000000
#ifdef _OPENMP
!$OMP parallel do private(j) reduction(+:sum) if(.false.)
#else
! Just to have something that resembles the omp-if
if ( sum >= -1. ) then
#endif
do j = 1, 10
sum = sum + 1./j
end do
#ifdef _OPENMP
!$OMP end parallel do
#else
end if
#endif
end do
print *, sum
end program main
The complexity of adding the explicit if's was to emulate an if statement as
inserted in the openmp code. I know that openmp has lots more boiler plate
code, but this still seems awfully slow for me.
This came up in a sparse matrix solution library (MUMPS) which uses the #pragma
omp ... if(workload_huge) to decide on paths.
Let me know if anything else is necessary.
More information about the Gcc-bugs
mailing list