Commit 8eee199e authored by Raphael 'kena' Poss's avatar Raphael 'kena' Poss
Browse files

Sanitize the configuration flags for DISTMEM.

With this patch the configuration for distmem is simplified:

--disable-distmem (or --enable-distmem=no)
  disable distmem support entirely.
--enable-distmem=yes
  force enable distmem, autodetect back-ends, with an error if no back-end can be found.
--enable-distmem=auto (this is the defalt)
  enable distmem if and only if at least one back-end can be found.
--enable-distmem=x,y,z
  force enable distmem for back-ends x,y,z and fail if any cannot be found.

Additionally, when --enable-distmem=yes or --enable-distmem=auto is set, individual
back-ends can be ignored/disabled with --disable-distmem-xxx.
Showing with 339 additions and 310 deletions
+339 -310
...@@ -784,9 +784,9 @@ enable_omp ...@@ -784,9 +784,9 @@ enable_omp
enable_phm enable_phm
enable_distmem enable_distmem
enable_distmem_gasnet enable_distmem_gasnet
enable_distmem_gpi
enable_distmem_mpi enable_distmem_mpi
enable_distmem_armci enable_distmem_armci
enable_distmem_gpi
enable_isl enable_isl
' '
ac_precious_vars='build_alias ac_precious_vars='build_alias
...@@ -1431,14 +1431,15 @@ Optional Features: ...@@ -1431,14 +1431,15 @@ Optional Features:
--disable-sl Disable checking for SL --disable-sl Disable checking for SL
--disable-omp Disable checking for OpenMP --disable-omp Disable checking for OpenMP
--disable-phm Disable checking for the private heap manager --disable-phm Disable checking for the private heap manager
--disable-distmem Disable checking for Distributed Memory support --enable-distmem=x,y,z Enable distmem targets x,y,z, or use
--disable-distmem_gasnet --disable-distmem to disable entirely. Available
Disable checking for Distributed Memory GASNet targets: gasnet,gpi,mpi,armci. The default target is
support "auto" which enables whichever target can be found.
--disable-distmem_mpi Disable checking for Distributed Memory MPI support --disable-distmem-gasnet
--disable-distmem_armci Disable checking for Distributed Memory ARMCI Disable the GASnet target.
support --disable-distmem-gpi Disable the GPI target.
--disable-distmem_gpi Disable checking for Distributed Memory GPI support --disable-distmem-mpi Disable the MPI target.
--disable-distmem-armci Disable the ARMci target.
--disable-isl Disable checking for ISL --disable-isl Disable checking for ISL
Optional Packages: Optional Packages:
...@@ -5100,68 +5101,60 @@ _ACEOF ...@@ -5100,68 +5101,60 @@ _ACEOF
# Check whether --enable-distmem was given. # Check whether --enable-distmem was given.
if test "${enable_distmem+set}" = set; then : if test "${enable_distmem+set}" = set; then :
enableval=$enable_distmem; enable_distmem_gasnet=$enableval enableval=$enable_distmem;
enable_distmem_gpi=$enableval
enable_distmem_mpi=$enableval
enable_distmem_armci=$enableval
else else
enable_distmem_gasnet=yes enable_distmem=auto
enable_distmem_gpi=yes
enable_distmem_mpi=yes
enable_distmem_armci=yes
fi fi
enable_distmem_gasnet=no
enable_distmem_gpi=no
enable_distmem_mpi=no
enable_distmem_armci=no
case $enable_distmem in
auto|yes)
enable_distmem_gasnet=auto
enable_distmem_gpi=auto
enable_distmem_mpi=auto
enable_distmem_armci=auto
;;
esac
if test x"$enable_distmem_gasnet" != xno; then case $enable_distmem in *gasnet*) enable_distmem_gasnet=yes;; esac
# Check whether --enable-distmem_gasnet was given. case $enable_distmem in *gpi*) enable_distmem_gpi=yes;; esac
case $enable_distmem in *mpi*) enable_distmem_mpi=yes;; esac
case $enable_distmem in *armci*) enable_distmem_armci=yes;; esac
# Check whether --enable-distmem-gasnet was given.
if test "${enable_distmem_gasnet+set}" = set; then : if test "${enable_distmem_gasnet+set}" = set; then :
enableval=$enable_distmem_gasnet; enable_distmem_gasnet=$enableval enableval=$enable_distmem_gasnet;
else
enable_distmem_gasnet=yes
fi fi
fi # Check whether --enable-distmem-gpi was given.
if test "${enable_distmem_gpi+set}" = set; then :
enableval=$enable_distmem_gpi;
fi
if test x"$enable_distmem_mpi" != xno; then # Check whether --enable-distmem-mpi was given.
# Check whether --enable-distmem_mpi was given.
if test "${enable_distmem_mpi+set}" = set; then : if test "${enable_distmem_mpi+set}" = set; then :
enableval=$enable_distmem_mpi; enable_distmem_mpi=$enableval enableval=$enable_distmem_mpi;
else
enable_distmem_mpi=yes
fi fi
fi # Check whether --enable-distmem-armci was given.
if test x"$enable_distmem_armci" != xno; then
# Check whether --enable-distmem_armci was given.
if test "${enable_distmem_armci+set}" = set; then : if test "${enable_distmem_armci+set}" = set; then :
enableval=$enable_distmem_armci; enable_distmem_armci=$enableval enableval=$enable_distmem_armci;
else
enable_distmem_armci=yes
fi fi
fi
if test x"$enable_distmem_gpi" != xno; then
# Check whether --enable-distmem_gpi was given.
if test "${enable_distmem_gpi+set}" = set; then :
enableval=$enable_distmem_gpi; enable_distmem_gpi=$enableval
else
enable_distmem_gpi=yes
fi
fi
cat >./sac2crc.GASNetconduits if test x"$enable_distmem" != xno; then
cat >./build.GASNetconduits if test x"$enable_distmem_mpi" != xno; then
cat >./build.GASNetconduitsCrossVariant expected=$enable_distmem_mpi
cat >./config.GASNetconduits
if test x"$enable_distmem_mpi" != xno; then
...@@ -5351,7 +5344,7 @@ fi ...@@ -5351,7 +5344,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI 3 support" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI 3 support" >&5
$as_echo_n "checking for MPI 3 support... " >&6; } $as_echo_n "checking for MPI 3 support... " >&6; }
ax_mpi_save_CC="$CC" ax_mpi_save_CC="$CC"
CC="$MPICC" CC="$MPICC"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
#include <mpi.h> #include <mpi.h>
...@@ -5359,17 +5352,21 @@ int ...@@ -5359,17 +5352,21 @@ int
main () main ()
{ {
/* This program uses MPI 3 one-sided communication to test whether the MPI installation does support these operations. */ /* This program uses MPI 3 one-sided communication to test
int main(int argc, char *argv[]) { whether the MPI installation does support these operations. */
static MPI_Win win = NULL; int main(int argc, char *argv[]) {
size_t SAC_DISTMEM_pagesz = 0; static MPI_Win win = NULL;
size_t SAC_DISTMEM_pagesz = 0;
void *local_page_ptr = NULL; void *local_page_ptr = NULL;
size_t owner_rank = 0; size_t owner_rank = 0;
size_t remote_page_index; size_t remote_page_index;
MPI_Get( local_page_ptr, SAC_DISTMEM_pagesz, MPI_BYTE, owner_rank, remote_page_index * SAC_DISTMEM_pagesz, SAC_DISTMEM_pagesz, MPI_BYTE, win); MPI_Get( local_page_ptr, SAC_DISTMEM_pagesz,
} MPI_BYTE, owner_rank,
remote_page_index * SAC_DISTMEM_pagesz,
SAC_DISTMEM_pagesz, MPI_BYTE, win);
}
; ;
return 0; return 0;
...@@ -5379,25 +5376,35 @@ if ac_fn_c_try_compile "$LINENO"; then : ...@@ -5379,25 +5376,35 @@ if ac_fn_c_try_compile "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
else else
enable_distmem_mpi=no enable_distmem_mpi=no;
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
fi fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
CC="$ax_mpi_save_CC" CC="$ax_mpi_save_CC"
fi fi
if test x"$expected" = xyes -a x"$enable_distmem_mpi" = xno; then
as_fn_error $? "unable to find a working MPI back-end" "$LINENO" 5
fi
fi fi
if test x"$enable_distmem_armci" != xno; then if test x"$enable_distmem_armci" != xno; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ARMCI_HOME is set" >&5 expected=$enable_distmem_armci
$as_echo_n "checking if ARMCI_HOME is set... " >&6; }
enable_distmem_armci=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ARMCI_HOME is set" >&5
$as_echo_n "checking whether ARMCI_HOME is set... " >&6; }
if test x"$ARMCI_HOME" != x ; then if test x"$ARMCI_HOME" != x ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using ARMCI_HOME: $ARMCI_HOME" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: using ARMCI_HOME: $ARMCI_HOME" >&5
$as_echo "using ARMCI_HOME: $ARMCI_HOME" >&6; } $as_echo "using ARMCI_HOME: $ARMCI_HOME" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $ARMCI_HOME exists" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $ARMCI_HOME exists" >&5
$as_echo_n "checking if $ARMCI_HOME exists... " >&6; } $as_echo_n "checking whether $ARMCI_HOME exists... " >&6; }
if test -r $ARMCI_HOME; then if test -r "$ARMCI_HOME"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
...@@ -5407,33 +5414,36 @@ _ACEOF ...@@ -5407,33 +5414,36 @@ _ACEOF
ARMCI_DIR=$ARMCI_HOME ARMCI_DIR=$ARMCI_HOME
enable_distmem_armci=yes
else else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
enable_distmem_armci=no
fi fi
else else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
enable_distmem_armci=no fi
if test x"$expected" = xyes -a x"$enable_distmem_armci" = xno; then
as_fn_error $? "AMRCI_HOME not set or ARMci directory not found" "$LINENO" 5
fi fi
fi fi
if test x"$enable_distmem_gpi" != xno; then if test x"$enable_distmem_gpi" != xno; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if GPI_HOME is set" >&5 expected=$enable_distmem_gpi
$as_echo_n "checking if GPI_HOME is set... " >&6; }
enable_distmem_gpi=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GPI_HOME is set" >&5
$as_echo_n "checking whether GPI_HOME is set... " >&6; }
if test x"$GPI_HOME" != x ; then if test x"$GPI_HOME" != x ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using GPI_HOME: $GPI_HOME" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: using GPI_HOME: $GPI_HOME" >&5
$as_echo "using GPI_HOME: $GPI_HOME" >&6; } $as_echo "using GPI_HOME: $GPI_HOME" >&6; }
else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $GPI_HOME exists" >&5
GPI_HOME=/opt/GPI2 $as_echo_n "checking whether $GPI_HOME exists... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using default location: $GPI_HOME" >&5 if test -r "$GPI_HOME"; then
$as_echo "using default location: $GPI_HOME" >&6; }
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $GPI_HOME exists" >&5
$as_echo_n "checking if $GPI_HOME exists... " >&6; }
if test -r $GPI_HOME; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
...@@ -5443,67 +5453,89 @@ _ACEOF ...@@ -5443,67 +5453,89 @@ _ACEOF
GPI_DIR=$GPI_HOME GPI_DIR=$GPI_HOME
else enable_distmem_gpi=yes
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
enable_distmem_gpi=no fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test x"$expected" = xyes -a x"$enable_distmem_gpi" = xno; then
as_fn_error $? "GPI_HOME not set or GPI directory not found" "$LINENO" 5
fi fi
fi fi
if test x"$enable_distmem_gasnet" != xno; then if test x"$enable_distmem_gasnet" != xno; then
expected=$enable_distmem_gasnet
################################################################################
#
# feature setup:
#
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if GASNET_HOME is set" >&5 enable_distmem_gastnet=no
$as_echo_n "checking if GASNET_HOME is set... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GASNET_HOME is set" >&5
$as_echo_n "checking whether GASNET_HOME is set... " >&6; }
if test x"$GASNET_HOME" != x ; then if test x"$GASNET_HOME" != x ; then
gasnet_home="$GASNET_HOME" gasnet_home="$GASNET_HOME"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using GASNET_HOME: $gasnet_home" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: using GASNET_HOME: $gasnet_home" >&5
$as_echo "using GASNET_HOME: $gasnet_home" >&6; } $as_echo "using GASNET_HOME: $gasnet_home" >&6; }
else
gasnet_home=/usr/local/gasnet
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using default location: $gasnet_home" >&5
$as_echo "using default location: $gasnet_home" >&6; }
fi
gasnet_conduit_names="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gasnet_home exists" >&5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $gasnet_home exists" >&5 $as_echo_n "checking whether $gasnet_home exists... " >&6; }
$as_echo_n "checking if $gasnet_home exists... " >&6; } if test -r "$gasnet_home"; then
if test -r $gasnet_home; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking installed gasnet conduits" >&5
$as_echo_n "checking installed gasnet conduits... " >&6; }
cat <<EOF >>./config.GASNetconduits { $as_echo "$as_me:${as_lineno-$LINENO}: checking for installed gasnet conduits" >&5
################################################################################ $as_echo_n "checking for installed gasnet conduits... " >&6; }
# gasnet_conduits=$(echo $( (cd "$gasnet_home/include" && ls -d *-conduit 2>/dev/null | cut -d- -f1 ) ) )
# GASNet conduit settings: if test x"$gasnet_conduits" = x ; then
# { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
$as_echo "none" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gasnet_conduits" >&5
$as_echo "$gasnet_conduits" >&6; }
enable_distmem_gasnet=yes
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
EOF
for gasnet_conduit_path in $gasnet_home/include/*-conduit/; do if test x"$expected" = xyes -a x"$enable_distmem_gasnet" = xno; then
gasnet_conduit_filename="$(basename "${gasnet_conduit_path}")" as_fn_error $? "GASNET_HOME not set or directory not found or no GASnet conduits defined." "$LINENO" 5
gasnet_conduit_name="${gasnet_conduit_filename//-conduit/}" fi
gasnet_conduit_name_uc=`echo $gasnet_conduit_name | tr 'a-z' 'A-Z'` fi
if test x"$gasnet_conduit_names" != x ; then
gasnet_conduit_names="$gasnet_conduit_names " if test x"$enable_distmem_gasnet" != xno; then
fi
gasnet_conduit_names="$gasnet_conduit_names$gasnet_conduit_name" true >./sac2crc.GASNetconduits
gasnet_conduit_makefile="$gasnet_conduit_path$gasnet_conduit_name-seq.mak"
gasnet_conduit_cc="$(getmakevar $gasnet_conduit_makefile GASNET_CC)" true >./build.GASNetconduits
gasnet_conduit_cppflags="$(getmakevar $gasnet_conduit_makefile GASNET_CPPFLAGS)" true >./build.GASNetconduitsCrossVariant
gasnet_conduit_cflags="$(getmakevar $gasnet_conduit_makefile GASNET_CFLAGS)"
gasnet_conduit_ld="$(getmakevar $gasnet_conduit_makefile GASNET_LD)"
gasnet_conduit_ldflags="$(getmakevar $gasnet_conduit_makefile GASNET_LDFLAGS)"
gasnet_conduit_libs="$(getmakevar $gasnet_conduit_makefile GASNET_LIBS)"
cat <<EOF >>./sac2crc.GASNetconduits true >./config.GASNetconduits
for gasnet_conduit_name in $gasnet_conduits; do
gasnet_conduit_path=$gasnet_home/include/$gasnet_conduit_name-conduit/
gasnet_conduit_name_uc=$(echo $gasnet_conduit_name | tr 'a-z' 'A-Z')
gasnet_conduit_makefile=$gasnet_conduit_path$gasnet_conduit_name-seq.mak
gasnet_conduit_cc=$(getmakevar $gasnet_conduit_makefile GASNET_CC)
gasnet_conduit_cppflags=$(getmakevar $gasnet_conduit_makefile GASNET_CPPFLAGS)
gasnet_conduit_cflags=$(getmakevar $gasnet_conduit_makefile GASNET_CFLAGS)
gasnet_conduit_ld=$(getmakevar $gasnet_conduit_makefile GASNET_LD)
gasnet_conduit_ldflags=$(getmakevar $gasnet_conduit_makefile GASNET_LDFLAGS)
gasnet_conduit_libs=$(getmakevar $gasnet_conduit_makefile GASNET_LIBS)
cat <<EOF >>./sac2crc.GASNetconduits
target distmem_gasnet_$gasnet_conduit_name::distmem_gasnet: target distmem_gasnet_$gasnet_conduit_name::distmem_gasnet:
COMMLIB_CONDUIT := "$gasnet_conduit_name" COMMLIB_CONDUIT := "$gasnet_conduit_name"
CC := "$gasnet_conduit_ld -std=gnu99" CC := "$gasnet_conduit_ld -std=gnu99"
...@@ -5524,12 +5556,11 @@ LDFLAGS += "$gasnet_conduit_ldflags" ...@@ -5524,12 +5556,11 @@ LDFLAGS += "$gasnet_conduit_ldflags"
EOF EOF
cat <<EOF >>./config.GASNetconduits cat <<EOF >>./config.GASNetconduits
GASNET_${gasnet_conduit_name_uc}_CC := $gasnet_conduit_cc -std=gnu99 GASNET_${gasnet_conduit_name_uc}_CC := $gasnet_conduit_cc -std=gnu99
GASNET_${gasnet_conduit_name_uc}_CPPFLAGS := $gasnet_conduit_cppflags GASNET_${gasnet_conduit_name_uc}_CPPFLAGS := $gasnet_conduit_cppflags
GASNET_${gasnet_conduit_name_uc}_CFLAGS := $gasnet_conduit_cflags GASNET_${gasnet_conduit_name_uc}_CFLAGS := $gasnet_conduit_cflags
GASNET_${gasnet_conduit_name}_cap := $gasnet_conduit_name_uc GASNET_${gasnet_conduit_name}_cap := $gasnet_conduit_name_uc
EOF EOF
cat <<EOF >>./build.GASNetconduits cat <<EOF >>./build.GASNetconduits
...@@ -5562,64 +5593,54 @@ EOF ...@@ -5562,64 +5593,54 @@ EOF
@\$(CLOCK_SKEW_ELIMINATION) @\$(CLOCK_SKEW_ELIMINATION)
EOF EOF
done done
if test x"$gasnet_conduit_names" = x ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
$as_echo "none" >&6; }
enable_distmem_gasnet=no
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gasnet_conduit_names" >&5
$as_echo "$gasnet_conduit_names" >&6; }
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
enable_distmem_gasnet=no
fi
if test x"$enable_distmem_gasnet" = xno -a x"$enable_distmem_gpi" = xno -a x"$enable_distmem_mpi" = xno -a x"$enable_distmem_armci" = xno ; then fi
enable_distmem=no
if test x"$enable_distmem_gasnet" = xno \
-a x"$enable_distmem_gpi" = xno \
-a x"$enable_distmem_mpi" = xno \
-a x"$enable_distmem_armci" = xno \
; then
if test x"$enable_distmem" != xauto; then
as_fn_error $? "unable to find a suitable distmem back-end." "$LINENO" 5
fi
enable_distmem=no
else else
enable_distmem=yes enable_distmem=yes
fi fi
fi fi
have_distmem=`if test x"$enable_distmem" != xno; then echo 1; else echo 0; fi`
have_distmem_gasnet=`if test x"$enable_distmem_gasnet" != xno; then echo 1; else echo 0; fi`
have_distmem_gpi=`if test x"$enable_distmem_gpi" != xno; then echo 1; else echo 0; fi`
have_distmem_mpi=`if test x"$enable_distmem_mpi" != xno; then echo 1; else echo 0; fi`
have_distmem_armci=`if test x"$enable_distmem_armci" != xno; then echo 1; else echo 0; fi`
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
#define ENABLE_DISTMEM $have_distmem #define ENABLE_DISTMEM `test x"$enable_distmem" = xno && echo 0 || echo 1`
_ACEOF _ACEOF
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
#define ENABLE_DISTMEM_GASNET $have_distmem_gasnet #define ENABLE_DISTMEM_GASNET `test x"$enable_distmem_gasnet" = xno && echo 0 || echo 1`
_ACEOF _ACEOF
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
#define DISTMEM_GASNET_CONDUITS "$gasnet_conduit_names" #define DISTMEM_GASNET_CONDUITS "$gasnet_conduits"
_ACEOF _ACEOF
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
#define ENABLE_DISTMEM_GPI $have_distmem_gpi #define ENABLE_DISTMEM_GPI `test x"$enable_distmem_gpi" = xno && echo 0 || echo 1`
_ACEOF _ACEOF
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
#define ENABLE_DISTMEM_MPI $have_distmem_mpi #define ENABLE_DISTMEM_MPI `test x"$enable_distmem_mpi" = xno && echo 0 || echo 1`
_ACEOF _ACEOF
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
#define ENABLE_DISTMEM_ARMCI $have_distmem_armci #define ENABLE_DISTMEM_ARMCI `test x"$enable_distmem_armci" = xno && echo 0 || echo 1`
_ACEOF _ACEOF
...@@ -5627,7 +5648,7 @@ _ACEOF ...@@ -5627,7 +5648,7 @@ _ACEOF
ENABLE_DISTMEM_GASNET=$enable_distmem_gasnet ENABLE_DISTMEM_GASNET=$enable_distmem_gasnet
DISTMEM_GASNET_CONDUITS=$gasnet_conduit_names DISTMEM_GASNET_CONDUITS=$gasnet_conduits
ENABLE_DISTMEM_GPI=$enable_distmem_gpi ENABLE_DISTMEM_GPI=$enable_distmem_gpi
...@@ -7638,7 +7659,7 @@ $as_echo "#define UNUSED __attribute__((unused))" >>confdefs.h ...@@ -7638,7 +7659,7 @@ $as_echo "#define UNUSED __attribute__((unused))" >>confdefs.h
if test x"$enable_distmem_gasnet" = xyes; then if test x"$enable_distmem_gasnet" = xyes; then
gasnet_conduit_names_print=" (conduits: $gasnet_conduit_names)" gasnet_conduit_names_print=" (conduits: $gasnet_conduits)"
else else
gasnet_conduit_names_print="" gasnet_conduit_names_print=""
fi fi
......
...@@ -437,7 +437,7 @@ AC_DEFINE( UNUSED, __attribute__((unused)), define macro for unused variables) ...@@ -437,7 +437,7 @@ AC_DEFINE( UNUSED, __attribute__((unused)), define macro for unused variables)
if test x"$enable_distmem_gasnet" = xyes; then if test x"$enable_distmem_gasnet" = xyes; then
gasnet_conduit_names_print=" (conduits: $gasnet_conduit_names)" gasnet_conduit_names_print=" (conduits: $gasnet_conduits)"
else else
gasnet_conduit_names_print="" gasnet_conduit_names_print=""
fi fi
......
AC_DEFUN([EMPTY_DUMMY_MACRO]) AC_DEFUN([EMPTY_DUMMY_MACRO])
dnl check for Distributed Memory support AC_DEFUN([DISTMEM_INIT_DEFAULTS], dnl
AC_DEFUN([CHECK_DISTMEM], dnl
[ [
AC_ARG_ENABLE([distmem], AC_ARG_ENABLE([distmem],
[AS_HELP_STRING([--disable-distmem], [AS_HELP_STRING([--enable-distmem=x,y,z],
[Disable checking for Distributed Memory support])], [Enable distmem targets x,y,z, or use --disable-distmem to disable entirely.
[enable_distmem_gasnet=$enableval] Available targets: gasnet,gpi,mpi,armci.
[enable_distmem_gpi=$enableval] The default target is "auto" which enables whichever target can be found.])],
[enable_distmem_mpi=$enableval] [], [enable_distmem=auto])
[enable_distmem_armci=$enableval], enable_distmem_gasnet=no
[enable_distmem_gasnet=yes] enable_distmem_gpi=no
[enable_distmem_gpi=yes] enable_distmem_mpi=no
[enable_distmem_mpi=yes] enable_distmem_armci=no
[enable_distmem_armci=yes]) case $enable_distmem in
auto|yes)
if test x"$enable_distmem_gasnet" != xno; then enable_distmem_gasnet=auto
AC_ARG_ENABLE([distmem_gasnet], enable_distmem_gpi=auto
[AS_HELP_STRING([--disable-distmem_gasnet], enable_distmem_mpi=auto
[Disable checking for Distributed Memory GASNet support])], enable_distmem_armci=auto
[enable_distmem_gasnet=$enableval], ;;
[enable_distmem_gasnet=yes]) esac
fi
case $enable_distmem in *gasnet*) enable_distmem_gasnet=yes;; esac
if test x"$enable_distmem_mpi" != xno; then case $enable_distmem in *gpi*) enable_distmem_gpi=yes;; esac
AC_ARG_ENABLE([distmem_mpi], case $enable_distmem in *mpi*) enable_distmem_mpi=yes;; esac
[AS_HELP_STRING([--disable-distmem_mpi], case $enable_distmem in *armci*) enable_distmem_armci=yes;; esac
[Disable checking for Distributed Memory MPI support])], AC_ARG_ENABLE([distmem-gasnet], [AS_HELP_STRING([--disable-distmem-gasnet], [Disable the GASnet target.])])
[enable_distmem_mpi=$enableval], AC_ARG_ENABLE([distmem-gpi], [AS_HELP_STRING([--disable-distmem-gpi], [Disable the GPI target.])])
[enable_distmem_mpi=yes]) AC_ARG_ENABLE([distmem-mpi], [AS_HELP_STRING([--disable-distmem-mpi], [Disable the MPI target.])])
fi AC_ARG_ENABLE([distmem-armci], [AS_HELP_STRING([--disable-distmem-armci], [Disable the ARMci target.])])
if test x"$enable_distmem_armci" != xno; then
AC_ARG_ENABLE([distmem_armci],
[AS_HELP_STRING([--disable-distmem_armci],
[Disable checking for Distributed Memory ARMCI support])],
[enable_distmem_armci=$enableval],
[enable_distmem_armci=yes])
fi
if test x"$enable_distmem_gpi" != xno; then ])
AC_ARG_ENABLE([distmem_gpi],
[AS_HELP_STRING([--disable-distmem_gpi],
[Disable checking for Distributed Memory GPI support])],
[enable_distmem_gpi=$enableval],
[enable_distmem_gpi=yes])
fi
dnl Create GASNet conduit targets file.
cat >./sac2crc.GASNetconduits
dnl Create GASNet conduit build files.
cat >./build.GASNetconduits
cat >./build.GASNetconduitsCrossVariant
dnl Create GASNet conduit settings file.
cat >./config.GASNetconduits
if test x"$enable_distmem_mpi" != xno; then AC_DEFUN([CHECK_DISTMEM_MPI], dnl
[
AX_MPI([enable_distmem_mpi=yes], [enable_distmem_mpi=no]) AX_MPI([enable_distmem_mpi=yes], [enable_distmem_mpi=no])
if test x"$enable_distmem_mpi" != xno; then if test x"$enable_distmem_mpi" != xno; then
AC_MSG_CHECKING([for MPI 3 support]) AC_MSG_CHECKING([for MPI 3 support])
ax_mpi_save_CC="$CC" ax_mpi_save_CC="$CC"
CC="$MPICC" CC="$MPICC"
AC_TRY_COMPILE([#include <mpi.h>],[ AC_TRY_COMPILE([#include <mpi.h>],
/* This program uses MPI 3 one-sided communication to test whether the MPI installation does support these operations. */ [
int main(int argc, char *argv[]) { /* This program uses MPI 3 one-sided communication to test
static MPI_Win win = NULL; whether the MPI installation does support these operations. */
size_t SAC_DISTMEM_pagesz = 0; int main(int argc, char *argv[]) {
static MPI_Win win = NULL;
void *local_page_ptr = NULL; size_t SAC_DISTMEM_pagesz = 0;
size_t owner_rank = 0;
size_t remote_page_index; void *local_page_ptr = NULL;
size_t owner_rank = 0;
MPI_Get( local_page_ptr, SAC_DISTMEM_pagesz, MPI_BYTE, owner_rank, remote_page_index * SAC_DISTMEM_pagesz, SAC_DISTMEM_pagesz, MPI_BYTE, win); size_t remote_page_index;
}
],[AC_MSG_RESULT(yes)], [enable_distmem_mpi=no MPI_Get( local_page_ptr, SAC_DISTMEM_pagesz,
AC_MSG_RESULT(no)]) MPI_BYTE, owner_rank,
remote_page_index * SAC_DISTMEM_pagesz,
SAC_DISTMEM_pagesz, MPI_BYTE, win);
}
],
[AC_MSG_RESULT(yes)],
[enable_distmem_mpi=no;
AC_MSG_RESULT(no)])
CC="$ax_mpi_save_CC" CC="$ax_mpi_save_CC"
fi fi
fi ])
if test x"$enable_distmem_armci" != xno; then AC_DEFUN([CHECK_DISTMEM_ARMCI], dnl
AC_MSG_CHECKING(if ARMCI_HOME is set) [
enable_distmem_armci=no
AC_MSG_CHECKING([whether ARMCI_HOME is set])
if test x"$ARMCI_HOME" != x ; then if test x"$ARMCI_HOME" != x ; then
AC_MSG_RESULT([using ARMCI_HOME: $ARMCI_HOME]) AC_MSG_RESULT([using ARMCI_HOME: $ARMCI_HOME])
AC_MSG_CHECKING(if $ARMCI_HOME exists) AC_MSG_CHECKING([whether $ARMCI_HOME exists])
if test -r $ARMCI_HOME; then if test -r "$ARMCI_HOME"; then
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
AC_DEFINE_UNQUOTED([ARMCI_DIR], ["$ARMCI_HOME"], AC_DEFINE_UNQUOTED([ARMCI_DIR], ["$ARMCI_HOME"],
[ARMCI installation]) [ARMCI installation])
AC_SUBST([ARMCI_DIR], [$ARMCI_HOME]) AC_SUBST([ARMCI_DIR], [$ARMCI_HOME])
enable_distmem_armci=yes
else else
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
enable_distmem_armci=no
fi fi
else else
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
enable_distmem_armci=no
fi fi
fi ])
if test x"$enable_distmem_gpi" != xno; then AC_DEFUN([CHECK_DISTMEM_GPI], dnl
AC_MSG_CHECKING(if GPI_HOME is set) [
enable_distmem_gpi=no
AC_MSG_CHECKING([whether GPI_HOME is set])
if test x"$GPI_HOME" != x ; then if test x"$GPI_HOME" != x ; then
AC_MSG_RESULT([using GPI_HOME: $GPI_HOME]) AC_MSG_RESULT([using GPI_HOME: $GPI_HOME])
else AC_MSG_CHECKING([whether $GPI_HOME exists])
GPI_HOME=/opt/GPI2 if test -r "$GPI_HOME"; then
AC_MSG_RESULT([using default location: $GPI_HOME])
fi
AC_MSG_CHECKING(if $GPI_HOME exists)
if test -r $GPI_HOME; then
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
AC_DEFINE_UNQUOTED([GPI_DIR], ["$GPI_HOME"], AC_DEFINE_UNQUOTED([GPI_DIR], ["$GPI_HOME"],
[GPI installation]) [GPI installation])
AC_SUBST([GPI_DIR], [$GPI_HOME]) AC_SUBST([GPI_DIR], [$GPI_HOME])
else enable_distmem_gpi=yes
else
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
enable_distmem_gpi=no fi
else
AC_MSG_RESULT([no])
fi fi
fi ])
if test x"$enable_distmem_gasnet" != xno; then
################################################################################
#
# feature setup:
#
AC_MSG_CHECKING(if GASNET_HOME is set) AC_DEFUN([CHECK_DISTMEM_GASNET], dnl
[
enable_distmem_gastnet=no
AC_MSG_CHECKING([whether GASNET_HOME is set])
if test x"$GASNET_HOME" != x ; then if test x"$GASNET_HOME" != x ; then
gasnet_home="$GASNET_HOME" gasnet_home="$GASNET_HOME"
AC_MSG_RESULT([using GASNET_HOME: $gasnet_home]) AC_MSG_RESULT([using GASNET_HOME: $gasnet_home])
else
gasnet_home=/usr/local/gasnet AC_MSG_CHECKING([whether $gasnet_home exists])
AC_MSG_RESULT([using default location: $gasnet_home]) if test -r "$gasnet_home"; then
fi AC_MSG_RESULT([yes])
AC_MSG_CHECKING([for installed gasnet conduits])
gasnet_conduits=$(echo $( (cd "$gasnet_home/include" && ls -d *-conduit 2>/dev/null | cut -d- -f1 ) ) )
if test x"$gasnet_conduits" = x ; then
AC_MSG_RESULT([none])
else
AC_MSG_RESULT([$gasnet_conduits])
enable_distmem_gasnet=yes
fi
else
AC_MSG_RESULT([no])
fi
else
AC_MSG_RESULT([no])
fi
])
gasnet_conduit_names="" AC_DEFUN([GASNET_INIT], dnl
AC_MSG_CHECKING(if $gasnet_home exists) [
if test -r $gasnet_home; then dnl Create GASNet conduit targets file.
AC_MSG_RESULT([yes]) true >./sac2crc.GASNetconduits
AC_MSG_CHECKING(installed gasnet conduits)
cat <<EOF >>./config.GASNetconduits dnl Create GASNet conduit build files.
################################################################################ true >./build.GASNetconduits
# true >./build.GASNetconduitsCrossVariant
# GASNet conduit settings:
#
EOF dnl Create GASNet conduit settings file.
true >./config.GASNetconduits
for gasnet_conduit_path in $gasnet_home/include/*-conduit/; do for gasnet_conduit_name in $gasnet_conduits; do
gasnet_conduit_filename="$(basename "${gasnet_conduit_path}")" gasnet_conduit_path=$gasnet_home/include/$gasnet_conduit_name-conduit/
gasnet_conduit_name="${gasnet_conduit_filename//-conduit/}" gasnet_conduit_name_uc=$(echo $gasnet_conduit_name | tr '[a-z]' '[A-Z]')
gasnet_conduit_name_uc=`echo $gasnet_conduit_name | tr '[a-z]' '[A-Z]'` gasnet_conduit_makefile=$gasnet_conduit_path$gasnet_conduit_name-seq.mak
if test x"$gasnet_conduit_names" != x ; then
gasnet_conduit_names="$gasnet_conduit_names "
fi
gasnet_conduit_names="$gasnet_conduit_names$gasnet_conduit_name"
gasnet_conduit_makefile="$gasnet_conduit_path$gasnet_conduit_name-seq.mak"
gasnet_conduit_cc="$(getmakevar $gasnet_conduit_makefile GASNET_CC)" gasnet_conduit_cc=$(getmakevar $gasnet_conduit_makefile GASNET_CC)
gasnet_conduit_cppflags="$(getmakevar $gasnet_conduit_makefile GASNET_CPPFLAGS)" gasnet_conduit_cppflags=$(getmakevar $gasnet_conduit_makefile GASNET_CPPFLAGS)
gasnet_conduit_cflags="$(getmakevar $gasnet_conduit_makefile GASNET_CFLAGS)" gasnet_conduit_cflags=$(getmakevar $gasnet_conduit_makefile GASNET_CFLAGS)
gasnet_conduit_ld="$(getmakevar $gasnet_conduit_makefile GASNET_LD)" gasnet_conduit_ld=$(getmakevar $gasnet_conduit_makefile GASNET_LD)
gasnet_conduit_ldflags="$(getmakevar $gasnet_conduit_makefile GASNET_LDFLAGS)" gasnet_conduit_ldflags=$(getmakevar $gasnet_conduit_makefile GASNET_LDFLAGS)
gasnet_conduit_libs="$(getmakevar $gasnet_conduit_makefile GASNET_LIBS)" gasnet_conduit_libs=$(getmakevar $gasnet_conduit_makefile GASNET_LIBS)
cat <<EOF >>./sac2crc.GASNetconduits cat <<EOF >>./sac2crc.GASNetconduits
target distmem_gasnet_$gasnet_conduit_name::distmem_gasnet: target distmem_gasnet_$gasnet_conduit_name::distmem_gasnet:
COMMLIB_CONDUIT := "$gasnet_conduit_name" COMMLIB_CONDUIT := "$gasnet_conduit_name"
CC := "$gasnet_conduit_ld -std=gnu99" CC := "$gasnet_conduit_ld -std=gnu99"
...@@ -192,12 +181,11 @@ LDFLAGS += "$gasnet_conduit_ldflags" ...@@ -192,12 +181,11 @@ LDFLAGS += "$gasnet_conduit_ldflags"
EOF EOF
cat <<EOF >>./config.GASNetconduits cat <<EOF >>./config.GASNetconduits
GASNET_${gasnet_conduit_name_uc}_CC := $gasnet_conduit_cc -std=gnu99 GASNET_${gasnet_conduit_name_uc}_CC := $gasnet_conduit_cc -std=gnu99
GASNET_${gasnet_conduit_name_uc}_CPPFLAGS := $gasnet_conduit_cppflags GASNET_${gasnet_conduit_name_uc}_CPPFLAGS := $gasnet_conduit_cppflags
GASNET_${gasnet_conduit_name_uc}_CFLAGS := $gasnet_conduit_cflags GASNET_${gasnet_conduit_name_uc}_CFLAGS := $gasnet_conduit_cflags
GASNET_${gasnet_conduit_name}_cap := $gasnet_conduit_name_uc GASNET_${gasnet_conduit_name}_cap := $gasnet_conduit_name_uc
EOF EOF
dnl Append the rules for the libsacdistmem GASNet object files to build.mkf dnl Append the rules for the libsacdistmem GASNet object files to build.mkf
...@@ -236,49 +224,69 @@ EOF ...@@ -236,49 +224,69 @@ EOF
@\$(CLOCK_SKEW_ELIMINATION) @\$(CLOCK_SKEW_ELIMINATION)
EOF EOF
done done
if test x"$gasnet_conduit_names" = x ; then ])
AC_MSG_RESULT([none])
enable_distmem_gasnet=no AC_DEFUN([CHECK_DISTMEM_BACKEND], dnl
else [
AC_MSG_RESULT([$gasnet_conduit_names]) if test x"$enable_distmem_$1" != xno; then
fi expected=$enable_distmem_$1
else
AC_MSG_RESULT([no]) $2
enable_distmem_gasnet=no
if test x"$expected" = xyes -a x"$enable_distmem_$1" = xno; then
AC_MSG_ERROR($3)
fi fi
fi
])
if test x"$enable_distmem_gasnet" = xno -a x"$enable_distmem_gpi" = xno -a x"$enable_distmem_mpi" = xno -a x"$enable_distmem_armci" = xno ; then dnl check for Distributed Memory support
enable_distmem=no AC_DEFUN([CHECK_DISTMEM], dnl
[
DISTMEM_INIT_DEFAULTS
if test x"$enable_distmem" != xno; then
CHECK_DISTMEM_BACKEND([mpi], [CHECK_DISTMEM_MPI], [unable to find a working MPI back-end])
CHECK_DISTMEM_BACKEND([armci], [CHECK_DISTMEM_ARMCI], [AMRCI_HOME not set or ARMci directory not found])
CHECK_DISTMEM_BACKEND([gpi], [CHECK_DISTMEM_GPI], [GPI_HOME not set or GPI directory not found])
CHECK_DISTMEM_BACKEND([gasnet], [CHECK_DISTMEM_GASNET], [GASNET_HOME not set or directory not found or no GASnet conduits defined.])
if test x"$enable_distmem_gasnet" != xno; then
GASNET_INIT
fi
if test x"$enable_distmem_gasnet" = xno \
-a x"$enable_distmem_gpi" = xno \
-a x"$enable_distmem_mpi" = xno \
-a x"$enable_distmem_armci" = xno \
; then
if test x"$enable_distmem" != xauto; then
AC_MSG_ERROR([unable to find a suitable distmem back-end.])
fi
enable_distmem=no
else else
enable_distmem=yes enable_distmem=yes
fi fi
fi fi
have_distmem=`if test x"$enable_distmem" != xno; then echo 1; else echo 0; fi`
have_distmem_gasnet=`if test x"$enable_distmem_gasnet" != xno; then echo 1; else echo 0; fi` AC_DEFINE_UNQUOTED([ENABLE_DISTMEM], [`test x"$enable_distmem" = xno && echo 0 || echo 1`],
have_distmem_gpi=`if test x"$enable_distmem_gpi" != xno; then echo 1; else echo 0; fi`
have_distmem_mpi=`if test x"$enable_distmem_mpi" != xno; then echo 1; else echo 0; fi`
have_distmem_armci=`if test x"$enable_distmem_armci" != xno; then echo 1; else echo 0; fi`
AC_DEFINE_UNQUOTED([ENABLE_DISTMEM], [$have_distmem],
[Define to 1 if distributed memory support is enabled, otherwise 0.]) [Define to 1 if distributed memory support is enabled, otherwise 0.])
AC_DEFINE_UNQUOTED([ENABLE_DISTMEM_GASNET], [$have_distmem_gasnet], AC_DEFINE_UNQUOTED([ENABLE_DISTMEM_GASNET], [`test x"$enable_distmem_gasnet" = xno && echo 0 || echo 1`],
[Define to 1 if GASNet conduit is supported, otherwise 0.]) [Define to 1 if GASNet conduit is supported, otherwise 0.])
AC_DEFINE_UNQUOTED([DISTMEM_GASNET_CONDUITS], ["$gasnet_conduit_names"], AC_DEFINE_UNQUOTED([DISTMEM_GASNET_CONDUITS], ["$gasnet_conduits"],
[Available GASNet conduits.]) [Available GASNet conduits.])
AC_DEFINE_UNQUOTED([ENABLE_DISTMEM_GPI], [$have_distmem_gpi], AC_DEFINE_UNQUOTED([ENABLE_DISTMEM_GPI], [`test x"$enable_distmem_gpi" = xno && echo 0 || echo 1`],
[Define to 1 if GPI conduit is supported, otherwise 0.]) [Define to 1 if GPI conduit is supported, otherwise 0.])
AC_DEFINE_UNQUOTED([ENABLE_DISTMEM_MPI], [$have_distmem_mpi], AC_DEFINE_UNQUOTED([ENABLE_DISTMEM_MPI], [`test x"$enable_distmem_mpi" = xno && echo 0 || echo 1`],
[Define to 1 if MPI conduit is supported, otherwise 0.]) [Define to 1 if MPI conduit is supported, otherwise 0.])
AC_DEFINE_UNQUOTED([ENABLE_DISTMEM_ARMCI], [$have_distmem_armci], AC_DEFINE_UNQUOTED([ENABLE_DISTMEM_ARMCI], [`test x"$enable_distmem_armci" = xno && echo 0 || echo 1`],
[Define to 1 if ARMCI conduit is supported, otherwise 0.]) [Define to 1 if ARMCI conduit is supported, otherwise 0.])
AC_SUBST([ENABLE_DISTMEM], [$enable_distmem]) AC_SUBST([ENABLE_DISTMEM], [$enable_distmem])
AC_SUBST([ENABLE_DISTMEM_GASNET], [$enable_distmem_gasnet]) AC_SUBST([ENABLE_DISTMEM_GASNET], [$enable_distmem_gasnet])
AC_SUBST([DISTMEM_GASNET_CONDUITS], [$gasnet_conduit_names]) AC_SUBST([DISTMEM_GASNET_CONDUITS], [$gasnet_conduits])
AC_SUBST([ENABLE_DISTMEM_GPI], [$enable_distmem_gpi]) AC_SUBST([ENABLE_DISTMEM_GPI], [$enable_distmem_gpi])
AC_SUBST([ENABLE_DISTMEM_MPI], [$enable_distmem_mpi]) AC_SUBST([ENABLE_DISTMEM_MPI], [$enable_distmem_mpi])
AC_SUBST([ENABLE_DISTMEM_ARMCI], [$enable_distmem_armci]) AC_SUBST([ENABLE_DISTMEM_ARMCI], [$enable_distmem_armci])
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment