autoconf
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: detection and support of OpenMP


From: Bruno Haible
Subject: Re: detection and support of OpenMP
Date: Thu, 17 May 2007 23:19:09 +0200
User-agent: KMail/1.5.4

Paul Eggert wrote:
> > It's needed for compiling and for linking. As far as I can tell, it's not
> > needed for preprocessing, since <omp.h> is found in the compiler's search
> > path anyway.
> 
> Thanks, but earlier you mentioned the _OPENMP macro -- is that defined
> by <omp.h>, or is it predefined by cpp?

It is predefined by cpp.

> I just now checked <http://docs.hp.com/en/B3901-90012/ch08s05.html>

That doc is based on OpenMP 1.0; the current version of the standard is 2.5.

> If so, OPENMP_CFLAGS needs to be put into CPPFLAGS too, and the problem needs
> to be documented.

Indeed. It's rare that someone will want to preprocess a source file with
ifdefs specific to OpenMP, but in theory it can happen.

> > When an app doesn't use OpenMP (i.e. contains no #pragma omp and no use of
> > <omp.h>), compiling with -fopenmp has no effect on the generated code.
> 
> In this case, I don't see the downside of having 'configure'
> manipulate CC, CFLAGS, and/or CPPFLAGS to use the -fopenmp option
> uniformly for all compiles.

The downside is program startup time and memory use. If $OPENMP_CFLAGS is
added to the $CFLAGS, all programs of the package will be linked with an
extra shared library or two (also -lpthread!) and therefore
   1. start more slowly,
   2. consume more memory in RAM.
Really, when I need OpenMP only in msgmerge, I don't want to make msgfmt and
xgettext start more slowly.

Find attached an updated patch, taking into account your remark and one of
Ralf's remarks.

Bruno


2007-05-17  Bruno Haible  <address@hidden>

        * lib/autoconf/c.m4 (AC_C_OPENMP): New macro.
        * doc/autoconf.texi (C Compiler): Document AC_C_OPENMP.
        * NEWS: Mention AC_C_OPENMP.

*** NEWS        14 May 2007 16:54:55 -0000      1.428
--- NEWS        17 May 2007 21:16:16 -0000
***************
*** 1,5 ****
--- 1,7 ----
  * Major changes in Autoconf 2.61b (????-??-??)
  
+ ** New macro AC_C_OPENMP.
+ 
  ** AC_C_BIGENDIAN now supports universal binaries a la Mac OS X.
  
  ** AC_C_RESTRICT now prefers to #define 'restrict' to a variant spelling
*** doc/autoconf.texi   14 May 2007 16:54:55 -0000      1.1154
--- doc/autoconf.texi   17 May 2007 21:16:24 -0000
***************
*** 6593,6598 ****
--- 6593,6624 ----
  if it accepts one of those, otherwise define @code{inline} to be empty.
  @end defmac
  
+ @defmac AC_C_OPENMP
+ @acindex{C_OPENMP}
+ @cvindex _OPENMP
+ OpenMP (@url{http://www.openmp.org/}) is an extension of the C language
+ that makes it possible to optimize programs for Shared Multiprocessing
+ architectures, such as multi-core CPUs, with very small effort.
+ 
+ The macro @code{AC_C_OPENMP} sets the variable @code{OPENMP_CFLAGS} to the
+ C compiler flags needed for supporting OpenMP.  If the compiler already
+ supports OpenMP or if it has no way to activate OpenMP support,
+ @code{OPENMP_CFLAGS} is set to empty.  Also, the user can reject OpenMP
+ support if it is not the default, by invoking @samp{configure} with the
+ @samp{--disable-openmp} option; then @code{OPENMP_CFLAGS} is set to empty
+ as well.
+ 
+ The @code{OPENMP_CFLAGS} need to be used when compiling programs, when
+ preprocessing program source, and when linking programs.  Therefore you
+ need to add them to the @code{CFLAGS} and @code{CPPFLAGS} of your programs
+ that use OpenMP.  The presence of OpenMP support at compile time is revealed
+ by the preprocessor macro @code{_OPENMP}.
+ 
+ Linking a program with @code{OPENMP_CFLAGS} typically adds one more shared
+ library to the program's dependencies, therefore its use is recommended only
+ on programs that actually use code conditional on @code{#ifdef _OPENMP}.
+ @end defmac
+ 
  @defmac AC_C_CHAR_UNSIGNED
  @acindex{C_CHAR_UNSIGNED}
  @cvindex __CHAR_UNSIGNED__
*** lib/autoconf/c.m4   14 May 2007 16:54:55 -0000      1.247
--- lib/autoconf/c.m4   17 May 2007 21:16:25 -0000
***************
*** 1841,1843 ****
--- 1841,1943 ----
      fi
    fi
  ])
+ 
+ 
+ # AC_C_OPENMP
+ # -----------
+ # Check which options need to be passed to the C compiler to support OpenMP.
+ # Set the OPENMP_CFLAGS variable to these options.
+ # The options are necessary at compile time (so the #pragmas are understood)
+ # and at link time (so the appropriate library is linked with).
+ # This macro takes care to not produce redundant options if $CC $CFLAGS 
already
+ # supports OpenMP. It also is careful to not pass options to compilers that
+ # misinterpret them; for example, most compilers accept "-openmp" and create
+ # an output file called 'penmp' rather than activating OpenMP support.
+ AC_DEFUN([AC_C_OPENMP],
+ [
+   AC_MSG_CHECKING([whether to use OpenMP])
+   AC_ARG_ENABLE(openmp,
+     [AS_HELP_STRING([--disable-openmp], [do not use OpenMP])],
+     [],
+     [enable_openmp=yes])
+   AC_MSG_RESULT([$enable_openmp])
+   OPENMP_CFLAGS=
+   if test "$enable_openmp" = yes; then
+     AC_MSG_CHECKING([for $CC option to support OpenMP])
+     AC_CACHE_VAL([ac_cv_prog_cc_openmp], [
+       ac_cv_prog_cc_openmp=unsupported
+       AC_LINK_IFELSE([
+ #ifndef _OPENMP
+  choke me
+ #endif
+ #include <omp.h>
+ int main () { return omp_get_num_threads (); }
+         ], [ac_cv_prog_cc_openmp="none needed"])
+       if test "$ac_cv_prog_cc_openmp" = unsupported; then
+         dnl Try these flags:
+         dnl   GCC >= 4.2           -fopenmp
+         dnl   SunPRO C             -xopenmp
+         dnl   Intel C              -openmp
+         dnl   SGI C, PGI C         -mp
+         dnl   Tru64 Compaq C       -omp
+         dnl   IBM C (AIX, Linux)   -qsmp=omp
+         for brand in GCC SunPRO Intel SGI/PGI Compaq IBM; do
+           case $brand in
+             GCC)
+               ac_conditional='defined __GNUC__'
+               ac_option='-fopenmp' ;;
+             SunPRO)
+               ac_conditional='defined __SUNPRO_C || defined __SUNPRO_CC'
+               ac_option='-xopenmp' ;;
+             Intel)
+               ac_conditional='defined __INTEL_COMPILER'
+               ac_option='-openmp' ;;
+             SGI/PGI)
+               ac_conditional='defined __sgi || defined __PGI || defined 
__PGIC__'
+               ac_option='-mp' ;;
+             Compaq)
+               ac_conditional='defined __DECC || defined __DECCXX'
+               ac_option='-omp' ;;
+             IBM)
+               ac_conditional='defined __xlc__ || defined __xlC__'
+               ac_option='-qsmp=omp' ;;
+           esac
+           if test $brand = GCC; then
+             if test "$GCC" = yes; then
+               ac_openmp_result=yes
+             else
+               ac_openmp_result=no
+             fi
+           else
+             AC_EGREP_CPP([Brand], [
+               #if $ac_conditional
+                Brand
+               #endif
+               ], [ac_openmp_result=yes], [ac_openmp_result=no])
+           fi
+           if test $ac_openmp_result = yes; then
+             ac_save_CFLAGS=$CFLAGS
+             CFLAGS="$CFLAGS $ac_option"
+             AC_LINK_IFELSE([
+ #ifndef _OPENMP
+  choke me
+ #endif
+ #include <omp.h>
+ int main () { return omp_get_num_threads (); }
+               ], [ac_cv_prog_cc_openmp=$ac_option])
+             CFLAGS=$ac_save_CFLAGS
+             break
+           fi
+         done
+       fi
+       ])
+     AC_MSG_RESULT([$ac_cv_prog_cc_openmp])
+     case $ac_cv_prog_cc_openmp in
+       "none needed" | unsupported)
+         OPENMP_CFLAGS= ;;
+       *)
+         OPENMP_CFLAGS=$ac_cv_prog_cc_openmp ;;
+     esac
+   fi
+   AC_SUBST([OPENMP_CFLAGS])
+ ])





reply via email to

[Prev in Thread] Current Thread [Next in Thread]