From 04b5da324ee2dd6e0310488e239cee18caaec621 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste CAYROU Date: Fri, 13 Jul 2012 12:16:55 +0200 Subject: [PATCH] Add openmp option and dectection for ./configure command (multi-threading) --- configure.ac | 36 ++++++++++++++++++++++++++++++++++++ m4/ax_openmp.m4 | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pyext/setup.py.in | 19 +++++++++++++++++-- 3 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 m4/ax_openmp.m4 diff --git a/configure.ac b/configure.ac index 310597d..7dc6928 100644 --- a/configure.ac +++ b/configure.ac @@ -569,6 +569,36 @@ else AC_MSG_RESULT(no) fi +############################################################################# +# Checks for OpenMP checking option (G_OPENMP) # +############################################################################# +openmp_ok=no + +m4_ifdef([AC_OPENMP],m4_pattern_allow([AC_OPENMP]), [AX_OPENMP([openmp_ok=yes],[openmp_ok=no])]) +if test "x$ac_cv_prog_cxx_openmp" != "xunsupported" && test "x$ac_cv_prog_cxx_openmp" != "x"; then + openmp_ok=yes +fi + + +if test "x$openmp_ok" = "xyes" ; then + + AC_MSG_CHECKING(whether to enable openMP) + AC_ARG_ENABLE([openmp], + AS_HELP_STRING([--enable-openmp], + [To active multi-threading [default=yes]]), + [enable_openmp_="$enableval"], + [enable_openmp="yes"]) + + if test "x$enable_openmp" = "xyes"; then + CXXFLAGS="$CXXFLAGS $OPENMP_CFLAGS" + AC_MSG_RESULT(yes) + else + enable_openmp=no + AC_MSG_RESULT(no) + fi +fi + +AM_CONDITIONAL(OPENMP,test "x$openmp_ok" = "xyes" && test "x$enable_openmp" = "xyes") ############################################################################# # Checks if Python bindings are to be build # @@ -680,6 +710,7 @@ if test "x$enable_python" = "xyes"; then fi + ############################################################################# # Initialise directory path for test environment # ############################################################################# @@ -1151,6 +1182,11 @@ if test "x$SMALL_MEMORY" = "xyes"; then else echo " - Optimize memory usage (no)" fi +if test "x$enable_openmp" = "xyes"; then + echo " * Enable openMP (yes) (default)" +else + echo " - Enable openMP (no)" +fi if test "x$enable_debug" = "xyes"; then echo " * Compile in debug code (yes)" else diff --git a/m4/ax_openmp.m4 b/m4/ax_openmp.m4 new file mode 100644 index 0000000..7ea794b --- /dev/null +++ b/m4/ax_openmp.m4 @@ -0,0 +1,99 @@ +# =========================================================================== +# 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 +# +# 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 8 + +AC_DEFUN([AX_OPENMP], [ +AC_PREREQ(2.59) 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_TRY_LINK_FUNC(omp_set_num_threads, + [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 --git a/pyext/setup.py.in b/pyext/setup.py.in index ba60e93..ea5ef76 100644 --- a/pyext/setup.py.in +++ b/pyext/setup.py.in @@ -148,6 +148,17 @@ if '@WITH_INST_LAT_TRUE@' != '#': # Set extension definition for core modules ext_modules = [] py_modules = [] + +# extra args +extra_compile_args = [] +extra_link_args = [] + +# enable OPENMP +if '@OPENMP_TRUE@' != '#': + extra_compile_args=['-fopenmp'] + extra_link_args=['-fopenmp'] + + for module in core_modules: # Define module @@ -155,7 +166,9 @@ for module in core_modules: include_dirs=include_dirs, \ libraries=libraries, library_dirs=library_dirs, - runtime_library_dirs=runtime_library_dirs) + runtime_library_dirs=runtime_library_dirs, + extra_compile_args=extra_compile_args, + extra_link_args=extra_link_args) ext_modules.append(ext_module) py_modules.append(pkg_name+'.'+module) @@ -178,7 +191,9 @@ for module in inst_modules: include_dirs=include_dirs, \ libraries=libraries, library_dirs=library_dirs, - runtime_library_dirs=runtime_library_dirs) + runtime_library_dirs=runtime_library_dirs, + extra_compile_args=extra_compile_args, + extra_link_args=extra_link_args) ext_modules.append(ext_module) py_modules.append(pkg_name+'.'+module) -- libgit2 0.21.4