# HG changeset patch # User Mike Miller # Date 1424561050 18000 # Node ID 81078b0e39e8a49114e3a14b60382f61e05bc5f1 # Parent 7dbb8aa43d56e626b0ff1daf22fc585dbcfca9b3 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. diff -r 7dbb8aa43d56 -r 81078b0e39e8 NEWS --- 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. diff -r 7dbb8aa43d56 -r 81078b0e39e8 configure.ac --- 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]) diff -r 7dbb8aa43d56 -r 81078b0e39e8 m4/acinclude.m4 --- 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 - #include - ]], [[ - 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], [ diff -r 7dbb8aa43d56 -r 81078b0e39e8 m4/ax_openmp.m4 --- /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 +# Copyright (c) 2015 John W. Peterson +# +# 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 . +# +# 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 + +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 diff -r 7dbb8aa43d56 -r 81078b0e39e8 m4/module.mk --- 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 \