changeset 19816:81078b0e39e8

build: Enable OpenMP by default, remove experimental warning (bug #42176) * configure.ac: Enable OpenMP by default. Use AX_OPENMP macro to detect compiler flags instead of OCTAVE_CHECK_OPENMP and case statements. Delete warning message about OpenMP being experimental. * ax_openmp.m4: New macro. * acinclude.m4 (OCTAVE_CHECK_OPENMP): Delete macro definition. * m4/module.mk (EXTRA_DIST): Include m4/ax_openmp.m4 in the list. * NEWS: Mention that OpenMP is enabled by default.
author Mike Miller <mtmiller@ieee.org>
date Sat, 21 Feb 2015 18:24:10 -0500
parents 7dbb8aa43d56
children bafcfc5b99af
files NEWS configure.ac m4/acinclude.m4 m4/ax_openmp.m4 m4/module.mk
diffstat 5 files changed, 141 insertions(+), 62 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Sat Feb 21 16:37:01 2015 -0500
+++ b/NEWS	Sat Feb 21 18:24:10 2015 -0500
@@ -278,6 +278,11 @@
  ** Qt and FLTK graphics toolkit now support offscreen rendering,
     i.e., print will work when figure visibility is off.
 
+ ** Octave now has OpenMP enabled by default if the system provides a
+    working OpenMP implementation.  This allows oct-file modules to take
+    advantage of OpenMP if desired.  This can be disabled when building
+    Octave with the configure option --disable-openmp.
+
 ---------------------------------------------------------
 
 See NEWS.3 for old news.
--- a/configure.ac	Sat Feb 21 16:37:01 2015 -0500
+++ b/configure.ac	Sat Feb 21 18:24:10 2015 -0500
@@ -517,25 +517,23 @@
 AC_SUBST(XTRA_CFLAGS)
 AC_SUBST(XTRA_CXXFLAGS)
 
-### Test whether the compiler supports OpenMP.  This is experimental so disable
-### it by default.  Enable it with the flag --enable-openmp.
-
-USE_OPENMP=no
+### Test whether the compiler supports OpenMP.  This is enabled by default
+### now to allow the option of using OpenMP in loadable modules.
+
+USE_OPENMP=yes
 AC_ARG_ENABLE([openmp],
-  [AS_HELP_STRING([--enable-openmp],
-    [(EXPERIMENTAL) use OpenMP SMP multi-threading])],
-  [if test "$enableval" = yes; then USE_OPENMP=yes; fi], [])
+  [AS_HELP_STRING([--disable-openmp],
+    [disable OpenMP SMP multi-threading])],
+  [if test "$enableval" = no; then USE_OPENMP=no; fi], [])
 if test $USE_OPENMP = yes; then
-  case $host_os in
-    mingw* | cygwin* | *-gnu*)
-      OCTAVE_CHECK_OPENMP(-fopenmp)
-    ;;
-    msdosmsvc)
-      ## FIXME: is this the right flag for MSVC?
-      OCTAVE_CHECK_OPENMP(-openmp)
-    ;;
-    ## Add other compilers supporting OpenMP here
-  esac
+  AC_LANG_PUSH(C)
+  AX_OPENMP
+  AC_LANG_POP(C)
+  AC_LANG_PUSH(C++)
+  AX_OPENMP
+  AC_LANG_POP(C++)
+  CFLAGS="$CFLAGS $OPENMP_CFLAGS"
+  CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS"
 fi
 
 ### Defaults for cross compiling.  BUILD_CC and BUILD_CXX are
@@ -3107,7 +3105,7 @@
   Dynamic Linking:                    $ENABLE_DYNAMIC_LINKING $DL_API_MSG
   Include support for GNU readline:   $USE_READLINE
   64-bit array dims and indexing:     $USE_64_BIT_IDX_T
-  Experimental SMP multithreading:    $USE_OPENMP
+  OpenMP SMP multithreading:          $USE_OPENMP
 ])
 
 warn_msg_printed=false
@@ -3139,19 +3137,6 @@
   warn_msg_printed=true
 fi
 
-if test $USE_OPENMP = yes; then
-  AC_MSG_WARN([])
-  AC_MSG_WARN([You used the EXPERIMENTAL --enable-openmp option.])
-  AC_MSG_WARN([Are you sure that is what you want to do?])
-  AC_MSG_WARN([])
-  AC_MSG_WARN([This option enables experimental SMP multithreding])
-  AC_MSG_WARN([code that has had very little testing.  There is no])
-  AC_MSG_WARN([certainity that the results returned by Octave with])
-  AC_MSG_WARN([this option enabled will be correct.])
-  AC_MSG_WARN([])
-  warn_msg_printed=true
-fi
-
 if test $native_graphics != yes; then
   AC_MSG_WARN([])
   AC_MSG_WARN([I didn't find the necessary libraries to compile native])
--- a/m4/acinclude.m4	Sat Feb 21 16:37:01 2015 -0500
+++ b/m4/acinclude.m4	Sat Feb 21 18:24:10 2015 -0500
@@ -1091,37 +1091,6 @@
   AC_SUBST(TERM_LIBS)
 ])
 dnl
-dnl Check for support of OpenMP with a given compiler flag.
-dnl If found define HAVE_OPENMP and add the compile flag
-dnl to CFLAGS and CXXFLAGS.
-dnl
-AC_DEFUN([OCTAVE_CHECK_OPENMP], [
-  AC_MSG_CHECKING([for support of OpenMP])
-  ac_octave_save_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS $1"
-  AC_CACHE_VAL([octave_cv_check_openmp],
-    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-        #include <omp.h>
-        #include <stdio.h>
-        ]], [[
-        int main(int argc, char* argv[])
-        {
-          _Pragma("omp parallel")
-          printf("Hello, world.\n");
-          return 0;
-        }
-      ]])],
-      octave_cv_openmp=yes, octave_cv_openmmp=no, octave_cv_openmp=no)
-  ])
-  AC_MSG_RESULT([$octave_cv_openmp])
-  if test $octave_cv_openmp = yes; then
-    AC_DEFINE(HAVE_OPENMP, 1, [Define to 1 if compiler supports OpenMP.])
-    CXXFLAGS="$CXXFLAGS $1"
-  else
-    CFLAGS="$ac_octave_save_CFLAGS"
-  fi
-])
-dnl
 dnl Check for the Qhull version.
 dnl
 AC_DEFUN([OCTAVE_CHECK_QHULL_VERSION], [
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m4/ax_openmp.m4	Sat Feb 21 18:24:10 2015 -0500
@@ -0,0 +1,119 @@
+# ===========================================================================
+#         http://www.gnu.org/software/autoconf-archive/ax_openmp.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_OPENMP([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+#   This macro tries to find out how to compile programs that use OpenMP a
+#   standard API and set of compiler directives for parallel programming
+#   (see http://www-unix.mcs/)
+#
+#   On success, it sets the OPENMP_CFLAGS/OPENMP_CXXFLAGS/OPENMP_F77FLAGS
+#   output variable to the flag (e.g. -omp) used both to compile *and* link
+#   OpenMP programs in the current language.
+#
+#   NOTE: You are assumed to not only compile your program with these flags,
+#   but also link it with them as well.
+#
+#   If you want to compile everything with OpenMP, you should set:
+#
+#     CFLAGS="$CFLAGS $OPENMP_CFLAGS"
+#     #OR#  CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS"
+#     #OR#  FFLAGS="$FFLAGS $OPENMP_FFLAGS"
+#
+#   (depending on the selected language).
+#
+#   The user can override the default choice by setting the corresponding
+#   environment variable (e.g. OPENMP_CFLAGS).
+#
+#   ACTION-IF-FOUND is a list of shell commands to run if an OpenMP flag is
+#   found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it is
+#   not found. If ACTION-IF-FOUND is not specified, the default action will
+#   define HAVE_OPENMP.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2015 John W. Peterson <jwpeterson@gmail.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 11
+
+AC_DEFUN([AX_OPENMP], [
+AC_PREREQ([2.69]) dnl for _AC_LANG_PREFIX
+
+AC_CACHE_CHECK([for OpenMP flag of _AC_LANG compiler], ax_cv_[]_AC_LANG_ABBREV[]_openmp, [save[]_AC_LANG_PREFIX[]FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
+ax_cv_[]_AC_LANG_ABBREV[]_openmp=unknown
+# Flags to try:  -fopenmp (gcc), -openmp (icc), -mp (SGI & PGI),
+#                -xopenmp (Sun), -omp (Tru64), -qsmp=omp (AIX), none
+ax_openmp_flags="-fopenmp -openmp -mp -xopenmp -omp -qsmp=omp none"
+if test "x$OPENMP_[]_AC_LANG_PREFIX[]FLAGS" != x; then
+  ax_openmp_flags="$OPENMP_[]_AC_LANG_PREFIX[]FLAGS $ax_openmp_flags"
+fi
+for ax_openmp_flag in $ax_openmp_flags; do
+  case $ax_openmp_flag in
+    none) []_AC_LANG_PREFIX[]FLAGS=$save[]_AC_LANG_PREFIX[] ;;
+    *) []_AC_LANG_PREFIX[]FLAGS="$save[]_AC_LANG_PREFIX[]FLAGS $ax_openmp_flag" ;;
+  esac
+  AC_LINK_IFELSE([AC_LANG_SOURCE([[
+@%:@include <omp.h>
+
+static void
+parallel_fill(int * data, int n)
+{
+  int i;
+@%:@pragma omp parallel for
+  for (i = 0; i < n; ++i)
+    data[i] = i;
+}
+
+int
+main()
+{
+  int arr[100000];
+  omp_set_num_threads(2);
+  parallel_fill(arr, 100000);
+  return 0;
+}
+]])],[ax_cv_[]_AC_LANG_ABBREV[]_openmp=$ax_openmp_flag; break],[])
+done
+[]_AC_LANG_PREFIX[]FLAGS=$save[]_AC_LANG_PREFIX[]FLAGS
+])
+if test "x$ax_cv_[]_AC_LANG_ABBREV[]_openmp" = "xunknown"; then
+  m4_default([$2],:)
+else
+  if test "x$ax_cv_[]_AC_LANG_ABBREV[]_openmp" != "xnone"; then
+    OPENMP_[]_AC_LANG_PREFIX[]FLAGS=$ax_cv_[]_AC_LANG_ABBREV[]_openmp
+  fi
+  m4_default([$1], [AC_DEFINE(HAVE_OPENMP,1,[Define if OpenMP is enabled])])
+fi
+])dnl AX_OPENMP
--- a/m4/module.mk	Sat Feb 21 16:37:01 2015 -0500
+++ b/m4/module.mk	Sat Feb 21 18:24:10 2015 -0500
@@ -4,6 +4,7 @@
   m4/ax_blas_f77_func.m4 \
   m4/ax_compare_version.m4 \
   m4/ax_lapack.m4 \
+  m4/ax_openmp.m4 \
   m4/ax_pthread.m4 \
   m4/gnulib-cache.m4 \
   m4/libtool.m4 \