commits
Threads by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
July 2014
- 1 participants
- 63 discussions
[mpich] MPICH primary repository branch, master, updated. v3.1.1-96-g299bfd40
by noreply@mpich.org 14 Jul '14
by noreply@mpich.org 14 Jul '14
14 Jul '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 299bfd406a68b22ee0b14a10f60780d5acf30129 (commit)
via 7ba66aff0671fe03945a07df34c4f495619b0b12 (commit)
via abe3cfc65146ec1391688d733f0cb5942ffc7014 (commit)
via 50de30865f12ea03052aa00ce8eb1afced249967 (commit)
via 4b1186c76827fb8a20d1fb2174e9df3b5f6a1693 (commit)
via 7d793095742dabd93d0e34a9cfa123af757948ba (commit)
from 5b674543acfc345abd174577761a35651c740d69 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/299bfd406a68b22ee0b14a10f60780d5a…
commit 299bfd406a68b22ee0b14a10f60780d5acf30129
Author: Paul Coffman <pkcoff(a)us.ibm.com>
Date: Wed Jul 9 11:33:32 2014 -0500
migrate ranklist from agents aggregators
missed some comment and algorithm changes for ADIOI_PE_gen_agg_ranklist
during branch migration
Signed-off-by: Rob Latham <robl(a)mcs.anl.gov>
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
index a727a4f..2098b85 100644
--- a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
+++ b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
@@ -33,11 +33,22 @@
#endif
/*
- * Compute the aggregator-related parameters that are required in 2-phase collective IO of ADIO.
+ * Compute the aggregator-related parameters that are required in 2-phase
+ * collective IO of ADIO.
* The parameters are
* . the number of aggregators (proxies) : fd->hints->cb_nodes
* . the ranks of the aggregators : fd->hints->ranklist
- * For now set these based on MP_IOTASKLIST
+ * If MP_IONODEFILE is defined, POE determines all tasks on every node listed
+ * in the node file and defines MP_IOTASKLIST with them, making them all
+ * aggregators. Alternatively, the user can explictly set MP_IOTASKLIST
+ * themselves. The format of the MP_IOTASKLIST is a colon-delimited list of
+ * task ids, the first entry being the total number of aggregators, for example
+ * to specify 4 aggregators on task ids 0,8,16,24 the value would be:
+ * 4:0:8:16:24. If there is no MP_IONODEFILE, or MP_IOTASKLIST, then the
+ * default aggregator selection is 1 task per node for every node of the job -
+ * additionally, an environment variable MP_IOAGGR_CNT can be specified, which
+ * defines the total number of aggregators, spread evenly across all the nodes.
+ * The romio_cb_nodes and romio_cb_config_list hint user settings are ignored.
*/
int
ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
@@ -45,7 +56,7 @@ ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
int numAggs = 0;
char *ioTaskList = getenv( "MP_IOTASKLIST" );
- char *ioAgentCount = getenv("MP_IOAGENT_CNT");
+ char *ioAggrCount = getenv("MP_IOAGGR_CNT");
int i,j;
int inTERcommFlag = 0;
@@ -107,7 +118,7 @@ ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
MPI_Allgather(MPI_IN_PLACE, 1, MPI_INT, allNodeRanks, 1, MPI_INT, fd->comm);
#ifdef AGG_DEBUG
- printf("MPID_Comm data: remote_size is %d local_size is %d\nintranode_table entries:\n",mpidCommData->remote_size,mpidCommData->local_size);
+ printf("MPID_Comm data: local_size is %d\nintranode_table entries:\n",mpidCommData->local_size);
for (i=0;i<localSize;i++) {
printf("%d ",mpidCommData->intranode_table[i]);
}
@@ -117,7 +128,7 @@ ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
}
printf("\n");
- printf("\allNodeRanks entries:\n");
+ printf("\nallNodeRanks entries:\n");
for (i=0;i<localSize;i++) {
printf("%d ",allNodeRanks[i]);
}
@@ -125,25 +136,25 @@ ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
#endif
- if (ioAgentCount) {
+ if (ioAggrCount) {
int cntType = -1;
- if ( strcasecmp(ioAgentCount, "ALL") ) {
- if ( (cntType = atoi(ioAgentCount)) <= 0 ) {
+ if ( strcasecmp(ioAggrCount, "ALL") ) {
+ if ( (cntType = atoi(ioAggrCount)) <= 0 ) {
/* Input is other non-digit or less than 1 the assume */
- /* 1 agent per node. Note: atoi(-1) reutns -1. */
+ /* 1 aggregator per node. Note: atoi(-1) reutns -1. */
/* No warning message given here -- done earlier. */
cntType = -1;
}
}
else {
- /* ALL is specified set agent count to localSize */
+ /* ALL is specified set aggr count to localSize */
cntType = -2;
}
switch(cntType) {
case -1:
- /* 1 agent/node case */
- {
+ /* 1 aggr/node case */
+ {
int rankListIndex = 0;
fd->hints->ranklist = (int *) ADIOI_Malloc (localSize * sizeof(int));
for (i=0;i<localSize;i++) {
@@ -152,7 +163,7 @@ ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
numAggs++;
}
}
- }
+ }
break;
case -2:
/* ALL tasks case */
@@ -163,59 +174,56 @@ ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
}
break;
default:
- /* Specific agent count case -- MUST be less than localSize. */
- if (cntType <= localSize) {
- numAggs = cntType;
- // Round-robin thru allNodeRanks - pick the 0's, then the 1's, etc
- int currentNodeRank = 0; // node rank currently being selected as aggregator
- int rankListIndex = 0;
- int currentAllNodeIndex = 0;
-
- fd->hints->ranklist = (int *) ADIOI_Malloc (numAggs * sizeof(int));
-
- while (rankListIndex < numAggs) {
-
- int foundEntry = 0;
- while (!foundEntry && (currentAllNodeIndex < localSize)) {
- if (allNodeRanks[currentAllNodeIndex] == currentNodeRank) {
- fd->hints->ranklist[rankListIndex++] = currentAllNodeIndex;
- foundEntry = 1;
- }
- currentAllNodeIndex++;
- }
- if (!foundEntry) {
- currentNodeRank++;
- currentAllNodeIndex = 0;
- }
- } // while
- } // (cntType <= localSize)
- else {
- ADIOI_Assert(1);
- }
- break;
- } // switch(cntType)
- } // if (ioAgentCount)
+ /* Specific aggr count case -- MUST be less than localSize, otherwise set to localSize */
+ if (cntType > localSize)
+ cntType = localSize;
+
+ numAggs = cntType;
+ // Round-robin thru allNodeRanks - pick the 0's, then the 1's, etc
+ int currentNodeRank = 0; // node rank currently being selected as aggregator
+ int rankListIndex = 0;
+ int currentAllNodeIndex = 0;
+
+ fd->hints->ranklist = (int *) ADIOI_Malloc (numAggs * sizeof(int));
+
+ while (rankListIndex < numAggs) {
+ int foundEntry = 0;
+ while (!foundEntry && (currentAllNodeIndex < localSize)) {
+ if (allNodeRanks[currentAllNodeIndex] == currentNodeRank) {
+ fd->hints->ranklist[rankListIndex++] = currentAllNodeIndex;
+ foundEntry = 1;
+ }
+ currentAllNodeIndex++;
+ }
+ if (!foundEntry) {
+ currentNodeRank++;
+ currentAllNodeIndex = 0;
+ }
+ } // while
+ break;
+ } // switch(cntType)
+ } // if (ioAggrCount)
else { // default is 1 aggregator per node
// take the 0 entries from allNodeRanks
- int rankListIndex = 0;
- fd->hints->ranklist = (int *) ADIOI_Malloc (localSize * sizeof(int));
- for (i=0;i<localSize;i++) {
- if (allNodeRanks[i] == 0) {
- fd->hints->ranklist[rankListIndex++] = i;
- numAggs++;
- }
+ int rankListIndex = 0;
+ fd->hints->ranklist = (int *) ADIOI_Malloc (localSize * sizeof(int));
+ for (i=0;i<localSize;i++) {
+ if (allNodeRanks[i] == 0) {
+ fd->hints->ranklist[rankListIndex++] = i;
+ numAggs++;
}
+ }
}
}
- if ( getenv("MP_I_SHOW_AGENTS") ) {
+ if ( getenv("MP_I_SHOW_AGGRS") ) {
if (myRank == 0) {
- printf("Agg rank list of %d generated:\n", numAggs);
- for (i=0;i<numAggs;i++) {
- printf("%d ",fd->hints->ranklist[i]);
- }
- printf("\n");
+ printf("Agg rank list of %d generated:\n", numAggs);
+ for (i=0;i<numAggs;i++) {
+ printf("%d ",fd->hints->ranklist[i]);
+ }
+ printf("\n");
}
}
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.h b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.h
index 4498b39..f779d18 100644
--- a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.h
+++ b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.h
@@ -24,7 +24,7 @@
#define GPFS_SUPER_MAGIC (0x47504653)
#endif
- /* generate a list of I/O aggregators for now based on the MP_IOTASKLIST. */
+ /* generate a list of I/O aggregators following a methodology specific for PE */
int ADIOI_PE_gen_agg_ranklist(ADIO_File fd);
#endif /* AD_PE_AGGRS_H_ */
http://git.mpich.org/mpich.git/commitdiff/7ba66aff0671fe03945a07df34c4f4956…
commit 7ba66aff0671fe03945a07df34c4f495619b0b12
Author: Paul Coffman <pkcoff(a)us.ibm.com>
Date: Tue Jul 8 21:52:53 2014 -0500
bg and pe to gpfs hints consolidation
Signed-off-by: Rob Latham <robl(a)mcs.anl.gov>
diff --git a/src/mpi/romio/adio/ad_gpfs/Makefile.mk b/src/mpi/romio/adio/ad_gpfs/Makefile.mk
index 72fedef..db8737b 100644
--- a/src/mpi/romio/adio/ad_gpfs/Makefile.mk
+++ b/src/mpi/romio/adio/ad_gpfs/Makefile.mk
@@ -19,6 +19,7 @@ romio_other_sources += \
adio/ad_gpfs/ad_gpfs_tuning.c \
adio/ad_gpfs/ad_gpfs.c \
adio/ad_gpfs/ad_gpfs_open.c \
+ adio/ad_gpfs/ad_gpfs_hints.c \
adio/ad_gpfs/ad_gpfs_rdcoll.c \
adio/ad_gpfs/ad_gpfs_wrcoll.c
diff --git a/src/mpi/romio/adio/ad_gpfs/ad_gpfs.c b/src/mpi/romio/adio/ad_gpfs/ad_gpfs.c
index 8fc4939..73a4b58 100644
--- a/src/mpi/romio/adio/ad_gpfs/ad_gpfs.c
+++ b/src/mpi/romio/adio/ad_gpfs/ad_gpfs.c
@@ -25,12 +25,10 @@ struct ADIOI_Fns_struct ADIO_GPFS_operations = {
ADIOI_GPFS_WriteStridedColl, /* WriteStridedColl */
ADIOI_GEN_SeekIndividual, /* SeekIndividual */
ADIOI_GEN_Fcntl, /* Fcntl */
-#ifdef BGQPLATFORM
- ADIOI_BG_SetInfo, /* SetInfo */
-#elif PEPLATFORM
- ADIOI_PE_SetInfo, /* SetInfo */
+#if defined(BGQPLATFORM) || defined(PEPLATFORM)
+ ADIOI_GPFS_SetInfo, /* SetInfo for BlueGene or PE */
#else
- ADIOI_GEN_SetInfo, /* SetInfo */
+ ADIOI_GEN_SetInfo, /* SetInfo for any platform besides BlueGene or PE */
#endif
ADIOI_GEN_ReadStrided, /* ReadStrided */
ADIOI_GEN_WriteStrided, /* WriteStrided */
diff --git a/src/mpi/romio/adio/ad_gpfs/ad_gpfs.h b/src/mpi/romio/adio/ad_gpfs/ad_gpfs.h
index 686a7e5..81fb076 100644
--- a/src/mpi/romio/adio/ad_gpfs/ad_gpfs.h
+++ b/src/mpi/romio/adio/ad_gpfs/ad_gpfs.h
@@ -42,11 +42,7 @@ void ADIOI_GPFS_WriteContig(ADIO_File fd, const void *buf, int count,
ADIO_Offset offset, ADIO_Status *status, int
*error_code);
-#ifdef BGQPLATFORM
-void ADIOI_BG_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
-#elif PEPLATFORM
-void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
-#endif
+void ADIOI_GPFS_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
void ADIOI_GPFS_WriteStrided(ADIO_File fd, const void *buf, int count,
MPI_Datatype datatype, int file_ptr_type,
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_hints.c b/src/mpi/romio/adio/ad_gpfs/ad_gpfs_hints.c
similarity index 76%
rename from src/mpi/romio/adio/ad_gpfs/pe/ad_pe_hints.c
rename to src/mpi/romio/adio/ad_gpfs/ad_gpfs_hints.c
index 21cb45f..7af0a0c 100644
--- a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_hints.c
+++ b/src/mpi/romio/adio/ad_gpfs/ad_gpfs_hints.c
@@ -2,8 +2,8 @@
/* (C)Copyright IBM Corp. 2007, 2008 */
/* ---------------------------------------------------------------- */
/**
- * \file ad_pe_hints.c
- * \brief PE hint processing
+ * \file ad_gpfs_hints.c
+ * \brief GPFS hint processing - for now, only used for BlueGene and PE platforms
*/
/* -*- Mode: C; c-basic-offset:4 ; -*- */
@@ -16,17 +16,28 @@
#include "adio_extern.h"
#include "hint_fns.h"
-#include "../ad_gpfs.h"
-#include "ad_pe_aggrs.h"
+#include "ad_gpfs.h"
+
+#define ADIOI_GPFS_CB_BUFFER_SIZE_DFLT "16777216"
+#define ADIOI_GPFS_IND_RD_BUFFER_SIZE_DFLT "4194304"
+#define ADIOI_GPFS_IND_WR_BUFFER_SIZE_DFLT "4194304"
+
+#ifdef BGQPLATFORM
+#define ADIOI_BG_NAGG_IN_PSET_HINT_NAME "bg_nodes_pset"
+#endif
-#define ADIOI_PE_CB_BUFFER_SIZE_DFLT "16777216"
-#define ADIOI_PE_IND_RD_BUFFER_SIZE_DFLT "4194304"
-#define ADIOI_PE_IND_WR_BUFFER_SIZE_DFLT "4194304"
/** \page mpiio_vars MPIIO Configuration
*
- * PE MPIIO configuration and performance tuning. Used by ad_gpfs ADIO.
+ * GPFS MPIIO configuration and performance tuning. Used by ad_gpfs ADIO.
+ *
+ * Used for BlueGene and PE platforms, which each have their own aggregator selection
+ * algorithms that ignore user provided cb_config_list.
*
* \section hint_sec Hints
+ * - bg_nodes_pset - BlueGene only - specify how many aggregators to use per pset.
+ * This hint will override the cb_nodes hint based on BlueGene psets.
+ * - N - Use N nodes per pset as aggregators.
+ * - Default is based on partition configuration and cb_nodes.
*
* The following default key/value pairs may differ from other platform defaults.
*
@@ -37,7 +48,16 @@
* - key = ind_wr_buffer_size value = 4194304
*/
-void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
+#ifdef BGQPLATFORM
+/* Compute the aggregator-related parameters that are required in 2-phase collective IO of ADIO. */
+extern int
+ADIOI_BG_gen_agg_ranklist(ADIO_File fd, int n_proxy_per_pset);
+#elif PEPLATFORM
+extern int
+ADIOI_PE_gen_agg_ranklist(ADIO_File fd);
+#endif
+
+void ADIOI_GPFS_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
{
/* if fd->info is null, create a new info object.
Initialize fd->info to default values.
@@ -48,7 +68,7 @@ void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
MPI_Info info;
char *value;
int flag, intval, nprocs=0, nprocs_is_valid = 0;
- static char myname[] = "ADIOI_PE_SetInfo";
+ static char myname[] = "ADIOI_GPFS_SETINFO";
int did_anything = 0;
@@ -71,8 +91,8 @@ void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
did_anything = 1;
/* buffer size for collective I/O */
- ADIOI_Info_set(info, "cb_buffer_size", ADIOI_PE_CB_BUFFER_SIZE_DFLT);
- fd->hints->cb_buffer_size = atoi(ADIOI_PE_CB_BUFFER_SIZE_DFLT);
+ ADIOI_Info_set(info, "cb_buffer_size", ADIOI_GPFS_CB_BUFFER_SIZE_DFLT);
+ fd->hints->cb_buffer_size = atoi(ADIOI_GPFS_CB_BUFFER_SIZE_DFLT);
/* default is to let romio automatically decide when to use
* collective buffering
@@ -90,13 +110,13 @@ void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
nprocs_is_valid = 1;
ADIOI_Snprintf(value, MPI_MAX_INFO_VAL+1, "%d", nprocs);
ADIOI_Info_set(info, "cb_nodes", value);
- fd->hints->cb_nodes = nprocs; // initialize to nprocs
+ fd->hints->cb_nodes = -1;
/* hint indicating that no indep. I/O will be performed on this file */
ADIOI_Info_set(info, "romio_no_indep_rw", "false");
fd->hints->no_indep_rw = 0;
- /* PE is not implementing file realms (ADIOI_IOStridedColl),
+ /* gpfs is not implementing file realms (ADIOI_IOStridedColl),
initialize to disabled it. */
/* hint instructing the use of persistent file realms */
ADIOI_Info_set(info, "romio_cb_pfr", "disable");
@@ -123,31 +143,18 @@ void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
fd->hints->deferred_open = 0;
/* buffer size for data sieving in independent reads */
- ADIOI_Info_set(info, "ind_rd_buffer_size", ADIOI_PE_IND_RD_BUFFER_SIZE_DFLT);
- fd->hints->ind_rd_buffer_size = atoi(ADIOI_PE_IND_RD_BUFFER_SIZE_DFLT);
+ ADIOI_Info_set(info, "ind_rd_buffer_size", ADIOI_GPFS_IND_RD_BUFFER_SIZE_DFLT);
+ fd->hints->ind_rd_buffer_size = atoi(ADIOI_GPFS_IND_RD_BUFFER_SIZE_DFLT);
/* buffer size for data sieving in independent writes */
- ADIOI_Info_set(info, "ind_wr_buffer_size", ADIOI_PE_IND_WR_BUFFER_SIZE_DFLT);
- fd->hints->ind_wr_buffer_size = atoi(ADIOI_PE_IND_WR_BUFFER_SIZE_DFLT);
-
- if(fd->file_system == ADIO_UFS)
- {
- /* default for ufs/pvfs is to disable data sieving */
- ADIOI_Info_set(info, "romio_ds_read", "disable");
- fd->hints->ds_read = ADIOI_HINT_DISABLE;
- ADIOI_Info_set(info, "romio_ds_write", "disable");
- fd->hints->ds_write = ADIOI_HINT_DISABLE;
- }
- else
- {
- /* default is to let romio automatically decide when to use data
- * sieving
- */
+ ADIOI_Info_set(info, "ind_wr_buffer_size", ADIOI_GPFS_IND_WR_BUFFER_SIZE_DFLT);
+ fd->hints->ind_wr_buffer_size = atoi(ADIOI_GPFS_IND_WR_BUFFER_SIZE_DFLT);
+
+
ADIOI_Info_set(info, "romio_ds_read", "automatic");
fd->hints->ds_read = ADIOI_HINT_AUTO;
ADIOI_Info_set(info, "romio_ds_write", "automatic");
fd->hints->ds_write = ADIOI_HINT_AUTO;
- }
/* still to do: tune this a bit for a variety of file systems. there's
* no good default value so just leave it unset */
@@ -161,7 +168,6 @@ void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
if (users_info != MPI_INFO_NULL) {
ADIOI_Info_check_and_install_int(fd, users_info, "cb_buffer_size",
&(fd->hints->cb_buffer_size), myname, error_code);
-
/* new hints for enabling/disabling coll. buffering on
* reads/writes
*/
@@ -179,7 +185,6 @@ void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
ADIOI_Info_set(info, "romio_no_indep_rw", "false");
fd->hints->no_indep_rw = ADIOI_HINT_DISABLE;
}
-
/* Has the user indicated all I/O will be done collectively? */
ADIOI_Info_check_and_install_true(fd, users_info, "romio_no_indep_rw",
&(fd->hints->no_indep_rw), myname, error_code);
@@ -201,14 +206,11 @@ void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_ds_write",
&(fd->hints->ds_write), myname, error_code);
-
-
ADIOI_Info_check_and_install_int(fd, users_info, "ind_wr_buffer_size",
&(fd->hints->ind_wr_buffer_size), myname, error_code);
ADIOI_Info_check_and_install_int(fd, users_info, "ind_rd_buffer_size",
&(fd->hints->ind_rd_buffer_size), myname, error_code);
-
memset( value, 0, MPI_MAX_INFO_VAL+1 );
ADIOI_Info_get(users_info, "romio_min_fdomain_size", MPI_MAX_INFO_VAL,
value, &flag);
@@ -221,11 +223,26 @@ void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
ADIOI_Info_check_and_install_int(fd, users_info, "striping_unit",
&(fd->hints->striping_unit), myname, error_code);
+#ifdef BGQPLATFORM
+ memset( value, 0, MPI_MAX_INFO_VAL+1 );
+ ADIOI_Info_get(users_info, ADIOI_BG_NAGG_IN_PSET_HINT_NAME, MPI_MAX_INFO_VAL,
+ value, &flag);
+ if (flag && ((intval = atoi(value)) > 0)) {
+
+ did_anything = 1;
+ ADIOI_Info_set(info, ADIOI_BG_NAGG_IN_PSET_HINT_NAME, value);
+ fd->hints->cb_nodes = intval;
+ }
+#endif
}
- /* associate CB aggregators to certain CNs in every involved PSET */
+ /* special CB aggregator assignment */
if (did_anything) {
+#ifdef BGQPLATFORM
+ ADIOI_BG_gen_agg_ranklist(fd, fd->hints->cb_nodes);
+#elif PEPLATFORM
ADIOI_PE_gen_agg_ranklist(fd);
+#endif
}
/* deferred_open won't be set by callers, but if the user doesn't
@@ -246,7 +263,9 @@ void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
fd->hints->deferred_open = 0;
}
- /* we need to keep DS writes enabled on gpfs and disabled on PVFS */
+ /* BobC commented this out, but since hint processing runs on both bg and
+ * bglockless, we need to keep DS writes enabled on gpfs and disabled on
+ * PVFS */
if (ADIO_Feature(fd, ADIO_DATA_SIEVING_WRITES) == 0) {
/* disable data sieving for fs that do not
support file locking */
diff --git a/src/mpi/romio/adio/ad_gpfs/bg/Makefile.mk b/src/mpi/romio/adio/ad_gpfs/bg/Makefile.mk
index f54727e..1d957ef 100644
--- a/src/mpi/romio/adio/ad_gpfs/bg/Makefile.mk
+++ b/src/mpi/romio/adio/ad_gpfs/bg/Makefile.mk
@@ -13,7 +13,6 @@ noinst_HEADERS += \
romio_other_sources += \
adio/ad_gpfs/bg/ad_bg_aggrs.c \
- adio/ad_gpfs/bg/ad_bg_hints.c \
adio/ad_gpfs/bg/ad_bg_pset.c
endif BUILD_AD_BG
diff --git a/src/mpi/romio/adio/ad_gpfs/bg/ad_bg_hints.c b/src/mpi/romio/adio/ad_gpfs/bg/ad_bg_hints.c
deleted file mode 100644
index 6669b30..0000000
--- a/src/mpi/romio/adio/ad_gpfs/bg/ad_bg_hints.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/* ---------------------------------------------------------------- */
-/* (C)Copyright IBM Corp. 2007, 2008 */
-/* ---------------------------------------------------------------- */
-/**
- * \file ad_bg_hints.c
- * \brief BlueGene hint processing
- */
-
-/* -*- Mode: C; c-basic-offset:4 ; -*- */
-/*
- * Copyright (C) 1997 University of Chicago.
- * See COPYRIGHT notice in top-level directory.
- */
-
-#include "adio.h"
-#include "adio_extern.h"
-#include "hint_fns.h"
-
-#include "../ad_gpfs.h"
-#include "ad_bg_pset.h"
-#include "ad_bg_aggrs.h"
-
-#define ADIOI_BG_CB_BUFFER_SIZE_DFLT "16777216"
-#define ADIOI_BG_IND_RD_BUFFER_SIZE_DFLT "4194304"
-#define ADIOI_BG_IND_WR_BUFFER_SIZE_DFLT "4194304"
-#define ADIOI_BG_NAGG_IN_PSET_HINT_NAME "bg_nodes_pset"
-/** \page mpiio_vars MPIIO Configuration
- *
- * BlueGene MPIIO configuration and performance tuning. Used by ad_gpfs ADIO.
- *
- * \section hint_sec Hints
- * - bg_nodes_pset - Specify how many aggregators to use per pset.
- * This hint will override the cb_nodes hint based on BlueGene psets.
- * - N - Use N nodes per pset as aggregators.
- * - Default is based on partition configuration and cb_nodes.
- *
- * The following default key/value pairs may differ from other platform defaults.
- *
- * - key = cb_buffer_size value = 16777216
- * - key = romio_cb_read value = enable
- * - key = romio_cb_write value = enable
- * - key = ind_rd_buffer_size value = 4194304
- * - key = ind_wr_buffer_size value = 4194304
- */
-
-/* Compute the aggregator-related parameters that are required in 2-phase collective IO of ADIO. */
-extern int
-ADIOI_BG_gen_agg_ranklist(ADIO_File fd, int n_proxy_per_pset);
-
-void ADIOI_BG_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
-{
-/* if fd->info is null, create a new info object.
- Initialize fd->info to default values.
- Initialize fd->hints to default values.
- Examine the info object passed by the user. If it contains values that
- ROMIO understands, override the default. */
-
- MPI_Info info;
- char *value;
- int flag, intval, nprocs=0, nprocs_is_valid = 0;
- static char myname[] = "ADIOI_BG_SETINFO";
-
- int did_anything = 0;
-
- if (fd->info == MPI_INFO_NULL) MPI_Info_create(&(fd->info));
- info = fd->info;
-
- /* Note that fd->hints is allocated at file open time; thus it is
- * not necessary to allocate it, or check for allocation, here.
- */
-
- value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
- ADIOI_Assert ((value != NULL));
-
- /* initialize info and hints to default values if they haven't been
- * previously initialized
- */
- if (!fd->hints->initialized) {
-
- ad_gpfs_get_env_vars();
- did_anything = 1;
-
- /* buffer size for collective I/O */
- ADIOI_Info_set(info, "cb_buffer_size", ADIOI_BG_CB_BUFFER_SIZE_DFLT);
- fd->hints->cb_buffer_size = atoi(ADIOI_BG_CB_BUFFER_SIZE_DFLT);
-
- /* default is to let romio automatically decide when to use
- * collective buffering
- */
- ADIOI_Info_set(info, "romio_cb_read", "enable");
- fd->hints->cb_read = ADIOI_HINT_ENABLE;
- ADIOI_Info_set(info, "romio_cb_write", "enable");
- fd->hints->cb_write = ADIOI_HINT_ENABLE;
-
- if ( fd->hints->cb_config_list != NULL ) ADIOI_Free (fd->hints->cb_config_list);
- fd->hints->cb_config_list = NULL;
-
- /* number of processes that perform I/O in collective I/O */
- MPI_Comm_size(fd->comm, &nprocs);
- nprocs_is_valid = 1;
- ADIOI_Snprintf(value, MPI_MAX_INFO_VAL+1, "%d", nprocs);
- ADIOI_Info_set(info, "cb_nodes", value);
- fd->hints->cb_nodes = -1;
-
- /* hint indicating that no indep. I/O will be performed on this file */
- ADIOI_Info_set(info, "romio_no_indep_rw", "false");
- fd->hints->no_indep_rw = 0;
-
- /* bg is not implementing file realms (ADIOI_IOStridedColl),
- initialize to disabled it. */
- /* hint instructing the use of persistent file realms */
- ADIOI_Info_set(info, "romio_cb_pfr", "disable");
- fd->hints->cb_pfr = ADIOI_HINT_DISABLE;
-
- /* hint guiding the assignment of persistent file realms */
- ADIOI_Info_set(info, "romio_cb_fr_types", "aar");
- fd->hints->cb_fr_type = ADIOI_FR_AAR;
-
- /* hint to align file realms with a certain byte value */
- ADIOI_Info_set(info, "romio_cb_fr_alignment", "1");
- fd->hints->cb_fr_alignment = 1;
-
- /* hint to set a threshold percentage for a datatype's size/extent at
- * which data sieving should be done in collective I/O */
- ADIOI_Info_set(info, "romio_cb_ds_threshold", "0");
- fd->hints->cb_ds_threshold = 0;
-
- /* hint to switch between point-to-point or all-to-all for two-phase */
- ADIOI_Info_set(info, "romio_cb_alltoall", "automatic");
- fd->hints->cb_alltoall = ADIOI_HINT_AUTO;
-
- /* deferred_open derived from no_indep_rw and cb_{read,write} */
- fd->hints->deferred_open = 0;
-
- /* buffer size for data sieving in independent reads */
- ADIOI_Info_set(info, "ind_rd_buffer_size", ADIOI_BG_IND_RD_BUFFER_SIZE_DFLT);
- fd->hints->ind_rd_buffer_size = atoi(ADIOI_BG_IND_RD_BUFFER_SIZE_DFLT);
-
- /* buffer size for data sieving in independent writes */
- ADIOI_Info_set(info, "ind_wr_buffer_size", ADIOI_BG_IND_WR_BUFFER_SIZE_DFLT);
- fd->hints->ind_wr_buffer_size = atoi(ADIOI_BG_IND_WR_BUFFER_SIZE_DFLT);
-
- if(fd->file_system == ADIO_UFS)
- {
- /* default for ufs/pvfs is to disable data sieving */
- ADIOI_Info_set(info, "romio_ds_read", "disable");
- fd->hints->ds_read = ADIOI_HINT_DISABLE;
- ADIOI_Info_set(info, "romio_ds_write", "disable");
- fd->hints->ds_write = ADIOI_HINT_DISABLE;
- }
- else
- {
- /* default is to let romio automatically decide when to use data
- * sieving
- */
- ADIOI_Info_set(info, "romio_ds_read", "automatic");
- fd->hints->ds_read = ADIOI_HINT_AUTO;
- ADIOI_Info_set(info, "romio_ds_write", "automatic");
- fd->hints->ds_write = ADIOI_HINT_AUTO;
- }
-
- /* still to do: tune this a bit for a variety of file systems. there's
- * no good default value so just leave it unset */
- fd->hints->min_fdomain_size = 0;
- fd->hints->striping_unit = 0;
-
- fd->hints->initialized = 1;
- }
-
- /* add in user's info if supplied */
- if (users_info != MPI_INFO_NULL) {
- ADIOI_Info_check_and_install_int(fd, users_info, "cb_buffer_size",
- &(fd->hints->cb_buffer_size), myname, error_code);
-#if 0
- /* bg is not implementing file realms (ADIOI_IOStridedColl) ... */
- /* aligning file realms to certain sizes (e.g. stripe sizes)
- * may benefit I/O performance */
- ADIOI_Info_check_and_install_int(fd, users_info, "romio_cb_fr_alignment",
- &(fd->hints->cb_fr_alignment), myname, error_code);
-
- /* for collective I/O, try to be smarter about when to do data sieving
- * using a specific threshold for the datatype size/extent
- * (percentage 0-100%) */
- ADIOI_Info_check_and_install_int(fd, users_info, "romio_cb_ds_threshold",
- &(fd->hints->cb_ds_threshold), myname, error_code);
-
- ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_cb_alltoall",
- &(fd->hints->cb_alltoall), myname, error_code);
-#endif
- /* new hints for enabling/disabling coll. buffering on
- * reads/writes
- */
- ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_cb_read",
- &(fd->hints->cb_read), myname, error_code);
- if (fd->hints->cb_read == ADIOI_HINT_DISABLE) {
- /* romio_cb_read overrides no_indep_rw */
- ADIOI_Info_set(info, "romio_no_indep_rw", "false");
- fd->hints->no_indep_rw = ADIOI_HINT_DISABLE;
- }
- ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_cb_write",
- &(fd->hints->cb_write), myname, error_code);
- if (fd->hints->cb_write == ADIOI_HINT_DISABLE) {
- /* romio_cb_write overrides no_indep_rw */
- ADIOI_Info_set(info, "romio_no_indep_rw", "false");
- fd->hints->no_indep_rw = ADIOI_HINT_DISABLE;
- }
-#if 0
- /* bg is not implementing file realms (ADIOI_IOStridedColl) ... */
- /* enable/disable persistent file realms for collective I/O */
- /* may want to check for no_indep_rdwr hint as well */
- ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_cb_pfr",
- &(fd->hints->cb_pfr), myname, error_code);
-
- /* file realm assignment types ADIOI_FR_AAR(0),
- ADIOI_FR_FSZ(-1), ADIOI_FR_USR_REALMS(-2), all others specify
- a regular fr size in bytes. probably not the best way... */
- ADIOI_Info_check_and_install_int(fd, users_info, "romio_cb_fr_type",
- &(fd->hints->cb_fr_type), myname, error_code);
-
-#endif
- /* Has the user indicated all I/O will be done collectively? */
- ADIOI_Info_check_and_install_true(fd, users_info, "romio_no_indep_rw",
- &(fd->hints->no_indep_rw), myname, error_code);
- if (fd->hints->no_indep_rw == 1) {
- /* if 'no_indep_rw' set, also hint that we will do
- * collective buffering: if we aren't doing independent io,
- * then we have to do collective */
- ADIOI_Info_set(info, "romio_cb_write", "enable");
- ADIOI_Info_set(info, "romio_cb_read", "enable");
- fd->hints->cb_read = 1;
- fd->hints->cb_write = 1;
- }
-
- /* new hints for enabling/disabling data sieving on
- * reads/writes
- */
- ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_ds_read",
- &(fd->hints->ds_read), myname, error_code);
- ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_ds_write",
- &(fd->hints->ds_write), myname, error_code);
-
-
-
- ADIOI_Info_check_and_install_int(fd, users_info, "ind_wr_buffer_size",
- &(fd->hints->ind_wr_buffer_size), myname, error_code);
- ADIOI_Info_check_and_install_int(fd, users_info, "ind_rd_buffer_size",
- &(fd->hints->ind_rd_buffer_size), myname, error_code);
-
-
- memset( value, 0, MPI_MAX_INFO_VAL+1 );
- ADIOI_Info_get(users_info, "romio_min_fdomain_size", MPI_MAX_INFO_VAL,
- value, &flag);
- if ( flag && ((intval = atoi(value)) > 0) ) {
- ADIOI_Info_set(info, "romio_min_fdomain_size", value);
- fd->hints->min_fdomain_size = intval;
- }
- /* Now we use striping unit in common code so we should
- process hints for it. */
- ADIOI_Info_check_and_install_int(fd, users_info, "striping_unit",
- &(fd->hints->striping_unit), myname, error_code);
-
- memset( value, 0, MPI_MAX_INFO_VAL+1 );
- ADIOI_Info_get(users_info, ADIOI_BG_NAGG_IN_PSET_HINT_NAME, MPI_MAX_INFO_VAL,
- value, &flag);
- if (flag && ((intval = atoi(value)) > 0)) {
-
- did_anything = 1;
- ADIOI_Info_set(info, ADIOI_BG_NAGG_IN_PSET_HINT_NAME, value);
- fd->hints->cb_nodes = intval;
- }
- }
-
- /* associate CB aggregators to certain CNs in every involved PSET */
- if (did_anything) {
- ADIOI_BG_gen_agg_ranklist(fd, fd->hints->cb_nodes);
- }
-
- /* deferred_open won't be set by callers, but if the user doesn't
- * explicitly disable collecitve buffering (two-phase) and does hint that
- * io w/o independent io is going on, we'll set this internal hint as a
- * convenience */
- if ( ( (fd->hints->cb_read != ADIOI_HINT_DISABLE) \
- && (fd->hints->cb_write != ADIOI_HINT_DISABLE)\
- && fd->hints->no_indep_rw ) ) {
- fd->hints->deferred_open = 1;
- } else {
- /* setting romio_no_indep_rw enable and romio_cb_{read,write}
- * disable at the same time doesn't make sense. honor
- * romio_cb_{read,write} and force the no_indep_rw hint to
- * 'disable' */
- ADIOI_Info_set(info, "romio_no_indep_rw", "false");
- fd->hints->no_indep_rw = 0;
- fd->hints->deferred_open = 0;
- }
-
- /* BobC commented this out, but since hint processing runs on both bg and
- * bglockless, we need to keep DS writes enabled on gpfs and disabled on
- * PVFS */
- if (ADIO_Feature(fd, ADIO_DATA_SIEVING_WRITES) == 0) {
- /* disable data sieving for fs that do not
- support file locking */
- ADIOI_Info_get(info, "ind_wr_buffer_size", MPI_MAX_INFO_VAL,
- value, &flag);
- if (flag) {
- /* get rid of this value if it is set */
- ADIOI_Info_delete(info, "ind_wr_buffer_size");
- }
- /* note: leave ind_wr_buffer_size alone; used for other cases
- * as well. -- Rob Ross, 04/22/2003
- */
- ADIOI_Info_set(info, "romio_ds_write", "disable");
- fd->hints->ds_write = ADIOI_HINT_DISABLE;
- }
-
- ADIOI_Free(value);
-
- *error_code = MPI_SUCCESS;
-}
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk b/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk
index 494613a..6173bd7 100644
--- a/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk
+++ b/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk
@@ -11,7 +11,6 @@ noinst_HEADERS += \
adio/ad_gpfs/pe/ad_pe_aggrs.h
romio_other_sources += \
- adio/ad_gpfs/pe/ad_pe_aggrs.c \
- adio/ad_gpfs/pe/ad_pe_hints.c
+ adio/ad_gpfs/pe/ad_pe_aggrs.c
endif BUILD_AD_PE
http://git.mpich.org/mpich.git/commitdiff/abe3cfc65146ec1391688d733f0cb5942…
commit abe3cfc65146ec1391688d733f0cb5942ffc7014
Author: Paul Coffman <pkcoff(a)us.ibm.com>
Date: Sun May 11 23:39:06 2014 -0500
added code to check if fd->comm is intercomm then abort
Signed-off-by: Rob Latham <robl(a)mcs.anl.gov>
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
index 0520183..a727a4f 100644
--- a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
+++ b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
@@ -47,10 +47,18 @@ ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
char *ioTaskList = getenv( "MP_IOTASKLIST" );
char *ioAgentCount = getenv("MP_IOAGENT_CNT");
int i,j;
+ int inTERcommFlag = 0;
int myRank;
MPI_Comm_rank(fd->comm, &myRank);
+ MPI_Comm_test_inter(fd->comm, &inTERcommFlag);
+ if (inTERcommFlag) {
+ FPRINTF(stderr,"inTERcomms are not supported in MPI-IO - aborting....\n");
+ perror("ADIOI_PE_gen_agg_ranklist:");
+ MPI_Abort(MPI_COMM_WORLD, 1);
+ }
+
if (ioTaskList) {
char tmpBuf[8]; /* Big enough for 1M tasks (7 digits task ID). */
tmpBuf[7] = '\0';
http://git.mpich.org/mpich.git/commitdiff/50de30865f12ea03052aa00ce8eb1afce…
commit 50de30865f12ea03052aa00ce8eb1afced249967
Author: Paul Coffman <pkcoff(a)us.ibm.com>
Date: Fri Apr 4 16:23:43 2014 -0500
Teach GPFS-PE about MP_IOAGENT_CNT
The MP_IOAGENT_CNT is another environment variable to control I/O
aggregation selection. Teach ROMIO about this to ease PE->ROMIO transistion.
Signed-off-by: Rob Latham <robl(a)mcs.anl.gov>
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
index a3afc0c..0520183 100644
--- a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
+++ b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
@@ -18,6 +18,8 @@
#include "adio_cb_config_list.h"
#include "../ad_gpfs.h"
#include "ad_pe_aggrs.h"
+#include "mpiimpl.h"
+
#ifdef AGGREGATION_PROFILE
#include "mpe.h"
#endif
@@ -43,12 +45,16 @@ ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
int numAggs = 0;
char *ioTaskList = getenv( "MP_IOTASKLIST" );
+ char *ioAgentCount = getenv("MP_IOAGENT_CNT");
+ int i,j;
- ADIOI_Assert(ioTaskList);
+ int myRank;
+ MPI_Comm_rank(fd->comm, &myRank);
+ if (ioTaskList) {
char tmpBuf[8]; /* Big enough for 1M tasks (7 digits task ID). */
tmpBuf[7] = '\0';
- for (int i=0; i<7; i++) {
+ for (i=0; i<7; i++) {
tmpBuf[i] = *ioTaskList++; /* Maximum is 7 digits for 1 million. */
if (*ioTaskList == ':') { /* If the next char is a ':' ends it. */
tmpBuf[i+1] = '\0';
@@ -58,9 +64,9 @@ ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
numAggs = atoi(tmpBuf);
fd->hints->ranklist = (int *) ADIOI_Malloc (numAggs * sizeof(int));
- for (int j=0; j<numAggs; j++) {
+ for (j=0; j<numAggs; j++) {
ioTaskList++; /* Advance past the ':' */
- for (int i=0; i<7; i++) {
+ for (i=0; i<7; i++) {
tmpBuf[i] = *ioTaskList++;
if ( (*ioTaskList == ':') || (*ioTaskList == '\0') ) {
tmpBuf[i+1] = '\0';
@@ -77,18 +83,136 @@ ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
break;
}
}
+ }
+ else {
+ MPID_Comm *mpidCommData;
+
+ MPID_Comm_get_ptr(fd->comm,mpidCommData);
+ int localSize = mpidCommData->local_size;
+
+ // get my node rank
+ int myNodeRank = mpidCommData->intranode_table[mpidCommData->rank];
+
+ int *allNodeRanks = (int *) ADIOI_Malloc (localSize * sizeof(int));
- fd->hints->cb_nodes = numAggs;
+ allNodeRanks[myRank] = myNodeRank;
+ MPI_Allgather(MPI_IN_PLACE, 1, MPI_INT, allNodeRanks, 1, MPI_INT, fd->comm);
#ifdef AGG_DEBUG
- printf("Agg rank list of %d generated for PE:\n", numAggs);
- for (int i=0;i<numAggs;i++) {
- printf("%d ",fd->hints->ranklist[i]);
- }
- printf("\n");
+ printf("MPID_Comm data: remote_size is %d local_size is %d\nintranode_table entries:\n",mpidCommData->remote_size,mpidCommData->local_size);
+ for (i=0;i<localSize;i++) {
+ printf("%d ",mpidCommData->intranode_table[i]);
+ }
+ printf("\ninternode_table entries:\n");
+ for (i=0;i<localSize;i++) {
+ printf("%d ",mpidCommData->internode_table[i]);
+ }
+ printf("\n");
+
+ printf("\allNodeRanks entries:\n");
+ for (i=0;i<localSize;i++) {
+ printf("%d ",allNodeRanks[i]);
+ }
+ printf("\n");
#endif
+ if (ioAgentCount) {
+ int cntType = -1;
+
+ if ( strcasecmp(ioAgentCount, "ALL") ) {
+ if ( (cntType = atoi(ioAgentCount)) <= 0 ) {
+ /* Input is other non-digit or less than 1 the assume */
+ /* 1 agent per node. Note: atoi(-1) reutns -1. */
+ /* No warning message given here -- done earlier. */
+ cntType = -1;
+ }
+ }
+ else {
+ /* ALL is specified set agent count to localSize */
+ cntType = -2;
+ }
+ switch(cntType) {
+ case -1:
+ /* 1 agent/node case */
+ {
+ int rankListIndex = 0;
+ fd->hints->ranklist = (int *) ADIOI_Malloc (localSize * sizeof(int));
+ for (i=0;i<localSize;i++) {
+ if (allNodeRanks[i] == 0) {
+ fd->hints->ranklist[rankListIndex++] = i;
+ numAggs++;
+ }
+ }
+ }
+ break;
+ case -2:
+ /* ALL tasks case */
+ fd->hints->ranklist = (int *) ADIOI_Malloc (localSize * sizeof(int));
+ for (i=0;i<localSize;i++) {
+ fd->hints->ranklist[i] = i;
+ numAggs++;
+ }
+ break;
+ default:
+ /* Specific agent count case -- MUST be less than localSize. */
+ if (cntType <= localSize) {
+ numAggs = cntType;
+ // Round-robin thru allNodeRanks - pick the 0's, then the 1's, etc
+ int currentNodeRank = 0; // node rank currently being selected as aggregator
+ int rankListIndex = 0;
+ int currentAllNodeIndex = 0;
+
+ fd->hints->ranklist = (int *) ADIOI_Malloc (numAggs * sizeof(int));
+
+ while (rankListIndex < numAggs) {
+
+ int foundEntry = 0;
+ while (!foundEntry && (currentAllNodeIndex < localSize)) {
+ if (allNodeRanks[currentAllNodeIndex] == currentNodeRank) {
+ fd->hints->ranklist[rankListIndex++] = currentAllNodeIndex;
+ foundEntry = 1;
+ }
+ currentAllNodeIndex++;
+ }
+ if (!foundEntry) {
+ currentNodeRank++;
+ currentAllNodeIndex = 0;
+ }
+ } // while
+ } // (cntType <= localSize)
+ else {
+ ADIOI_Assert(1);
+ }
+ break;
+ } // switch(cntType)
+ } // if (ioAgentCount)
+
+ else { // default is 1 aggregator per node
+ // take the 0 entries from allNodeRanks
+ int rankListIndex = 0;
+ fd->hints->ranklist = (int *) ADIOI_Malloc (localSize * sizeof(int));
+ for (i=0;i<localSize;i++) {
+ if (allNodeRanks[i] == 0) {
+ fd->hints->ranklist[rankListIndex++] = i;
+ numAggs++;
+ }
+ }
+ }
+ }
+
+ if ( getenv("MP_I_SHOW_AGENTS") ) {
+ if (myRank == 0) {
+ printf("Agg rank list of %d generated:\n", numAggs);
+ for (i=0;i<numAggs;i++) {
+ printf("%d ",fd->hints->ranklist[i]);
+ }
+ printf("\n");
+ }
+ }
+
+ fd->hints->cb_nodes = numAggs;
+
return 0;
}
http://git.mpich.org/mpich.git/commitdiff/4b1186c76827fb8a20d1fb2174e9df3b5…
commit 4b1186c76827fb8a20d1fb2174e9df3b5f6a1693
Author: Paul Coffman <pkcoff(a)us.ibm.com>
Date: Mon Mar 31 23:47:33 2014 -0500
remove BGL_OPTIM_STEP flags from PE Makefile.mk
Signed-off-by: Rob Latham <robl(a)mcs.anl.gov>
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk b/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk
index 34d2330..494613a 100644
--- a/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk
+++ b/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk
@@ -7,8 +7,6 @@
if BUILD_AD_PE
-AM_CPPFLAGS += -DBGL_OPTIM_STEP1_2=1 -DBGL_OPTIM_STEP1_1=1
-
noinst_HEADERS += \
adio/ad_gpfs/pe/ad_pe_aggrs.h
http://git.mpich.org/mpich.git/commitdiff/7d793095742dabd93d0e34a9cfa123af7…
commit 7d793095742dabd93d0e34a9cfa123af757948ba
Author: Paul Coffman <pkcoff(a)us.ibm.com>
Date: Sun Mar 30 23:41:30 2014 -0500
Teach GPFS about PE platform
We extend gpfs filesystem to PE. Right now, the main accomodation is
for ROMIO aggregation selection using MP_IOTASKLIST to mimic current PE
functionality
Signed-off-by: Rob Latham <robl(a)mcs.anl.gov>
diff --git a/src/mpi/romio/adio/Makefile.mk b/src/mpi/romio/adio/Makefile.mk
index 825abad..a64eb9e 100644
--- a/src/mpi/romio/adio/Makefile.mk
+++ b/src/mpi/romio/adio/Makefile.mk
@@ -23,6 +23,7 @@ noinst_HEADERS += \
include $(top_srcdir)/adio/ad_gpfs/Makefile.mk
include $(top_srcdir)/adio/ad_gpfs/bg/Makefile.mk
+include $(top_srcdir)/adio/ad_gpfs/pe/Makefile.mk
include $(top_srcdir)/adio/ad_gridftp/Makefile.mk
include $(top_srcdir)/adio/ad_hfs/Makefile.mk
include $(top_srcdir)/adio/ad_lustre/Makefile.mk
diff --git a/src/mpi/romio/adio/ad_gpfs/ad_gpfs.c b/src/mpi/romio/adio/ad_gpfs/ad_gpfs.c
index e241cc9..8fc4939 100644
--- a/src/mpi/romio/adio/ad_gpfs/ad_gpfs.c
+++ b/src/mpi/romio/adio/ad_gpfs/ad_gpfs.c
@@ -27,6 +27,8 @@ struct ADIOI_Fns_struct ADIO_GPFS_operations = {
ADIOI_GEN_Fcntl, /* Fcntl */
#ifdef BGQPLATFORM
ADIOI_BG_SetInfo, /* SetInfo */
+#elif PEPLATFORM
+ ADIOI_PE_SetInfo, /* SetInfo */
#else
ADIOI_GEN_SetInfo, /* SetInfo */
#endif
diff --git a/src/mpi/romio/adio/ad_gpfs/ad_gpfs.h b/src/mpi/romio/adio/ad_gpfs/ad_gpfs.h
index b4b1556..686a7e5 100644
--- a/src/mpi/romio/adio/ad_gpfs/ad_gpfs.h
+++ b/src/mpi/romio/adio/ad_gpfs/ad_gpfs.h
@@ -44,6 +44,8 @@ void ADIOI_GPFS_WriteContig(ADIO_File fd, const void *buf, int count,
#ifdef BGQPLATFORM
void ADIOI_BG_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
+#elif PEPLATFORM
+void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
#endif
void ADIOI_GPFS_WriteStrided(ADIO_File fd, const void *buf, int count,
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk b/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk
new file mode 100644
index 0000000..34d2330
--- /dev/null
+++ b/src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk
@@ -0,0 +1,19 @@
+## -*- Mode: Makefile; -*-
+## vim: set ft=automake :
+##
+## (C) 2012 by Argonne National Laboratory.
+## See COPYRIGHT in top-level directory.
+##
+
+if BUILD_AD_PE
+
+AM_CPPFLAGS += -DBGL_OPTIM_STEP1_2=1 -DBGL_OPTIM_STEP1_1=1
+
+noinst_HEADERS += \
+ adio/ad_gpfs/pe/ad_pe_aggrs.h
+
+romio_other_sources += \
+ adio/ad_gpfs/pe/ad_pe_aggrs.c \
+ adio/ad_gpfs/pe/ad_pe_hints.c
+
+endif BUILD_AD_PE
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
new file mode 100644
index 0000000..a3afc0c
--- /dev/null
+++ b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
@@ -0,0 +1,94 @@
+/* ---------------------------------------------------------------- */
+/* (C)Copyright IBM Corp. 2007, 2008 */
+/* ---------------------------------------------------------------- */
+/**
+ * \file ad_pe_aggrs.c
+ * \brief The externally used function from this file is is declared in ad_pe_aggrs.h
+ */
+
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ * Copyright (C) 1997-2001 University of Chicago.
+ * See COPYRIGHT notice in top-level directory.
+ */
+
+/*#define TRACE_ON */
+
+#include "adio.h"
+#include "adio_cb_config_list.h"
+#include "../ad_gpfs.h"
+#include "ad_pe_aggrs.h"
+#ifdef AGGREGATION_PROFILE
+#include "mpe.h"
+#endif
+
+#ifdef USE_DBG_LOGGING
+ #define AGG_DEBUG 1
+#endif
+
+#ifndef TRACE_ERR
+# define TRACE_ERR(format...)
+#endif
+
+/*
+ * Compute the aggregator-related parameters that are required in 2-phase collective IO of ADIO.
+ * The parameters are
+ * . the number of aggregators (proxies) : fd->hints->cb_nodes
+ * . the ranks of the aggregators : fd->hints->ranklist
+ * For now set these based on MP_IOTASKLIST
+ */
+int
+ADIOI_PE_gen_agg_ranklist(ADIO_File fd)
+{
+
+ int numAggs = 0;
+ char *ioTaskList = getenv( "MP_IOTASKLIST" );
+
+ ADIOI_Assert(ioTaskList);
+
+ char tmpBuf[8]; /* Big enough for 1M tasks (7 digits task ID). */
+ tmpBuf[7] = '\0';
+ for (int i=0; i<7; i++) {
+ tmpBuf[i] = *ioTaskList++; /* Maximum is 7 digits for 1 million. */
+ if (*ioTaskList == ':') { /* If the next char is a ':' ends it. */
+ tmpBuf[i+1] = '\0';
+ break;
+ }
+ }
+ numAggs = atoi(tmpBuf);
+ fd->hints->ranklist = (int *) ADIOI_Malloc (numAggs * sizeof(int));
+
+ for (int j=0; j<numAggs; j++) {
+ ioTaskList++; /* Advance past the ':' */
+ for (int i=0; i<7; i++) {
+ tmpBuf[i] = *ioTaskList++;
+ if ( (*ioTaskList == ':') || (*ioTaskList == '\0') ) {
+ tmpBuf[i+1] = '\0';
+ break;
+ }
+ }
+ fd->hints->ranklist[j] = atoi(tmpBuf);
+
+ /* At the end check whether the list is shorter than specified. */
+ if (*ioTaskList == '\0') {
+ if (j < (numAggs-1)) {
+ numAggs = j;
+ }
+ break;
+ }
+ }
+
+ fd->hints->cb_nodes = numAggs;
+
+#ifdef AGG_DEBUG
+ printf("Agg rank list of %d generated for PE:\n", numAggs);
+ for (int i=0;i<numAggs;i++) {
+ printf("%d ",fd->hints->ranklist[i]);
+ }
+ printf("\n");
+
+#endif
+
+ return 0;
+}
+
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.h b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.h
new file mode 100644
index 0000000..4498b39
--- /dev/null
+++ b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.h
@@ -0,0 +1,30 @@
+/* ---------------------------------------------------------------- */
+/* (C)Copyright IBM Corp. 2007, 2008 */
+/* ---------------------------------------------------------------- */
+/**
+ * \file ad_pe_aggrs.h
+ * \brief ???
+ */
+
+/*
+ *
+ * Declares functions specific for the PE platform within the GPFS
+ * parallel I/O solution. For now simply processes the MP_IOTASKLIST
+ * env var.
+ *
+ */
+
+#ifndef AD_PE_AGGRS_H_
+#define AD_PE_AGGRS_H_
+
+#include "adio.h"
+#include <sys/stat.h>
+
+#if !defined(GPFS_SUPER_MAGIC)
+ #define GPFS_SUPER_MAGIC (0x47504653)
+#endif
+
+ /* generate a list of I/O aggregators for now based on the MP_IOTASKLIST. */
+ int ADIOI_PE_gen_agg_ranklist(ADIO_File fd);
+
+#endif /* AD_PE_AGGRS_H_ */
diff --git a/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_hints.c b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_hints.c
new file mode 100644
index 0000000..21cb45f
--- /dev/null
+++ b/src/mpi/romio/adio/ad_gpfs/pe/ad_pe_hints.c
@@ -0,0 +1,269 @@
+/* ---------------------------------------------------------------- */
+/* (C)Copyright IBM Corp. 2007, 2008 */
+/* ---------------------------------------------------------------- */
+/**
+ * \file ad_pe_hints.c
+ * \brief PE hint processing
+ */
+
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ * Copyright (C) 1997 University of Chicago.
+ * See COPYRIGHT notice in top-level directory.
+ */
+
+#include "adio.h"
+#include "adio_extern.h"
+#include "hint_fns.h"
+
+#include "../ad_gpfs.h"
+#include "ad_pe_aggrs.h"
+
+#define ADIOI_PE_CB_BUFFER_SIZE_DFLT "16777216"
+#define ADIOI_PE_IND_RD_BUFFER_SIZE_DFLT "4194304"
+#define ADIOI_PE_IND_WR_BUFFER_SIZE_DFLT "4194304"
+/** \page mpiio_vars MPIIO Configuration
+ *
+ * PE MPIIO configuration and performance tuning. Used by ad_gpfs ADIO.
+ *
+ * \section hint_sec Hints
+ *
+ * The following default key/value pairs may differ from other platform defaults.
+ *
+ * - key = cb_buffer_size value = 16777216
+ * - key = romio_cb_read value = enable
+ * - key = romio_cb_write value = enable
+ * - key = ind_rd_buffer_size value = 4194304
+ * - key = ind_wr_buffer_size value = 4194304
+ */
+
+void ADIOI_PE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
+{
+/* if fd->info is null, create a new info object.
+ Initialize fd->info to default values.
+ Initialize fd->hints to default values.
+ Examine the info object passed by the user. If it contains values that
+ ROMIO understands, override the default. */
+
+ MPI_Info info;
+ char *value;
+ int flag, intval, nprocs=0, nprocs_is_valid = 0;
+ static char myname[] = "ADIOI_PE_SetInfo";
+
+ int did_anything = 0;
+
+ if (fd->info == MPI_INFO_NULL) MPI_Info_create(&(fd->info));
+ info = fd->info;
+
+ /* Note that fd->hints is allocated at file open time; thus it is
+ * not necessary to allocate it, or check for allocation, here.
+ */
+
+ value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
+ ADIOI_Assert ((value != NULL));
+
+ /* initialize info and hints to default values if they haven't been
+ * previously initialized
+ */
+ if (!fd->hints->initialized) {
+
+ ad_gpfs_get_env_vars();
+ did_anything = 1;
+
+ /* buffer size for collective I/O */
+ ADIOI_Info_set(info, "cb_buffer_size", ADIOI_PE_CB_BUFFER_SIZE_DFLT);
+ fd->hints->cb_buffer_size = atoi(ADIOI_PE_CB_BUFFER_SIZE_DFLT);
+
+ /* default is to let romio automatically decide when to use
+ * collective buffering
+ */
+ ADIOI_Info_set(info, "romio_cb_read", "enable");
+ fd->hints->cb_read = ADIOI_HINT_ENABLE;
+ ADIOI_Info_set(info, "romio_cb_write", "enable");
+ fd->hints->cb_write = ADIOI_HINT_ENABLE;
+
+ if ( fd->hints->cb_config_list != NULL ) ADIOI_Free (fd->hints->cb_config_list);
+ fd->hints->cb_config_list = NULL;
+
+ /* number of processes that perform I/O in collective I/O */
+ MPI_Comm_size(fd->comm, &nprocs);
+ nprocs_is_valid = 1;
+ ADIOI_Snprintf(value, MPI_MAX_INFO_VAL+1, "%d", nprocs);
+ ADIOI_Info_set(info, "cb_nodes", value);
+ fd->hints->cb_nodes = nprocs; // initialize to nprocs
+
+ /* hint indicating that no indep. I/O will be performed on this file */
+ ADIOI_Info_set(info, "romio_no_indep_rw", "false");
+ fd->hints->no_indep_rw = 0;
+
+ /* PE is not implementing file realms (ADIOI_IOStridedColl),
+ initialize to disabled it. */
+ /* hint instructing the use of persistent file realms */
+ ADIOI_Info_set(info, "romio_cb_pfr", "disable");
+ fd->hints->cb_pfr = ADIOI_HINT_DISABLE;
+
+ /* hint guiding the assignment of persistent file realms */
+ ADIOI_Info_set(info, "romio_cb_fr_types", "aar");
+ fd->hints->cb_fr_type = ADIOI_FR_AAR;
+
+ /* hint to align file realms with a certain byte value */
+ ADIOI_Info_set(info, "romio_cb_fr_alignment", "1");
+ fd->hints->cb_fr_alignment = 1;
+
+ /* hint to set a threshold percentage for a datatype's size/extent at
+ * which data sieving should be done in collective I/O */
+ ADIOI_Info_set(info, "romio_cb_ds_threshold", "0");
+ fd->hints->cb_ds_threshold = 0;
+
+ /* hint to switch between point-to-point or all-to-all for two-phase */
+ ADIOI_Info_set(info, "romio_cb_alltoall", "automatic");
+ fd->hints->cb_alltoall = ADIOI_HINT_AUTO;
+
+ /* deferred_open derived from no_indep_rw and cb_{read,write} */
+ fd->hints->deferred_open = 0;
+
+ /* buffer size for data sieving in independent reads */
+ ADIOI_Info_set(info, "ind_rd_buffer_size", ADIOI_PE_IND_RD_BUFFER_SIZE_DFLT);
+ fd->hints->ind_rd_buffer_size = atoi(ADIOI_PE_IND_RD_BUFFER_SIZE_DFLT);
+
+ /* buffer size for data sieving in independent writes */
+ ADIOI_Info_set(info, "ind_wr_buffer_size", ADIOI_PE_IND_WR_BUFFER_SIZE_DFLT);
+ fd->hints->ind_wr_buffer_size = atoi(ADIOI_PE_IND_WR_BUFFER_SIZE_DFLT);
+
+ if(fd->file_system == ADIO_UFS)
+ {
+ /* default for ufs/pvfs is to disable data sieving */
+ ADIOI_Info_set(info, "romio_ds_read", "disable");
+ fd->hints->ds_read = ADIOI_HINT_DISABLE;
+ ADIOI_Info_set(info, "romio_ds_write", "disable");
+ fd->hints->ds_write = ADIOI_HINT_DISABLE;
+ }
+ else
+ {
+ /* default is to let romio automatically decide when to use data
+ * sieving
+ */
+ ADIOI_Info_set(info, "romio_ds_read", "automatic");
+ fd->hints->ds_read = ADIOI_HINT_AUTO;
+ ADIOI_Info_set(info, "romio_ds_write", "automatic");
+ fd->hints->ds_write = ADIOI_HINT_AUTO;
+ }
+
+ /* still to do: tune this a bit for a variety of file systems. there's
+ * no good default value so just leave it unset */
+ fd->hints->min_fdomain_size = 0;
+ fd->hints->striping_unit = 0;
+
+ fd->hints->initialized = 1;
+ }
+
+ /* add in user's info if supplied */
+ if (users_info != MPI_INFO_NULL) {
+ ADIOI_Info_check_and_install_int(fd, users_info, "cb_buffer_size",
+ &(fd->hints->cb_buffer_size), myname, error_code);
+
+ /* new hints for enabling/disabling coll. buffering on
+ * reads/writes
+ */
+ ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_cb_read",
+ &(fd->hints->cb_read), myname, error_code);
+ if (fd->hints->cb_read == ADIOI_HINT_DISABLE) {
+ /* romio_cb_read overrides no_indep_rw */
+ ADIOI_Info_set(info, "romio_no_indep_rw", "false");
+ fd->hints->no_indep_rw = ADIOI_HINT_DISABLE;
+ }
+ ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_cb_write",
+ &(fd->hints->cb_write), myname, error_code);
+ if (fd->hints->cb_write == ADIOI_HINT_DISABLE) {
+ /* romio_cb_write overrides no_indep_rw */
+ ADIOI_Info_set(info, "romio_no_indep_rw", "false");
+ fd->hints->no_indep_rw = ADIOI_HINT_DISABLE;
+ }
+
+ /* Has the user indicated all I/O will be done collectively? */
+ ADIOI_Info_check_and_install_true(fd, users_info, "romio_no_indep_rw",
+ &(fd->hints->no_indep_rw), myname, error_code);
+ if (fd->hints->no_indep_rw == 1) {
+ /* if 'no_indep_rw' set, also hint that we will do
+ * collective buffering: if we aren't doing independent io,
+ * then we have to do collective */
+ ADIOI_Info_set(info, "romio_cb_write", "enable");
+ ADIOI_Info_set(info, "romio_cb_read", "enable");
+ fd->hints->cb_read = 1;
+ fd->hints->cb_write = 1;
+ }
+
+ /* new hints for enabling/disabling data sieving on
+ * reads/writes
+ */
+ ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_ds_read",
+ &(fd->hints->ds_read), myname, error_code);
+ ADIOI_Info_check_and_install_enabled(fd, users_info, "romio_ds_write",
+ &(fd->hints->ds_write), myname, error_code);
+
+
+
+ ADIOI_Info_check_and_install_int(fd, users_info, "ind_wr_buffer_size",
+ &(fd->hints->ind_wr_buffer_size), myname, error_code);
+ ADIOI_Info_check_and_install_int(fd, users_info, "ind_rd_buffer_size",
+ &(fd->hints->ind_rd_buffer_size), myname, error_code);
+
+
+ memset( value, 0, MPI_MAX_INFO_VAL+1 );
+ ADIOI_Info_get(users_info, "romio_min_fdomain_size", MPI_MAX_INFO_VAL,
+ value, &flag);
+ if ( flag && ((intval = atoi(value)) > 0) ) {
+ ADIOI_Info_set(info, "romio_min_fdomain_size", value);
+ fd->hints->min_fdomain_size = intval;
+ }
+ /* Now we use striping unit in common code so we should
+ process hints for it. */
+ ADIOI_Info_check_and_install_int(fd, users_info, "striping_unit",
+ &(fd->hints->striping_unit), myname, error_code);
+
+ }
+
+ /* associate CB aggregators to certain CNs in every involved PSET */
+ if (did_anything) {
+ ADIOI_PE_gen_agg_ranklist(fd);
+ }
+
+ /* deferred_open won't be set by callers, but if the user doesn't
+ * explicitly disable collecitve buffering (two-phase) and does hint that
+ * io w/o independent io is going on, we'll set this internal hint as a
+ * convenience */
+ if ( ( (fd->hints->cb_read != ADIOI_HINT_DISABLE) \
+ && (fd->hints->cb_write != ADIOI_HINT_DISABLE)\
+ && fd->hints->no_indep_rw ) ) {
+ fd->hints->deferred_open = 1;
+ } else {
+ /* setting romio_no_indep_rw enable and romio_cb_{read,write}
+ * disable at the same time doesn't make sense. honor
+ * romio_cb_{read,write} and force the no_indep_rw hint to
+ * 'disable' */
+ ADIOI_Info_set(info, "romio_no_indep_rw", "false");
+ fd->hints->no_indep_rw = 0;
+ fd->hints->deferred_open = 0;
+ }
+
+ /* we need to keep DS writes enabled on gpfs and disabled on PVFS */
+ if (ADIO_Feature(fd, ADIO_DATA_SIEVING_WRITES) == 0) {
+ /* disable data sieving for fs that do not
+ support file locking */
+ ADIOI_Info_get(info, "ind_wr_buffer_size", MPI_MAX_INFO_VAL,
+ value, &flag);
+ if (flag) {
+ /* get rid of this value if it is set */
+ ADIOI_Info_delete(info, "ind_wr_buffer_size");
+ }
+ /* note: leave ind_wr_buffer_size alone; used for other cases
+ * as well. -- Rob Ross, 04/22/2003
+ */
+ ADIOI_Info_set(info, "romio_ds_write", "disable");
+ fd->hints->ds_write = ADIOI_HINT_DISABLE;
+ }
+
+ ADIOI_Free(value);
+
+ *error_code = MPI_SUCCESS;
+}
-----------------------------------------------------------------------
Summary of changes:
src/mpi/romio/adio/Makefile.mk | 1 +
src/mpi/romio/adio/ad_gpfs/Makefile.mk | 1 +
src/mpi/romio/adio/ad_gpfs/ad_gpfs.c | 6 +-
src/mpi/romio/adio/ad_gpfs/ad_gpfs.h | 4 +-
.../ad_gpfs/{bg/ad_bg_hints.c => ad_gpfs_hints.c} | 134 +++++-------
src/mpi/romio/adio/ad_gpfs/bg/Makefile.mk | 1 -
src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk | 16 ++
src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c | 234 ++++++++++++++++++++
src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.h | 30 +++
9 files changed, 338 insertions(+), 89 deletions(-)
rename src/mpi/romio/adio/ad_gpfs/{bg/ad_bg_hints.c => ad_gpfs_hints.c} (73%)
create mode 100644 src/mpi/romio/adio/ad_gpfs/pe/Makefile.mk
create mode 100644 src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.c
create mode 100644 src/mpi/romio/adio/ad_gpfs/pe/ad_pe_aggrs.h
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.1-90-g5b67454
by noreply@mpich.org 14 Jul '14
by noreply@mpich.org 14 Jul '14
14 Jul '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 5b674543acfc345abd174577761a35651c740d69 (commit)
via 817ed6b79c29a3d4efba016f2d16fdaac3947e58 (commit)
via 9371bd4a6d167e5ea14f468b0bb993e7ac3ad6d7 (commit)
via e598963c31f2175ace9ba0c2341a83d6828f4c43 (commit)
via dde707c81aeff82f4b7318953797bea9b62b34aa (commit)
via 46642f9a9cb787d2118cc15fc1268bfb83ec655f (commit)
from 5d444444734834f65927e473ba559d026a83b449 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/5b674543acfc345abd174577761a35651…
commit 5b674543acfc345abd174577761a35651c740d69
Author: Rob Latham <robl(a)mcs.anl.gov>
Date: Fri Jul 11 04:59:26 2014 -0500
ROMIO: some platforms unhappy when passed 2 GiB counts
On FreeBSD and Darwin, the read and write system calls think 2147483648 (2^31:
larger than a signed 32 bit integer can hold) is an invalid amount of data.
Maybe, despite taking a size_t parameter, something internally treats the count
as an int. Fine, we'll take measures to never write more than 2^31-1 bytes.
Signed-off-by: Ken Raffenetti <raffenet(a)mcs.anl.gov>
diff --git a/src/mpi/romio/adio/common/ad_read.c b/src/mpi/romio/adio/common/ad_read.c
index b03f69b..544ccf4 100644
--- a/src/mpi/romio/adio/common/ad_read.c
+++ b/src/mpi/romio/adio/common/ad_read.c
@@ -21,6 +21,10 @@
# include "adio/ad_gpfs/ad_gpfs_tuning.h"
#endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
void ADIOI_GEN_ReadContig(ADIO_File fd, void *buf, int count,
MPI_Datatype datatype, int file_ptr_type,
ADIO_Offset offset, ADIO_Status *status,
@@ -59,6 +63,10 @@ void ADIOI_GEN_ReadContig(ADIO_File fd, void *buf, int count,
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
#endif
rd_count = len - bytes_xfered;
+ /* stupid FreeBSD and Darwin do not like a count larger than a signed
+ int, even though size_t is eight bytes... */
+ if (rd_count > INT_MAX)
+ rd_count = INT_MAX;
#ifdef ROMIO_GPFS
if (gpfsmpio_devnullio)
err = pread(fd->null_fd, p, rd_count, offset+bytes_xfered);
diff --git a/src/mpi/romio/adio/common/ad_write.c b/src/mpi/romio/adio/common/ad_write.c
index 129cb1c..ad318e4 100644
--- a/src/mpi/romio/adio/common/ad_write.c
+++ b/src/mpi/romio/adio/common/ad_write.c
@@ -22,6 +22,10 @@
#include "adio/ad_gpfs/ad_gpfs_tuning.h"
#endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
void ADIOI_GEN_WriteContig(ADIO_File fd, const void *buf, int count,
MPI_Datatype datatype, int file_ptr_type,
@@ -62,6 +66,10 @@ void ADIOI_GEN_WriteContig(ADIO_File fd, const void *buf, int count,
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
#endif
wr_count = len - bytes_xfered;
+ /* Frustrating! FreeBSD and OS X do not like a count larger than 2^31 */
+ if (wr_count > INT_MAX)
+ wr_count = INT_MAX;
+
#ifdef ROMIO_GPFS
if (gpfsmpio_devnullio)
err = pwrite(fd->null_fd, p, wr_count, offset+bytes_xfered);
http://git.mpich.org/mpich.git/commitdiff/817ed6b79c29a3d4efba016f2d16fdaac…
commit 817ed6b79c29a3d4efba016f2d16fdaac3947e58
Author: Mohamad Chaarawi <chaarawi(a)hdfgroup.org>
Date: Fri Jul 11 04:54:59 2014 -0500
ROMIO: big-datatypes: Update overly conservative assertion
Commit [e527fa1d] missed an update to an assertion in the read path: with
bufcount promoted to MPI_Count, making sure it does not overflow an
'unsigned' is incorrect.
Signed-off-by: Rob Latham <robl(a)mcs.anl.gov>
diff --git a/src/mpi/romio/adio/common/ad_read_str.c b/src/mpi/romio/adio/common/ad_read_str.c
index a9be2ae..bec361b 100644
--- a/src/mpi/romio/adio/common/ad_read_str.c
+++ b/src/mpi/romio/adio/common/ad_read_str.c
@@ -99,7 +99,7 @@ void ADIOI_GEN_ReadStrided(ADIO_File fd, void *buf, int count,
MPI_Type_extent(datatype, &buftype_extent);
etype_size = fd->etype_size;
- ADIOI_Assert((buftype_size * count) == ((ADIO_Offset)(unsigned)buftype_size * (ADIO_Offset)count));
+ ADIOI_Assert((buftype_size * count) == ((ADIO_Offset)(MPI_Count)buftype_size * (ADIO_Offset)count));
bufsize = buftype_size * count;
/* get max_bufsize from the info object. */
diff --git a/src/mpi/romio/adio/common/ad_write_str.c b/src/mpi/romio/adio/common/ad_write_str.c
index cbf7cbc..f3b6c89 100644
--- a/src/mpi/romio/adio/common/ad_write_str.c
+++ b/src/mpi/romio/adio/common/ad_write_str.c
@@ -169,7 +169,7 @@ void ADIOI_GEN_WriteStrided(ADIO_File fd, const void *buf, int count,
MPI_Type_extent(datatype, &buftype_extent);
etype_size = fd->etype_size;
- ADIOI_Assert((buftype_size * count) == ((ADIO_Offset)buftype_size * (ADIO_Offset)count));
+ ADIOI_Assert((buftype_size * count) == ((MPI_Count)buftype_size * (ADIO_Offset)count));
bufsize = buftype_size * count;
/* get max_bufsize from the info object. */
http://git.mpich.org/mpich.git/commitdiff/9371bd4a6d167e5ea14f468b0bb993e7a…
commit 9371bd4a6d167e5ea14f468b0bb993e7ac3ad6d7
Author: Rob Latham <robl(a)mcs.anl.gov>
Date: Thu Jul 10 15:27:19 2014 -0500
test for RMA with "struct of struct"
Testcase for "RMA fails with derived type containing struct of struct"
See #2115
diff --git a/test/mpi/datatype/Makefile.am b/test/mpi/datatype/Makefile.am
index 03c13b5..b19321a 100644
--- a/test/mpi/datatype/Makefile.am
+++ b/test/mpi/datatype/Makefile.am
@@ -79,7 +79,8 @@ noinst_PROGRAMS = \
unusual-noncontigs \
vecblklen \
zeroblks \
- zeroparms
+ zeroparms \
+ get-struct
# Some of the tests use a more comprehensive set of datatype tests.
# These must specify a different LDADD that includes the object file
diff --git a/test/mpi/datatype/get-struct.c b/test/mpi/datatype/get-struct.c
new file mode 100644
index 0000000..8970008
--- /dev/null
+++ b/test/mpi/datatype/get-struct.c
@@ -0,0 +1,171 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ * (C) 2014 by Argonne National Laboratory.
+ * See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include "mpitest.h"
+#include <stdio.h>
+#include <string.h>
+
+/* Communicating a datatype built out of structs
+ * This test was motivated by the failure of an example program for
+ * RMA involving simple operations on a struct that included a struct
+ *
+ * The observed failure was a SEGV in the MPI_Get
+ *
+ *
+ */
+#define MAX_KEY_SIZE 64
+#define MAX_VALUE_SIZE 256
+typedef struct {
+ MPI_Aint disp;
+ int rank;
+ void *lptr;
+} Rptr;
+typedef struct {
+ Rptr next;
+ char key[MAX_KEY_SIZE], value[MAX_VALUE_SIZE];
+} ListElm;
+Rptr nullDptr = {0,-1,0};
+
+int testCases = -1;
+#define BYTE_ONLY 0x1
+#define TWO_STRUCT 0x2
+int isOneLevel = 0;
+
+int main(int argc, char **argv)
+{
+ int errors=0;
+ Rptr headDptr;
+ ListElm *headLptr=0;
+ int i, wrank;
+ MPI_Datatype dptrType, listelmType;
+ MPI_Win listwin;
+
+ MTest_Init(&argc, &argv);
+ MPI_Comm_rank(MPI_COMM_WORLD,&wrank);
+
+ for (i=1; i<argc; i++) {
+ if (strcmp(argv[i], "-byteonly") == 0) {
+ testCases = BYTE_ONLY;
+ }
+ else if (strcmp(argv[i], "-twostruct") == 0) {
+ testCases = TWO_STRUCT;
+ }
+ else if (strcmp(argv[i], "-onelevel") == 0) {
+ isOneLevel = 1;
+ }
+ else {
+ printf("Unrecognized argument %s\n", argv[i] );
+ }
+ }
+
+ /* Create the datatypes that we will use to move the data */
+ {
+ int blens[3];
+ MPI_Aint displ[3];
+ MPI_Datatype dtypes[3];
+ ListElm sampleElm;
+
+ blens[0] = 1; blens[1] = 1;
+ MPI_Get_address( &nullDptr.disp, &displ[0] );
+ MPI_Get_address( &nullDptr.rank, &displ[1] );
+ displ[1] = displ[1] - displ[0];
+ displ[0] = 0;
+ dtypes[0] = MPI_AINT;
+ dtypes[1] = MPI_INT;
+ MPI_Type_create_struct(2, blens, displ, dtypes, &dptrType);
+ MPI_Type_commit(&dptrType);
+
+ if (isOneLevel) {
+ blens[0] = sizeof(nullDptr); dtypes[0] = MPI_BYTE;
+ }
+ else {
+ blens[0] = 1; dtypes[0] = dptrType;
+ }
+ blens[1] = MAX_KEY_SIZE; dtypes[1] = MPI_CHAR;
+ blens[2] = MAX_VALUE_SIZE; dtypes[2] = MPI_CHAR;
+ MPI_Get_address(&sampleElm.next,&displ[0]);
+ MPI_Get_address(&sampleElm.key[0],&displ[1]);
+ MPI_Get_address(&sampleElm.value[0],&displ[2]);
+ displ[2] -= displ[0];
+ displ[1] -= displ[0];
+ displ[0] = 0;
+ for (i=0; i<3; i++) {
+ MTestPrintfMsg(0,"%d:count=%d,disp=%ld\n",i, blens[i], displ[i]);
+ }
+ MPI_Type_create_struct(3, blens, displ, dtypes, &listelmType);
+ MPI_Type_commit(&listelmType);
+ }
+
+ MPI_Win_create_dynamic(MPI_INFO_NULL, MPI_COMM_WORLD, &listwin);
+
+ headDptr.rank = 0;
+ if (wrank == 0) {
+ /* Create 1 list element (the head) and initialize it */
+ MPI_Alloc_mem(sizeof(ListElm), MPI_INFO_NULL, &headLptr);
+ MPI_Get_address(headLptr, &headDptr.disp);
+ headLptr->next.rank = -1;
+ headLptr->next.disp = (MPI_Aint)MPI_BOTTOM;
+ headLptr->next.lptr = 0;
+ strncpy(headLptr->key,"key1",MAX_KEY_SIZE);
+ strncpy(headLptr->value,"value1",MAX_VALUE_SIZE);
+ MPI_Win_attach(listwin, headLptr, sizeof(ListElm));
+ }
+ MPI_Bcast(&headDptr.disp, 1, MPI_AINT, 0, MPI_COMM_WORLD);
+
+ MPI_Barrier(MPI_COMM_WORLD);
+
+ if (wrank == 1) {
+ ListElm headcopy;
+
+ MPI_Win_lock_all(0, listwin);
+ /* Get head element with simple get of BYTES */
+ if (testCases & BYTE_ONLY) {
+ headcopy.next.rank=100;
+ headcopy.next.disp=0xefefefef;
+ MPI_Get(&headcopy, sizeof(ListElm), MPI_BYTE,
+ headDptr.rank, headDptr.disp,
+ sizeof(ListElm), MPI_BYTE, listwin);
+ MPI_Win_flush(headDptr.rank, listwin);
+ if (headcopy.next.rank != -1 &&
+ headcopy.next.disp != (MPI_Aint)MPI_BOTTOM) {
+ errors++;
+ printf("MPI_BYTE: headcopy contains incorrect next:<%d,%ld>\n",
+ headcopy.next.rank, (long)headcopy.next.disp);
+ }
+ }
+
+ if (testCases & TWO_STRUCT) {
+ headcopy.next.rank=100;
+ headcopy.next.disp=0xefefefef;
+ /* Get head element using struct of struct type. This is
+ not an identical get to the simple BYTE one above but should
+ work */
+ MPI_Get(&headcopy, 1, listelmType, headDptr.rank, headDptr.disp,
+ 1, listelmType, listwin);
+ MPI_Win_flush(headDptr.rank, listwin);
+ if (headcopy.next.rank != -1 &&
+ headcopy.next.disp != (MPI_Aint)MPI_BOTTOM) {
+ errors++;
+ printf("ListelmType: headcopy contains incorrect next:<%d,%ld>\n",
+ headcopy.next.rank, (long)headcopy.next.disp);
+ }
+ }
+
+ MPI_Win_unlock_all(listwin);
+ }
+ MPI_Barrier(MPI_COMM_WORLD);
+ if (wrank == 0) {
+ MPI_Win_detach(listwin,headLptr);
+ MPI_Free_mem(headLptr);
+ }
+ MPI_Win_free(&listwin);
+ MPI_Type_free(&dptrType);
+ MPI_Type_free(&listelmType);
+
+ MTest_Finalize( errors );
+ MPI_Finalize();
+ return MTestReturnValue( errors );
+}
diff --git a/test/mpi/datatype/testlist.in b/test/mpi/datatype/testlist.in
index 549c3eb..b2875b2 100644
--- a/test/mpi/datatype/testlist.in
+++ b/test/mpi/datatype/testlist.in
@@ -59,3 +59,4 @@ cxx-types 1 mpiversion=3.0
@largetest@large_type 1 mpiversion=3.0
@largetest@large_type_sendrec 2 arg=31 mpiversion=3.0
@largetest@large_type_sendrec 2 arg=32 mpiversion=3.0 timeLimit=360
+get-struct 2
http://git.mpich.org/mpich.git/commitdiff/e598963c31f2175ace9ba0c2341a83d68…
commit e598963c31f2175ace9ba0c2341a83d6828f4c43
Author: Rob Latham <robl(a)mcs.anl.gov>
Date: Wed Jul 9 12:36:05 2014 -0500
constify string handling
declare "handle_error" with a const string to make compiler happy
diff --git a/src/mpi/romio/test/misc.c.in b/src/mpi/romio/test/misc.c.in
index 6ff0e9b..5fad396 100644
--- a/src/mpi/romio/test/misc.c.in
+++ b/src/mpi/romio/test/misc.c.in
@@ -11,9 +11,7 @@
/* tests various miscellaneous functions. */
#define VERBOSE 0
-void handle_error(int errcode, char *str);
-
-void handle_error(int errcode, char *str)
+static void handle_error(int errcode, const char *str)
{
char msg[MPI_MAX_ERROR_STRING];
int resultlen;
http://git.mpich.org/mpich.git/commitdiff/dde707c81aeff82f4b7318953797bea9b…
commit dde707c81aeff82f4b7318953797bea9b62b34aa
Author: Rob Latham <robl(a)mcs.anl.gov>
Date: Wed Jul 9 14:24:05 2014 -0500
additional test case for large datatype i/o
diff --git a/test/mpi/io/Makefile.am b/test/mpi/io/Makefile.am
index 31e6c87..12dd69d 100644
--- a/test/mpi/io/Makefile.am
+++ b/test/mpi/io/Makefile.am
@@ -23,7 +23,8 @@ noinst_PROGRAMS = \
async_any \
userioerr \
resized \
- resized2
+ resized2 \
+ bigtype
clean-local:
-rm -f testfile testfile.*
diff --git a/test/mpi/io/bigtype.c b/test/mpi/io/bigtype.c
new file mode 100644
index 0000000..571a0a3
--- /dev/null
+++ b/test/mpi/io/bigtype.c
@@ -0,0 +1,137 @@
+#include <mpi.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+
+//#define NUM_X 536870911
+#define NUM_X 536870912
+#define NUM_Y 1
+
+//#define BIGDT 2147483643
+#define BIGDT 2147483647
+
+int main(int argc, char** argv)
+{
+
+ MPI_File fh;
+ int i, j;
+ size_t k;
+ MPI_Datatype inner_type, rem_type, mem_type;
+ MPI_Datatype int_type, file_type;
+ int *buf_write, *buf_read;
+ int rc;
+ MPI_Aint disp[2];
+ int block_len[2];
+ MPI_Datatype type[2];
+
+ MPI_Init (&argc, &argv);
+
+ if (sizeof(MPI_Aint) <= sizeof(int)) {
+ /* can't test on this platform... */
+ goto exit;
+ }
+
+ k = 0;
+ /* create a large buffer 2*/
+ buf_write = malloc (NUM_X*NUM_Y*sizeof(int));
+ buf_read = malloc (NUM_X*NUM_Y*sizeof(int));
+ memset(buf_read, 0, NUM_X*NUM_Y*sizeof(int));
+
+ for (i=0; i<NUM_X ; i++) {
+ for (j=0 ; j<NUM_Y ; j++) {
+ buf_write[k] = k;
+ k++;
+ }
+ }
+
+ /* Big Datatype (2^31 - 1 bytes) */
+ MPI_Type_contiguous (BIGDT, MPI_BYTE, &inner_type);
+ /* Small Datatype (1 byte) */
+ MPI_Type_contiguous (1, MPI_BYTE, &rem_type);
+
+ type[0] = inner_type;
+ type[1] = rem_type;
+ block_len[0] = 1;
+ block_len[1] = 1;
+ disp[0] = 0;
+ disp[1] = BIGDT;
+
+ /* combine both types*/
+ MPI_Type_struct(2, block_len, disp, type, &mem_type);
+
+ MPI_Type_commit(&mem_type);
+ MPI_Type_free(&rem_type);
+ MPI_Type_free(&inner_type);
+
+ MPI_Type_contiguous (4, MPI_BYTE, &int_type);
+ {
+ /* This creates a big type that is actually contituous, touching an
+ * optimization that was at one point buggy */
+ MPI_Type_vector(1, NUM_X, 1, int_type, &file_type);
+ }
+
+ MPI_Type_commit(&file_type);
+ MPI_Type_free(&int_type);
+
+ if(MPI_File_open (MPI_COMM_WORLD, "testfile", MPI_MODE_RDWR | MPI_MODE_CREATE,
+ MPI_INFO_NULL, &fh) != 0) {
+ printf("Can't open file: %s\n","testfile");
+ exit(1);
+ }
+
+ if (MPI_SUCCESS != MPI_File_set_view(fh, 2144, MPI_BYTE,
+ file_type, "native", MPI_INFO_NULL)) {
+ printf ("ERROR SET VIEW\n");
+ exit(1);
+ }
+
+ /* write everything */
+ rc = MPI_File_write_at_all (fh,
+ 0,
+ buf_write,
+ 1,
+ mem_type,
+ MPI_STATUS_IGNORE);
+ if (rc != MPI_SUCCESS){
+ printf ("%d ERROR WRITE AT ALL\n", rc);
+ exit(1);
+ }
+
+ if (MPI_SUCCESS != MPI_File_set_view(fh, 2144, MPI_BYTE,
+ file_type, "native", MPI_INFO_NULL)) {
+ printf ("ERROR SET VIEW\n");
+ exit(1);
+ }
+
+ /* read everything */
+ rc = MPI_File_read_at_all (fh,
+ 0,
+ buf_read,
+ 1,
+ mem_type,
+ MPI_STATUS_IGNORE);
+ if (rc != MPI_SUCCESS) {
+ printf ("%d ERROR READ AT ALL\n", rc);
+ exit(1);
+ }
+
+ for (k=0 ; k<NUM_X*NUM_Y ; k++) {
+ if(buf_read[k] != buf_write[k]) {
+ fprintf(stderr, "Verfiy Failed at index %zu\n", k);
+ assert(0);
+ }
+ }
+
+ MPI_File_close(&fh);
+
+ MPI_Type_free (&mem_type);
+ MPI_Type_free(&file_type);
+
+exit:
+ MPI_Finalize ();
+ printf(" No Errors\n");
+
+ return 0;
+}
diff --git a/test/mpi/io/testlist b/test/mpi/io/testlist
index dfad3f0..6dfaafb 100644
--- a/test/mpi/io/testlist
+++ b/test/mpi/io/testlist
@@ -9,3 +9,4 @@ async_any 4
userioerr 1
resized 1
resized2 1 xfail=ticket2088
+bigtype 1
http://git.mpich.org/mpich.git/commitdiff/46642f9a9cb787d2118cc15fc1268bfb8…
commit 46642f9a9cb787d2118cc15fc1268bfb83ec655f
Author: Rob Latham <robl(a)mcs.anl.gov>
Date: Wed Jul 9 11:55:09 2014 -0500
deal better with large user-defined types
this optimization in ROMIO's noncontigous type handling detects if a
user-defined type will fit into a single write request (e.g. a call to
MPI_Type_create_subarray that was actually the entire array). Code was
passing in a count of bytes, which can overflow an int. since we know
the type is contiguous, simply pass a count of that type (not bytes) to
write_contig
Signed-off-by: Mohamad Chaarawi <chaarawi(a)hdfgroup.org>
diff --git a/src/mpi/romio/adio/common/ad_read_str.c b/src/mpi/romio/adio/common/ad_read_str.c
index fb5699a..a9be2ae 100644
--- a/src/mpi/romio/adio/common/ad_read_str.c
+++ b/src/mpi/romio/adio/common/ad_read_str.c
@@ -218,7 +218,8 @@ void ADIOI_GEN_ReadStrided(ADIO_File fd, void *buf, int count,
* block e.g. with subarray types that actually describe the whole
* array */
if (buftype_is_contig && bufsize <= frd_size) {
- ADIO_ReadContig(fd, buf, bufsize, MPI_BYTE, ADIO_EXPLICIT_OFFSET,
+ /* a count of bytes can overflow. operate on original type instead */
+ ADIO_ReadContig(fd, buf, count, datatype, ADIO_EXPLICIT_OFFSET,
offset, status, error_code);
if (file_ptr_type == ADIO_INDIVIDUAL) {
diff --git a/src/mpi/romio/adio/common/ad_write_str.c b/src/mpi/romio/adio/common/ad_write_str.c
index 839feca..cbf7cbc 100644
--- a/src/mpi/romio/adio/common/ad_write_str.c
+++ b/src/mpi/romio/adio/common/ad_write_str.c
@@ -285,9 +285,11 @@ void ADIOI_GEN_WriteStrided(ADIO_File fd, const void *buf, int count,
if (buftype_is_contig && bufsize <= fwr_size) {
/* though MPI api has an integer 'count' parameter, derived
* datatypes might describe more bytes than can fit into an integer.
+ * if we've made it this far, we can pass a count of original
+ * datatypes, instead of a count of bytes (which might overflow)
* Other WriteContig calls in this path are operating on data
* sieving buffer */
- ADIO_WriteContig(fd, buf, bufsize, MPI_BYTE, ADIO_EXPLICIT_OFFSET,
+ ADIO_WriteContig(fd, buf, count, datatype, ADIO_EXPLICIT_OFFSET,
offset, status, error_code);
if (file_ptr_type == ADIO_INDIVIDUAL) {
-----------------------------------------------------------------------
Summary of changes:
src/mpi/romio/adio/common/ad_read.c | 8 ++
src/mpi/romio/adio/common/ad_read_str.c | 5 +-
src/mpi/romio/adio/common/ad_write.c | 8 ++
src/mpi/romio/adio/common/ad_write_str.c | 6 +-
src/mpi/romio/test/misc.c.in | 4 +-
test/mpi/datatype/Makefile.am | 3 +-
test/mpi/datatype/get-struct.c | 171 ++++++++++++++++++++++++++++++
test/mpi/datatype/testlist.in | 1 +
test/mpi/io/Makefile.am | 3 +-
test/mpi/io/bigtype.c | 137 ++++++++++++++++++++++++
test/mpi/io/testlist | 1 +
11 files changed, 338 insertions(+), 9 deletions(-)
create mode 100644 test/mpi/datatype/get-struct.c
create mode 100644 test/mpi/io/bigtype.c
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.1-84-g5d44444
by noreply@mpich.org 13 Jul '14
by noreply@mpich.org 13 Jul '14
13 Jul '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 5d444444734834f65927e473ba559d026a83b449 (commit)
via 5d8b7ea5da7b9227e7f911366f9a0074a89df34c (commit)
from 5adfb9e7ca027ce84ae3d84f42129ad823c6b656 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/5d444444734834f65927e473ba559d026…
commit 5d444444734834f65927e473ba559d026a83b449
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Sun Jul 13 16:19:06 2014 -0500
Add/delete memory barriers in RMA.
See "Notes for memory barriers in RMA synchronizations" in
src/mpid/ch3/src/ch3u_rma_sync.c.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index 4d1f038..740192b 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -2279,6 +2279,11 @@ int MPIDI_Win_post(MPID_Group *post_grp_ptr, int assert, MPID_Win *win_ptr)
}
post_grp_size = post_grp_ptr->size;
+
+ /* Ensure ordering of load/store operations. */
+ if (win_ptr->shm_allocated == TRUE) {
+ OPA_read_write_barrier();
+ }
/* initialize the completion counter */
win_ptr->my_counter = post_grp_size;
@@ -2553,6 +2558,11 @@ int MPIDI_Win_start(MPID_Group *group_ptr, int assert, MPID_Win *win_ptr)
mpi_errno = recv_post_msgs(win_ptr, ranks_in_win_grp, 1);
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ /* Ensure ordering of load/store operations */
+ if (win_ptr->shm_allocated == TRUE) {
+ OPA_read_write_barrier();
+ }
+
fn_fail:
MPIU_CHKLMEM_FREEALL();
MPIDI_RMA_FUNC_EXIT(MPID_STATE_MPIDI_WIN_START);
@@ -2778,11 +2788,6 @@ int MPIDI_Win_complete(MPID_Win *win_ptr)
/* free the group stored in window */
MPIR_Group_release(win_ptr->start_group_ptr);
win_ptr->start_group_ptr = NULL;
-
- /* Ensure ordering of load/store operations. */
- if (win_ptr->shm_allocated == TRUE) {
- OPA_read_write_barrier();
- }
fn_exit:
MPIU_CHKLMEM_FREEALL();
@@ -2987,6 +2992,11 @@ int MPIDI_Win_lock(int lock_type, int dest, int assert, MPID_Win *win_ptr)
MPIU_ERR_CHKANDJUMP(mpi_errno != MPI_SUCCESS, mpi_errno, MPI_ERR_OTHER, "**ch3|rma_msg");
}
+ /* Ensure ordering of load/store operations. */
+ if (win_ptr->shm_allocated == TRUE) {
+ OPA_read_write_barrier();
+ }
+
fn_exit:
MPIDI_RMA_FUNC_EXIT(MPID_STATE_MPIDI_WIN_LOCK);
return mpi_errno;
@@ -3240,6 +3250,11 @@ int MPIDI_Win_flush(int rank, MPID_Win *win_ptr)
MPIU_ERR_CHKANDJUMP(win_ptr->targets[rank].remote_lock_state == MPIDI_CH3_WIN_LOCK_NONE,
mpi_errno, MPI_ERR_RMA_SYNC, "**rmasync");
+ /* Ensure ordering of read/write operations */
+ if (win_ptr->shm_allocated == TRUE) {
+ OPA_read_write_barrier();
+ }
+
/* Local flush: ops are performed immediately on the local process */
if (rank == win_ptr->comm_ptr->rank) {
MPIU_Assert(win_ptr->targets[rank].remote_lock_state == MPIDI_CH3_WIN_LOCK_GRANTED);
@@ -3257,10 +3272,6 @@ int MPIDI_Win_flush(int rank, MPID_Win *win_ptr)
terms of MPIDI_Win_flush. When this changes, those operations will also
need to insert this read/write memory fence for shared memory windows. */
- if (win_ptr->shm_allocated == TRUE) {
- OPA_read_write_barrier();
- }
-
rma_op = MPIDI_CH3I_RMA_Ops_head(&win_ptr->targets[rank].rma_ops_list);
/* If there is no activity at this target (e.g. lock-all was called, but we
http://git.mpich.org/mpich.git/commitdiff/5d8b7ea5da7b9227e7f911366f9a0074a…
commit 5d8b7ea5da7b9227e7f911366f9a0074a89df34c
Author: Xin Zhao <xinzhao3(a)illinois.edu>
Date: Sun Jul 13 16:02:04 2014 -0500
Notes on when to do mem barriers in RMA.
Signed-off-by: Pavan Balaji <balaji(a)anl.gov>
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index a2158b7..4d1f038 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -132,6 +132,208 @@ cvars:
=== END_MPI_T_CVAR_INFO_BLOCK ===
*/
+/* Notes for memory barriers in RMA synchronizations
+
+ When SHM is allocated for RMA window, we need to add memory berriers at proper
+ places in RMA synchronization routines to guarantee the ordering of read/write
+ operations, so that any operations after synchronization calls will see the
+ correct data.
+
+ There are four kinds of operations involved in the following explanation:
+
+ 1. Local loads/stores: any operations happening outside RMA epoch and accessing
+ each process's own window memory.
+
+ 2. SHM operations: any operations happening inside RMA epoch. They may access
+ any processes' window memory, which include direct loads/stores, and
+ RMA operations that are internally implemented as direct loads/stores in
+ MPI implementation.
+
+ 3. PROC_SYNC: synchronzations among processes by sending/recving messages.
+
+ 4. MEM_SYNC: a full memory barrier. It ensures the ordering of read/write
+ operations on each process.
+
+ (1) FENCE synchronization
+
+ RANK 0 RANK 1
+
+ (local loads/stores) (local loads/stores)
+
+ WIN_FENCE { WIN_FENCE {
+ MEM_SYNC MEM_SYNC
+ PROC_SYNC -------------------- PROC_SYNC
+ MEM_SYNC MEM_SYNC
+ } }
+
+ (SHM operations) (SHM operations)
+
+ WIN_FENCE { WIN_FENCE {
+ MEM_SYNC MEM_SYNC
+ PROC_SYNC --------------------- PROC_SYNC
+ MEM_SYNC MEM_SYNC
+ } }
+
+ (local loads/stores) (local loads/stores)
+
+ We need MEM_SYNC before and after PROC_SYNC for both starting WIN_FENCE
+ and ending WIN_FENCE, to ensure the ordering between local loads/stores
+ and PROC_SYNC in starting WIN_FENCE (and vice versa in ending WIN_FENCE),
+ and the ordering between PROC_SYNC and SHM operations in starting WIN_FENCE
+ (and vice versa for ending WIN_FENCE).
+
+ In starting WIN_FENCE, the MEM_SYNC before PROC_SYNC essentially exposes
+ previous local loads/stores to other processes; after PROC_SYNC, each
+ process knows that everyone else already exposed their local loads/stores;
+ the MEM_SYNC after PROC_SYNC ensures that my following SHM operations will
+ happen after PROC_SYNC and will see the latest data on other processes.
+
+ In ending WIN_FENCE, the MEM_SYNC before PROC_SYNC essentially exposes
+ previous SHM operations to other processes; after PROC_SYNC, each process
+ knows everyone else already exposed their SHM operations; the MEM_SYNC
+ after PROC_SYNC ensures that my following local loads/stores will happen
+ after PROC_SYNC and will see the latest data in my memory region.
+
+ (2) POST-START-COMPLETE-WAIT synchronization
+
+ RANK 0 RANK 1
+
+ (local loads/stores)
+
+ WIN_START { WIN_POST {
+ MEM_SYNC
+ PROC_SYNC ---------------------- PROC_SYNC
+ MEM_SYNC
+ } }
+
+ (SHM operations)
+
+ WIN_COMPLETE { WIN_WAIT/TEST {
+ MEM_SYNC
+ PROC_SYNC --------------------- PROC_SYNC
+ MEM_SYNC
+ } }
+
+ (local loads/stores)
+
+ We need MEM_SYNC before PROC_SYNC for WIN_POST and WIN_COMPLETE, and
+ MEM_SYNC after PROC_SYNC in WIN_START and WIN_WAIT/TEST, to ensure the
+ ordering between local loads/stores and PROC_SYNC in WIN_POST (and
+ vice versa in WIN_WAIT/TEST), and the ordering between PROC_SYNC and SHM
+ operations in WIN_START (and vice versa in WIN_COMPLETE).
+
+ In WIN_POST, the MEM_SYNC before PROC_SYNC essentially exposes previous
+ local loads/stores to group of origin processes; after PROC_SYNC, origin
+ processes knows all target processes already exposed their local
+ loads/stores; in WIN_START, the MEM_SYNC after PROC_SYNC ensures that
+ following SHM operations will happen after PROC_SYNC and will see the
+ latest data on target processes.
+
+ In WIN_COMPLETE, the MEM_SYNC before PROC_SYNC essentailly exposes previous
+ SHM operations to group of target processes; after PROC_SYNC, target
+ processes knows all origin process already exposed their SHM operations;
+ in WIN_WAIT/TEST, the MEM_SYNC after PROC_SYNC ensures that following local
+ loads/stores will happen after PROC_SYNC and will see the latest data in
+ my memory region.
+
+ (3) Passive target synchronization
+
+ RANK 0 RANK 1
+
+ WIN_LOCK(target=1) {
+ PROC_SYNC (lock granted)
+ MEM_SYNC
+ }
+
+ (SHM operations)
+
+ WIN_UNLOCK(target=1) {
+ MEM_SYNC
+ PROC_SYNC (lock released)
+ }
+
+ PROC_SYNC -------------------- PROC_SYNC
+
+ WIN_LOCK (target=1) {
+ PROC_SYNC (lock granted)
+ MEM_SYNC
+ }
+
+ (SHM operations)
+
+ WIN_UNLOCK (target=1) {
+ MEM_SYNC
+ PROC_SYNC (lock released)
+ }
+
+ PROC_SYNC -------------------- PROC_SYNC
+
+ WIN_LOCK(target=1) {
+ PROC_SYNC (lock granted)
+ MEM_SYNC
+ }
+
+ (SHM operations)
+
+ WIN_UNLOCK(target=1) {
+ MEM_SYNC
+ PROC_SYNC (lock released)
+ }
+
+ We need MEM_SYNC after PROC_SYNC in WIN_LOCK, and MEM_SYNC before
+ PROC_SYNC in WIN_UNLOCK, to ensure the ordering between SHM operations
+ and PROC_SYNC and vice versa.
+
+ In WIN_LOCK, the MEM_SYNC after PROC_SYNC guarantees two things:
+ (a) it guarantees that following SHM operations will happen after
+ lock is granted; (b) it guarantees that following SHM operations
+ will happen after any PROC_SYNC with target before WIN_LOCK is called,
+ which means those SHM operations will see the latest data on target
+ process.
+
+ In WIN_UNLOCK, the MEM_SYNC before PROC_SYNC also guarantees two
+ things: (a) it guarantees that SHM operations will happen before
+ lock is released; (b) it guarantees that SHM operations will happen
+ before any PROC_SYNC with target after WIN_UNLOCK is returned, which
+ means following SHM operations on that target will see the latest data.
+
+ WIN_LOCK_ALL/UNLOCK_ALL are same with WIN_LOCK/UNLOCK.
+
+ RANK 0 RANK 1
+
+ WIN_LOCK_ALL
+
+ (SHM operations)
+
+ WIN_FLUSH(target=1) {
+ MEM_SYNC
+ }
+
+ PROC_SYNC ------------------------PROC_SYNC
+
+ WIN_LOCK(target=1) {
+ PROC_SYNC (lock granted)
+ MEM_SYNC
+ }
+
+ (SHM operations)
+
+ WIN_UNLOCK(target=1) {
+ MEM_SYNC
+ PROC_SYNC (lock released)
+ }
+
+ WIN_UNLOCK_ALL
+
+ We need MEM_SYNC in WIN_FLUSH to ensure the ordering between SHM
+ operations and PROC_SYNC.
+
+ The MEM_SYNC in WIN_FLUSH guarantees that all SHM operations before
+ this WIN_FLUSH will happen before any PROC_SYNC with target after
+ this WIN_FLUSH, which means SHM operations on target process after
+ PROC_SYNC with origin will see the latest data.
+*/
+
MPIR_T_PVAR_DOUBLE_TIMER_DECL(RMA, rma_lockqueue_alloc);
MPIR_T_PVAR_DOUBLE_TIMER_DECL(RMA, rma_winfence_clearlock);
-----------------------------------------------------------------------
Summary of changes:
src/mpid/ch3/src/ch3u_rma_sync.c | 231 ++++++++++++++++++++++++++++++++++++--
1 files changed, 222 insertions(+), 9 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.1-82-g5adfb9e
by noreply@mpich.org 12 Jul '14
by noreply@mpich.org 12 Jul '14
12 Jul '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 5adfb9e7ca027ce84ae3d84f42129ad823c6b656 (commit)
from 2e7707fbbc4b883cb5562b7c9ddca3248c6ef63d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/5adfb9e7ca027ce84ae3d84f42129ad82…
commit 5adfb9e7ca027ce84ae3d84f42129ad823c6b656
Author: Junchao Zhang <jczhang(a)mcs.anl.gov>
Date: Fri Jul 11 15:51:02 2014 -0500
Revised the handle conversion functions in Fortran.
The f2c/c2f handle conversion functions are only defined in C in the standard.
We provide non-standard extensions in Fortran. All functions, except MPI_File_f2c/c2f,
are trival to implement. For MPI_File_f2c/c2f, we bind the Fortran functions to C.
We do not provide PMPI version for them since it is not required by the standard.
No review since F08 binding is experimental now.
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_types.F90 b/src/binding/fortran/use_mpi_f08/mpi_f08_types.F90
index 231a1ee..f87e1d4 100644
--- a/src/binding/fortran/use_mpi_f08/mpi_f08_types.F90
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08_types.F90
@@ -1,10 +1,10 @@
-! MPI 3 Data types for Fortran.
+! MPI 3 data types for Fortran.
! From A.1.2, pp 676-677
! Note added MPI_Message type not in the spec by mistake
!
!--------------------------------------------------------------
-module mpi_f08_types
+module MPI_f08_types
use, intrinsic :: iso_c_binding, only: c_int
use :: mpi_c_interface_types, only: c_Count, c_Status
@@ -55,7 +55,22 @@ type, bind(C) :: MPI_Message
integer :: MPI_VAL
end type MPI_Message
-! Fortran 2008 struct for status. Must be consistent with mpi.h, mpif.h
+! MPI_File_f2c/c2f are implemented in C, so we do direct binding.
+interface
+ function MPI_File_f2c(file) bind(C, name="MPI_File_f2c") result (res)
+ use mpi_c_interface_types, only: c_File
+ integer, value :: file
+ integer(c_File) :: res
+ end function MPI_File_f2c
+
+ function MPI_File_c2f(file) bind(C, name="MPI_File_c2f") result (res)
+ use mpi_c_interface_types, only: c_File
+ integer(c_File), value :: file
+ integer :: res
+ end function MPI_File_c2f
+end interface
+
+! Fortran 2008 struct for status. Must be consistent with MPI.h, MPIf.h
type, bind(C) :: MPI_Status
integer :: count_lo;
integer :: count_hi_and_cancelled;
@@ -72,150 +87,149 @@ integer,parameter :: MPI_ERROR = 5
integer,parameter :: MPI_STATUS_SIZE = 5
interface assignment(=)
- module procedure mpi_status_f08_assgn_c
- module procedure mpi_status_c_assgn_f08
+ module procedure MPI_Status_f08_assgn_c
+ module procedure MPI_Status_c_assgn_f08
end interface
-private :: mpi_status_f08_assgn_c
-private :: mpi_status_c_assgn_f08
-private :: mpi_status_f_assgn_c
-private :: mpi_status_c_assgn_f
+private :: MPI_Status_f08_assgn_c
+private :: MPI_Status_c_assgn_f08
+private :: MPI_Status_f_assgn_c
+private :: MPI_Status_c_assgn_f
! Required operator overloads for == and /= for opaque handles
! 2.5.1 pp 12-13
interface operator(==)
- module procedure mpi_comm_eq
- module procedure mpi_datatype_eq
- module procedure mpi_errhandler_eq
- module procedure mpi_file_eq
- module procedure mpi_group_eq
- module procedure mpi_info_eq
- module procedure mpi_op_eq
- module procedure mpi_request_eq
- module procedure mpi_win_eq
- module procedure mpi_message_eq
-
- module procedure mpi_comm_f08_eq_f
- module procedure mpi_comm_f_eq_f08
- module procedure mpi_datatype_f08_eq_f
- module procedure mpi_datatype_f_eq_f08
- module procedure mpi_errhandler_f08_eq_f
- module procedure mpi_errhandler_f_eq_f08
- module procedure mpi_file_f08_eq_f
- module procedure mpi_file_f_eq_f08
- module procedure mpi_group_f08_eq_f
- module procedure mpi_group_f_eq_f08
- module procedure mpi_info_f08_eq_f
- module procedure mpi_info_f_eq_f08
- module procedure mpi_op_f08_eq_f
- module procedure mpi_op_f_eq_f08
- module procedure mpi_request_f08_eq_f
- module procedure mpi_request_f_eq_f08
- module procedure mpi_win_f08_eq_f
- module procedure mpi_win_f_eq_f08
- module procedure mpi_message_f08_eq_f
- module procedure mpi_message_f_eq_f08
+ module procedure MPI_Comm_eq
+ module procedure MPI_Datatype_eq
+ module procedure MPI_Errhandler_eq
+ module procedure MPI_File_eq
+ module procedure MPI_Group_eq
+ module procedure MPI_Info_eq
+ module procedure MPI_Op_eq
+ module procedure MPI_Request_eq
+ module procedure MPI_Win_eq
+ module procedure MPI_Message_eq
+
+ module procedure MPI_Comm_f08_eq_f
+ module procedure MPI_Comm_f_eq_f08
+ module procedure MPI_Datatype_f08_eq_f
+ module procedure MPI_Datatype_f_eq_f08
+ module procedure MPI_Errhandler_f08_eq_f
+ module procedure MPI_Errhandler_f_eq_f08
+ module procedure MPI_File_f08_eq_f
+ module procedure MPI_File_f_eq_f08
+ module procedure MPI_Group_f08_eq_f
+ module procedure MPI_Group_f_eq_f08
+ module procedure MPI_Info_f08_eq_f
+ module procedure MPI_Info_f_eq_f08
+ module procedure MPI_Op_f08_eq_f
+ module procedure MPI_Op_f_eq_f08
+ module procedure MPI_Request_f08_eq_f
+ module procedure MPI_Request_f_eq_f08
+ module procedure MPI_Win_f08_eq_f
+ module procedure MPI_Win_f_eq_f08
+ module procedure MPI_Message_f08_eq_f
+ module procedure MPI_Message_f_eq_f08
end interface
-private :: mpi_comm_eq
-private :: mpi_datatype_eq
-private :: mpi_errhandler_eq
-private :: mpi_file_eq
-private :: mpi_group_eq
-private :: mpi_info_eq
-private :: mpi_op_eq
-private :: mpi_request_eq
-private :: mpi_win_eq
-private :: mpi_message_eq
-
-private :: mpi_comm_f08_eq_f
-private :: mpi_comm_f_eq_f08
-private :: mpi_datatype_f08_eq_f
-private :: mpi_datatype_f_eq_f08
-private :: mpi_errhandler_f08_eq_f
-private :: mpi_errhandler_f_eq_f08
-private :: mpi_file_f08_eq_f
-private :: mpi_file_f_eq_f08
-private :: mpi_group_f08_eq_f
-private :: mpi_group_f_eq_f08
-private :: mpi_info_f08_eq_f
-private :: mpi_info_f_eq_f08
-private :: mpi_op_f08_eq_f
-private :: mpi_op_f_eq_f08
-private :: mpi_request_f08_eq_f
-private :: mpi_request_f_eq_f08
-private :: mpi_win_f08_eq_f
-private :: mpi_win_f_eq_f08
-private :: mpi_message_f08_eq_f
-private :: mpi_message_f_eq_f08
+private :: MPI_Comm_eq
+private :: MPI_Datatype_eq
+private :: MPI_Errhandler_eq
+private :: MPI_File_eq
+private :: MPI_Group_eq
+private :: MPI_Info_eq
+private :: MPI_Op_eq
+private :: MPI_Request_eq
+private :: MPI_Win_eq
+private :: MPI_Message_eq
+
+private :: MPI_Comm_f08_eq_f
+private :: MPI_Comm_f_eq_f08
+private :: MPI_Datatype_f08_eq_f
+private :: MPI_Datatype_f_eq_f08
+private :: MPI_Errhandler_f08_eq_f
+private :: MPI_Errhandler_f_eq_f08
+private :: MPI_File_f08_eq_f
+private :: MPI_File_f_eq_f08
+private :: MPI_Group_f08_eq_f
+private :: MPI_Group_f_eq_f08
+private :: MPI_Info_f08_eq_f
+private :: MPI_Info_f_eq_f08
+private :: MPI_Op_f08_eq_f
+private :: MPI_Op_f_eq_f08
+private :: MPI_Request_f08_eq_f
+private :: MPI_Request_f_eq_f08
+private :: MPI_Win_f08_eq_f
+private :: MPI_Win_f_eq_f08
+private :: MPI_Message_f08_eq_f
+private :: MPI_Message_f_eq_f08
interface operator(/=)
- module procedure mpi_comm_neq
- module procedure mpi_datatype_neq
- module procedure mpi_errhandler_neq
- module procedure mpi_file_neq
- module procedure mpi_group_neq
- module procedure mpi_info_neq
- module procedure mpi_op_neq
- module procedure mpi_request_neq
- module procedure mpi_win_neq
- module procedure mpi_message_neq
-
- module procedure mpi_comm_f08_ne_f
- module procedure mpi_comm_f_ne_f08
- module procedure mpi_datatype_f08_ne_f
- module procedure mpi_datatype_f_ne_f08
- module procedure mpi_errhandler_f08_ne_f
- module procedure mpi_errhandler_f_ne_f08
- module procedure mpi_file_f08_ne_f
- module procedure mpi_file_f_ne_f08
- module procedure mpi_group_f08_ne_f
- module procedure mpi_group_f_ne_f08
- module procedure mpi_info_f08_ne_f
- module procedure mpi_info_f_ne_f08
- module procedure mpi_op_f08_ne_f
- module procedure mpi_op_f_ne_f08
- module procedure mpi_request_f08_ne_f
- module procedure mpi_request_f_ne_f08
- module procedure mpi_win_f08_ne_f
- module procedure mpi_win_f_ne_f08
- module procedure mpi_message_f08_ne_f
- module procedure mpi_message_f_ne_f08
+ module procedure MPI_Comm_neq
+ module procedure MPI_Datatype_neq
+ module procedure MPI_Errhandler_neq
+ module procedure MPI_File_neq
+ module procedure MPI_Group_neq
+ module procedure MPI_Info_neq
+ module procedure MPI_Op_neq
+ module procedure MPI_Request_neq
+ module procedure MPI_Win_neq
+ module procedure MPI_Message_neq
+
+ module procedure MPI_Comm_f08_ne_f
+ module procedure MPI_Comm_f_ne_f08
+ module procedure MPI_Datatype_f08_ne_f
+ module procedure MPI_Datatype_f_ne_f08
+ module procedure MPI_Errhandler_f08_ne_f
+ module procedure MPI_Errhandler_f_ne_f08
+ module procedure MPI_File_f08_ne_f
+ module procedure MPI_File_f_ne_f08
+ module procedure MPI_Group_f08_ne_f
+ module procedure MPI_Group_f_ne_f08
+ module procedure MPI_Info_f08_ne_f
+ module procedure MPI_Info_f_ne_f08
+ module procedure MPI_Op_f08_ne_f
+ module procedure MPI_Op_f_ne_f08
+ module procedure MPI_Request_f08_ne_f
+ module procedure MPI_Request_f_ne_f08
+ module procedure MPI_Win_f08_ne_f
+ module procedure MPI_Win_f_ne_f08
+ module procedure MPI_Message_f08_ne_f
+ module procedure MPI_Message_f_ne_f08
end interface
-private :: mpi_comm_neq
-private :: mpi_datatype_neq
-private :: mpi_errhandler_neq
-private :: mpi_file_neq
-private :: mpi_group_neq
-private :: mpi_info_neq
-private :: mpi_op_neq
-private :: mpi_request_neq
-private :: mpi_win_neq
-private :: mpi_message_neq
-
-private :: mpi_comm_f08_ne_f
-private :: mpi_comm_f_ne_f08
-private :: mpi_datatype_f08_ne_f
-private :: mpi_datatype_f_ne_f08
-private :: mpi_errhandler_f08_ne_f
-private :: mpi_errhandler_f_ne_f08
-private :: mpi_file_f08_ne_f
-private :: mpi_file_f_ne_f08
-private :: mpi_group_f08_ne_f
-private :: mpi_group_f_ne_f08
-private :: mpi_info_f08_ne_f
-private :: mpi_info_f_ne_f08
-private :: mpi_op_f08_ne_f
-private :: mpi_op_f_ne_f08
-private :: mpi_request_f08_ne_f
-private :: mpi_request_f_ne_f08
-private :: mpi_win_f08_ne_f
-private :: mpi_win_f_ne_f08
-private :: mpi_message_f08_ne_f
-private :: mpi_message_f_ne_f08
-
+private :: MPI_Comm_neq
+private :: MPI_Datatype_neq
+private :: MPI_Errhandler_neq
+private :: MPI_File_neq
+private :: MPI_Group_neq
+private :: MPI_Info_neq
+private :: MPI_Op_neq
+private :: MPI_Request_neq
+private :: MPI_Win_neq
+private :: MPI_Message_neq
+
+private :: MPI_Comm_f08_ne_f
+private :: MPI_Comm_f_ne_f08
+private :: MPI_Datatype_f08_ne_f
+private :: MPI_Datatype_f_ne_f08
+private :: MPI_Errhandler_f08_ne_f
+private :: MPI_Errhandler_f_ne_f08
+private :: MPI_File_f08_ne_f
+private :: MPI_File_f_ne_f08
+private :: MPI_Group_f08_ne_f
+private :: MPI_Group_f_ne_f08
+private :: MPI_Info_f08_ne_f
+private :: MPI_Info_f_ne_f08
+private :: MPI_Op_f08_ne_f
+private :: MPI_Op_f_ne_f08
+private :: MPI_Request_f08_ne_f
+private :: MPI_Request_f_ne_f08
+private :: MPI_Win_f08_ne_f
+private :: MPI_Win_f_ne_f08
+private :: MPI_Message_f08_ne_f
+private :: MPI_Message_f_ne_f08
! MPI_Sizeof in 17.1.9
@@ -371,31 +385,31 @@ subroutine MPI_Sizeof_xcomplex128 (x, size, ierror)
ierror = 0
end subroutine MPI_Sizeof_xcomplex128
-elemental subroutine mpi_status_f08_assgn_c (status_f08, status_c)
+elemental subroutine MPI_Status_f08_assgn_c (status_f08, status_c)
! Defined status_f08 = status_c
type(MPI_Status),intent(out) :: status_f08
type(c_Status),intent(in) :: status_c
status_f08%count_lo = status_c%count_lo
status_f08%count_hi_and_cancelled = status_c%count_hi_and_cancelled
- status_f08%mpi_source = status_c%mpi_source
- status_f08%mpi_tag = status_c%mpi_tag
- status_f08%mpi_error = status_c%mpi_error
-end subroutine mpi_status_f08_assgn_c
+ status_f08%MPI_source = status_c%MPI_source
+ status_f08%MPI_tag = status_c%MPI_tag
+ status_f08%MPI_error = status_c%MPI_error
+end subroutine MPI_Status_f08_assgn_c
-elemental subroutine mpi_status_c_assgn_f08 (status_c, status_f08)
+elemental subroutine MPI_Status_c_assgn_f08 (status_c, status_f08)
! Defined status_c = status_f08
type(c_Status),intent(out) :: status_c
type(MPI_Status),intent(in) :: status_f08
status_c%count_lo = status_f08%count_lo
status_c%count_hi_and_cancelled = status_f08%count_hi_and_cancelled
- status_c%mpi_source = status_f08%mpi_source
- status_c%mpi_tag = status_f08%mpi_tag
- status_c%mpi_error = status_f08%mpi_error
-end subroutine mpi_status_c_assgn_f08
+ status_c%MPI_source = status_f08%MPI_source
+ status_c%MPI_tag = status_f08%MPI_tag
+ status_c%MPI_error = status_f08%MPI_error
+end subroutine MPI_Status_c_assgn_f08
-subroutine mpi_status_f_assgn_c (status_f, status_c)
+subroutine MPI_Status_f_assgn_c (status_f, status_c)
! Defined status_f = status_c
use,intrinsic :: iso_fortran_env, only: int32
integer,intent(out) :: status_f(MPI_STATUS_SIZE)
@@ -403,12 +417,12 @@ subroutine mpi_status_f_assgn_c (status_f, status_c)
status_f(1) = status_c%count_lo
status_f(2) = status_c%count_hi_and_cancelled
- status_f(MPI_SOURCE) = status_c%mpi_source
- status_f(MPI_TAG) = status_c%mpi_tag
- status_f(MPI_ERROR) = status_c%mpi_error
-end subroutine mpi_status_f_assgn_c
+ status_f(MPI_SOURCE) = status_c%MPI_source
+ status_f(MPI_TAG) = status_c%MPI_tag
+ status_f(MPI_ERROR) = status_c%MPI_error
+end subroutine MPI_Status_f_assgn_c
-subroutine mpi_status_c_assgn_f (status_c, status_f)
+subroutine MPI_Status_c_assgn_f (status_c, status_f)
! Defined status_c = status_f
use,intrinsic :: iso_fortran_env, only: int32
integer,intent(in) :: status_f(MPI_STATUS_SIZE)
@@ -417,10 +431,10 @@ subroutine mpi_status_c_assgn_f (status_c, status_f)
status_c%count_lo = status_f(1);
status_c%count_hi_and_cancelled = status_f(2);
- status_c%mpi_source = status_f(MPI_SOURCE)
- status_c%mpi_tag = status_f(MPI_TAG)
- status_c%mpi_error = status_f(MPI_ERROR)
-end subroutine mpi_status_c_assgn_f
+ status_c%MPI_source = status_f(MPI_SOURCE)
+ status_c%MPI_tag = status_f(MPI_TAG)
+ status_c%MPI_error = status_f(MPI_ERROR)
+end subroutine MPI_Status_c_assgn_f
! int MPI_Status_f082c(const MPI_F08_status *status_f08, MPI_Status *status_c)
@@ -447,7 +461,6 @@ function PMPI_Status_f082c (status_f08, status_c) &
end function PMPI_Status_f082c
! int MPI_Status_c2f08(const MPI_Status *status_c, MPI_F08_status *status_f08)
-
function MPI_Status_c2f08 (status_c, status_f08) &
bind(C, name="MPI_Status_c2f08") result (res)
use,intrinsic :: iso_c_binding, only: c_int
@@ -470,225 +483,225 @@ function PMPI_Status_c2f08 (status_c, status_f08) &
res = 0
end function PMPI_Status_c2f08
-function mpi_comm_eq (x, y) result(res)
+function MPI_Comm_eq (x, y) result(res)
type(MPI_Comm), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL == y%MPI_VAL)
-end function mpi_comm_eq
+end function MPI_Comm_eq
-function mpi_datatype_eq (x, y) result(res)
+function MPI_Datatype_eq (x, y) result(res)
type(MPI_Datatype), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL == y%MPI_VAL)
-end function mpi_datatype_eq
+end function MPI_Datatype_eq
-function mpi_errhandler_eq (x, y) result(res)
+function MPI_Errhandler_eq (x, y) result(res)
type(MPI_Errhandler), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL == y%MPI_VAL)
-end function mpi_errhandler_eq
+end function MPI_Errhandler_eq
-function mpi_file_eq (x, y) result(res)
+function MPI_File_eq (x, y) result(res)
type(MPI_File), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL == y%MPI_VAL)
-end function mpi_File_eq
+end function MPI_File_eq
-function mpi_group_eq (x, y) result(res)
+function MPI_Group_eq (x, y) result(res)
type(MPI_Group), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL == y%MPI_VAL)
-end function mpi_group_eq
+end function MPI_Group_eq
-function mpi_info_eq (x, y) result(res)
+function MPI_Info_eq (x, y) result(res)
type(MPI_Info), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL == y%MPI_VAL)
-end function mpi_info_eq
+end function MPI_Info_eq
-function mpi_op_eq (x, y) result(res)
+function MPI_Op_eq (x, y) result(res)
type(MPI_Op), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL == y%MPI_VAL)
-end function mpi_op_eq
+end function MPI_Op_eq
-function mpi_request_eq (x, y) result(res)
+function MPI_Request_eq (x, y) result(res)
type(MPI_Request), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL == y%MPI_VAL)
-end function mpi_request_eq
+end function MPI_Request_eq
-function mpi_win_eq (x, y) result(res)
+function MPI_Win_eq (x, y) result(res)
type(MPI_Win), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL == y%MPI_VAL)
-end function mpi_win_eq
+end function MPI_Win_eq
-function mpi_message_eq (x, y) result(res)
+function MPI_Message_eq (x, y) result(res)
type(MPI_Message), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL == y%MPI_VAL)
-end function mpi_message_eq
+end function MPI_Message_eq
-function mpi_comm_f08_eq_f (f08, f) result(res)
+function MPI_Comm_f08_eq_f (f08, f) result(res)
! Defined comparison for MPI_Comm and integer handles
type(MPI_Comm),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_comm_f08_eq_f
+end function MPI_Comm_f08_eq_f
-function mpi_comm_f_eq_f08 (f, f08) result(res)
+function MPI_Comm_f_eq_f08 (f, f08) result(res)
! Defined comparison for MPI_Comm and integer handles
type(MPI_Comm),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_comm_f_eq_f08
+end function MPI_Comm_f_eq_f08
-function mpi_datatype_f08_eq_f (f08, f) result(res)
+function MPI_Datatype_f08_eq_f (f08, f) result(res)
! Defined comparison for MPI_Datatype and integer handles
type(MPI_Datatype),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_datatype_f08_eq_f
+end function MPI_Datatype_f08_eq_f
-function mpi_datatype_f_eq_f08 (f, f08) result(res)
+function MPI_Datatype_f_eq_f08 (f, f08) result(res)
! Defined comparison for MPI_Datatype and integer handles
type(MPI_Datatype),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_datatype_f_eq_f08
+end function MPI_Datatype_f_eq_f08
-function mpi_errhandler_f08_eq_f (f08, f) result(res)
+function MPI_Errhandler_f08_eq_f (f08, f) result(res)
! Defined comparison for MPI_Errhandler and integer handles
type(MPI_Errhandler),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_errhandler_f08_eq_f
+end function MPI_Errhandler_f08_eq_f
-function mpi_errhandler_f_eq_f08 (f, f08) result(res)
+function MPI_Errhandler_f_eq_f08 (f, f08) result(res)
! Defined comparison for MPI_Errhandler and integer handles
type(MPI_Errhandler),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_errhandler_f_eq_f08
+end function MPI_Errhandler_f_eq_f08
-function mpi_file_f_eq_f08 (f, f08) result(res)
+function MPI_File_f_eq_f08 (f, f08) result(res)
! Defined comparison for MPI_File and integer handles
type(MPI_File),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_file_f_eq_f08
+end function MPI_File_f_eq_f08
-function mpi_file_f08_eq_f (f08, f) result(res)
+function MPI_File_f08_eq_f (f08, f) result(res)
! Defined comparison for MPI_File and integer handles
type(MPI_File),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_file_f08_eq_f
+end function MPI_File_f08_eq_f
-function mpi_group_f08_eq_f (f08, f) result(res)
+function MPI_Group_f08_eq_f (f08, f) result(res)
! Defined comparison for MPI_Group and integer handles
type(MPI_Group),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_group_f08_eq_f
+end function MPI_Group_f08_eq_f
-function mpi_group_f_eq_f08 (f, f08) result(res)
+function MPI_Group_f_eq_f08 (f, f08) result(res)
! Defined comparison for MPI_Group and integer handles
type(MPI_Group),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_group_f_eq_f08
+end function MPI_Group_f_eq_f08
-function mpi_info_f08_eq_f (f08, f) result(res)
+function MPI_Info_f08_eq_f (f08, f) result(res)
! Defined comparison for MPI_Info and integer handles
type(MPI_Info),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_info_f08_eq_f
+end function MPI_Info_f08_eq_f
-function mpi_info_f_eq_f08 (f, f08) result(res)
+function MPI_Info_f_eq_f08 (f, f08) result(res)
! Defined comparison for MPI_Info and integer handles
type(MPI_Info),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_info_f_eq_f08
+end function MPI_Info_f_eq_f08
-function mpi_op_f08_eq_f (f08, f) result(res)
+function MPI_Op_f08_eq_f (f08, f) result(res)
! Defined comparison for MPI_Op and integer handles
type(MPI_Op),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_op_f08_eq_f
+end function MPI_Op_f08_eq_f
-function mpi_op_f_eq_f08 (f, f08) result(res)
+function MPI_Op_f_eq_f08 (f, f08) result(res)
! Defined comparison for MPI_Op and integer handles
type(MPI_Op),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_op_f_eq_f08
+end function MPI_Op_f_eq_f08
-function mpi_request_f08_eq_f (f08, f) result(res)
+function MPI_Request_f08_eq_f (f08, f) result(res)
! Defined comparison for MPI_Request and integer handles
type(MPI_Request),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_request_f08_eq_f
+end function MPI_Request_f08_eq_f
-function mpi_request_f_eq_f08 (f, f08) result(res)
+function MPI_Request_f_eq_f08 (f, f08) result(res)
! Defined comparison for MPI_Request and integer handles
type(MPI_Request),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_request_f_eq_f08
+end function MPI_Request_f_eq_f08
-function mpi_win_f08_eq_f (f08, f) result(res)
+function MPI_Win_f08_eq_f (f08, f) result(res)
! Defined comparison for MPI_Win and integer handles
type(MPI_Win),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_win_f08_eq_f
+end function MPI_Win_f08_eq_f
-function mpi_win_f_eq_f08 (f, f08) result(res)
+function MPI_Win_f_eq_f08 (f, f08) result(res)
! Defined comparison for MPI_Win and integer handles
type(MPI_Win),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_win_f_eq_f08
+end function MPI_Win_f_eq_f08
-function mpi_message_f08_eq_f (f08, f) result(res)
+function MPI_Message_f08_eq_f (f08, f) result(res)
! Defined comparison for MPI_Message and integer handles
type(MPI_Message),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_message_f08_eq_f
+end function MPI_Message_f08_eq_f
-function mpi_message_f_eq_f08 (f, f08) result(res)
+function MPI_Message_f_eq_f08 (f, f08) result(res)
! Defined comparison for MPI_Message and integer handles
type(MPI_Message),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL == f
-end function mpi_message_f_eq_f08
+end function MPI_Message_f_eq_f08
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
@@ -696,567 +709,362 @@ end function mpi_message_f_eq_f08
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-function mpi_comm_neq (x, y) result(res)
+function MPI_Comm_neq (x, y) result(res)
type(MPI_Comm), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL /= y%MPI_VAL)
-end function mpi_comm_neq
+end function MPI_Comm_neq
-function mpi_datatype_neq (x, y) result(res)
+function MPI_Datatype_neq (x, y) result(res)
type(MPI_Datatype), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL /= y%MPI_VAL)
-end function mpi_datatype_neq
+end function MPI_Datatype_neq
-function mpi_errhandler_neq (x, y) result(res)
+function MPI_Errhandler_neq (x, y) result(res)
type(MPI_Errhandler), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL /= y%MPI_VAL)
-end function mpi_errhandler_neq
+end function MPI_Errhandler_neq
-function mpi_file_neq (x, y) result(res)
+function MPI_File_neq (x, y) result(res)
type(MPI_File), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL /= y%MPI_VAL)
-end function mpi_File_neq
+end function MPI_File_neq
-function mpi_group_neq (x, y) result(res)
+function MPI_Group_neq (x, y) result(res)
type(MPI_Group), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL /= y%MPI_VAL)
-end function mpi_group_neq
+end function MPI_Group_neq
-function mpi_info_neq (x, y) result(res)
+function MPI_Info_neq (x, y) result(res)
type(MPI_Info), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL /= y%MPI_VAL)
-end function mpi_info_neq
+end function MPI_Info_neq
-function mpi_op_neq (x, y) result(res)
+function MPI_Op_neq (x, y) result(res)
type(MPI_Op), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL /= y%MPI_VAL)
-end function mpi_op_neq
+end function MPI_Op_neq
-function mpi_request_neq (x, y) result(res)
+function MPI_Request_neq (x, y) result(res)
type(MPI_Request), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL /= y%MPI_VAL)
-end function mpi_request_neq
+end function MPI_Request_neq
-function mpi_win_neq (x, y) result(res)
+function MPI_Win_neq (x, y) result(res)
type(MPI_Win), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL /= y%MPI_VAL)
-end function mpi_win_neq
+end function MPI_Win_neq
-function mpi_message_neq (x, y) result(res)
+function MPI_Message_neq (x, y) result(res)
type(MPI_Message), intent(in) :: x, y
logical :: res
res = (x%MPI_VAL /= y%MPI_VAL)
-end function mpi_message_neq
+end function MPI_Message_neq
-function mpi_comm_f08_ne_f (f08, f) result(res)
+function MPI_Comm_f08_ne_f (f08, f) result(res)
! Defined comparison for MPI_Comm and integer handles
type(MPI_Comm),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_comm_f08_ne_f
+end function MPI_Comm_f08_ne_f
-function mpi_comm_f_ne_f08 (f, f08) result(res)
+function MPI_Comm_f_ne_f08 (f, f08) result(res)
! Defined comparison for MPI_Comm and integer handles
type(MPI_Comm),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_comm_f_ne_f08
+end function MPI_Comm_f_ne_f08
-function mpi_datatype_f08_ne_f (f08, f) result(res)
+function MPI_Datatype_f08_ne_f (f08, f) result(res)
! Defined comparison for MPI_Datatype and integer handles
type(MPI_Datatype),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_datatype_f08_ne_f
+end function MPI_Datatype_f08_ne_f
-function mpi_datatype_f_ne_f08 (f, f08) result(res)
+function MPI_Datatype_f_ne_f08 (f, f08) result(res)
! Defined comparison for MPI_Datatype and integer handles
type(MPI_Datatype),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_datatype_f_ne_f08
+end function MPI_Datatype_f_ne_f08
-function mpi_errhandler_f08_ne_f (f08, f) result(res)
+function MPI_Errhandler_f08_ne_f (f08, f) result(res)
! Defined comparison for MPI_Errhandler and integer handles
type(MPI_Errhandler),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_errhandler_f08_ne_f
+end function MPI_Errhandler_f08_ne_f
-function mpi_errhandler_f_ne_f08 (f, f08) result(res)
+function MPI_Errhandler_f_ne_f08 (f, f08) result(res)
! Defined comparison for MPI_Errhandler and integer handles
type(MPI_Errhandler),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_errhandler_f_ne_f08
+end function MPI_Errhandler_f_ne_f08
-function mpi_file_f_ne_f08 (f, f08) result(res)
+function MPI_File_f_ne_f08 (f, f08) result(res)
! Defined comparison for MPI_File and integer handles
type(MPI_File),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_file_f_ne_f08
+end function MPI_File_f_ne_f08
-function mpi_file_f08_ne_f (f08, f) result(res)
+function MPI_File_f08_ne_f (f08, f) result(res)
! Defined comparison for MPI_File and integer handles
type(MPI_File),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_file_f08_ne_f
+end function MPI_File_f08_ne_f
-function mpi_group_f08_ne_f (f08, f) result(res)
+function MPI_Group_f08_ne_f (f08, f) result(res)
! Defined comparison for MPI_Group and integer handles
type(MPI_Group),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_group_f08_ne_f
+end function MPI_Group_f08_ne_f
-function mpi_group_f_ne_f08 (f, f08) result(res)
+function MPI_Group_f_ne_f08 (f, f08) result(res)
! Defined comparison for MPI_Group and integer handles
type(MPI_Group),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_group_f_ne_f08
+end function MPI_Group_f_ne_f08
-function mpi_info_f08_ne_f (f08, f) result(res)
+function MPI_Info_f08_ne_f (f08, f) result(res)
! Defined comparison for MPI_Info and integer handles
type(MPI_Info),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_info_f08_ne_f
+end function MPI_Info_f08_ne_f
-function mpi_info_f_ne_f08 (f, f08) result(res)
+function MPI_Info_f_ne_f08 (f, f08) result(res)
! Defined comparison for MPI_Info and integer handles
type(MPI_Info),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_info_f_ne_f08
+end function MPI_Info_f_ne_f08
-function mpi_op_f08_ne_f (f08, f) result(res)
+function MPI_Op_f08_ne_f (f08, f) result(res)
! Defined comparison for MPI_Op and integer handles
type(MPI_Op),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_op_f08_ne_f
+end function MPI_Op_f08_ne_f
-function mpi_op_f_ne_f08 (f, f08) result(res)
+function MPI_Op_f_ne_f08 (f, f08) result(res)
! Defined comparison for MPI_Op and integer handles
type(MPI_Op),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_op_f_ne_f08
+end function MPI_Op_f_ne_f08
-function mpi_request_f08_ne_f (f08, f) result(res)
+function MPI_Request_f08_ne_f (f08, f) result(res)
! Defined comparison for MPI_Request and integer handles
type(MPI_Request),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_request_f08_ne_f
+end function MPI_Request_f08_ne_f
-function mpi_request_f_ne_f08 (f, f08) result(res)
+function MPI_Request_f_ne_f08 (f, f08) result(res)
! Defined comparison for MPI_Request and integer handles
type(MPI_Request),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_request_f_ne_f08
+end function MPI_Request_f_ne_f08
-function mpi_win_f08_ne_f (f08, f) result(res)
+function MPI_Win_f08_ne_f (f08, f) result(res)
! Defined comparison for MPI_Win and integer handles
type(MPI_Win),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_win_f08_ne_f
+end function MPI_Win_f08_ne_f
-function mpi_win_f_ne_f08 (f, f08) result(res)
+function MPI_Win_f_ne_f08 (f, f08) result(res)
! Defined comparison for MPI_Win and integer handles
type(MPI_Win),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_win_f_ne_f08
+end function MPI_Win_f_ne_f08
-function mpi_message_f08_ne_f (f08, f) result(res)
+function MPI_Message_f08_ne_f (f08, f) result(res)
! Defined comparison for MPI_Message and integer handles
type(MPI_Message),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_message_f08_ne_f
+end function MPI_Message_f08_ne_f
-function mpi_message_f_ne_f08 (f, f08) result(res)
+function MPI_Message_f_ne_f08 (f, f08) result(res)
! Defined comparison for MPI_Message and integer handles
type(MPI_Message),intent(in) :: f08
integer,intent(in) :: f
logical :: res
res = f08%MPI_VAL /= f
-end function mpi_message_f_ne_f08
+end function MPI_Message_f_ne_f08
-! 17.2.4 - Conversion between Fortran and C handles
+! 17.2.4 - Conversion functions between Fortran and C handles, which are only defined in
+! the C interface and can be implemented as macros. We extend them to Fortran.
+! TODO: Do we need the PMPI version? Probably not since they are not in standard.
-! MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
-function mpi_comm_f2c (comm) bind(c,name="MPI_Comm_f2c") result (res)
+function MPI_Comm_f2c (comm) result (res)
use mpi_c_interface_types, only: c_Comm
integer,value :: comm
integer(c_Comm) :: res
-
- res = comm
-end function mpi_comm_f2c
-
-function pmpi_comm_f2c (comm) bind(c,name="PMPI_Comm_f2c") result (res)
- use mpi_c_interface_types, only: c_Comm
- integer,value :: comm
- integer(c_Comm) :: res
-
- res = comm
-end function pmpi_comm_f2c
-
-! MPI_Fint MPI_Comm_c2f(MPI_Comm comm)
-function mpi_comm_c2f (comm) bind(c,name="MPI_Comm_c2f") result (res)
- use mpi_c_interface_types, only: c_Comm
- integer(c_Comm),value :: comm
- integer :: res
-
res = comm
-end function mpi_comm_c2f
+end function MPI_Comm_f2c
-function pmpi_comm_c2f (comm) bind(c,name="PMPI_Comm_c2f") result (res)
+function MPI_Comm_c2f (comm) result (res)
use mpi_c_interface_types, only: c_Comm
integer(c_Comm),value :: comm
integer :: res
-
res = comm
-end function pmpi_comm_c2f
+end function MPI_Comm_c2f
-! MPI_Type MPI_Type_f2c(MPI_Fint type)
-function mpi_type_f2c (datatype) bind(c,name="MPI_Type_f2c") result (res)
+function MPI_type_f2c (datatype) result (res)
use mpi_c_interface_types, only: c_Datatype
integer,value :: datatype
integer(c_Datatype) :: res
-
res = datatype
-end function mpi_type_f2c
+end function MPI_type_f2c
-function pmpi_type_f2c (datatype) bind(c,name="PMPI_Type_f2c") result (res)
- use mpi_c_interface_types, only: c_Datatype
- integer,value :: datatype
- integer(c_Datatype) :: res
-
- res = datatype
-end function pmpi_type_f2c
-
-! MPI_Fint MPI_Type_c2f(MPI_Type type)
-function mpi_type_c2f (datatype) bind(c,name="MPI_Type_c2f") result (res)
+function MPI_type_c2f (datatype) result (res)
use mpi_c_interface_types, only: c_Datatype
integer(c_Datatype),value :: datatype
integer :: res
-
res = datatype
-end function mpi_type_c2f
-
-function pmpi_type_c2f (datatype) bind(c,name="PMPI_Type_c2f") result (res)
- use mpi_c_interface_types, only: c_Datatype
- integer(c_Datatype),value :: datatype
- integer :: res
-
- res = datatype
-end function pmpi_type_c2f
-
-! MPI_Group MPI_Group_f2c(MPI_Fint group)
-function mpi_group_f2c (group) bind(c,name="MPI_Group_f2c") result (res)
- use mpi_c_interface_types, only: c_Group
- integer,value :: group
- integer(c_Group) :: res
+end function MPI_type_c2f
- res = group
-end function mpi_group_f2c
-
-function pmpi_group_f2c (group) bind(c,name="PMPI_Group_f2c") result (res)
+function MPI_Group_f2c (group) result (res)
use mpi_c_interface_types, only: c_Group
integer,value :: group
integer(c_Group) :: res
-
res = group
-end function pmpi_group_f2c
+end function MPI_Group_f2c
-
-! MPI_Fint MPI_Group_c2f(MPI_Datatype datatype)
-function mpi_group_c2f (group) bind(c,name="MPI_Group_c2f") result (res)
+function MPI_Group_c2f (group) result (res)
use mpi_c_interface_types, only: c_Group
integer(c_Group),value :: group
integer :: res
-
res = group
-end function mpi_group_c2f
-
-function pmpi_group_c2f (group) bind(c,name="PMPI_Group_c2f") result (res)
- use mpi_c_interface_types, only: c_Group
- integer(c_Group),value :: group
- integer :: res
-
- res = group
-end function pmpi_group_c2f
-
-
-! MPI_Request MPI_Request_f2c(MPI_Fint request)
-function mpi_request_f2c (request) bind(c,name="MPI_Request_f2c") result (res)
- use mpi_c_interface_types, only: c_Request
- integer,value :: request
- integer(c_Request) :: res
-
- res = request
-end function mpi_request_f2c
+end function MPI_Group_c2f
-function pmpi_request_f2c (request) bind(c,name="PMPI_Request_f2c") result (res)
+function MPI_Request_f2c (request) result (res)
use mpi_c_interface_types, only: c_Request
integer,value :: request
integer(c_Request) :: res
-
res = request
-end function pmpi_request_f2c
-
+end function MPI_Request_f2c
-! MPI_Fint MPI_Request_c2f(MPI_Datatype datatype)
-function mpi_request_c2f (request) bind(c,name="MPI_Request_c2f") result (res)
+function MPI_Request_c2f (request) result (res)
use mpi_c_interface_types, only: c_Request
integer(c_Request),value :: request
integer :: res
-
res = request
-end function mpi_request_c2f
-
-function pmpi_request_c2f (request) bind(c,name="PMPI_Request_c2f") result (res)
- use mpi_c_interface_types, only: c_Request
- integer(c_Request),value :: request
- integer :: res
-
- res = request
-end function pmpi_request_c2f
-
-! MPI_File MPI_File_f2c(MPI_Fint file)
-! The MPI_File_f2c/c2f functions are defined in C
-
-function MPI_File_f2c (file) bind(c,name="MPI_File_f2c") result (res)
- use mpi_c_interface_types, only: c_File
- integer,value :: file
- integer(c_File) :: res
-end function MPI_File_f2c
-
-function pmpi_file_f2c (file) bind(c,name="PMPI_File_f2c") result (res)
- use mpi_c_interface_types, only: c_File
- integer,value :: file
- integer(c_File) :: res
-
- res = file
-end function pmpi_file_f2c
-
-! MPI_Fint MPI_File_c2f(MPI_Datatype datatype)
-function MPI_File_c2f (file) bind(c,name="MPI_File_c2f") result (res)
- use mpi_c_interface_types, only: c_File
- integer(c_File),value :: file
- integer :: res
-end function MPI_File_c2f
-
-function pmpi_file_c2f (file) bind(c,name="PMPI_File_c2f") result (res)
- use mpi_c_interface_types, only: c_File
- integer(c_File),value :: file
- integer :: res
+end function MPI_Request_c2f
- res = file
-end function pmpi_file_c2f
-
-! MPI_Win MPI_Win_f2c(MPI_Fint win)
-function mpi_win_f2c (win) bind(c,name="MPI_Win_f2c") result (res)
+function MPI_Win_f2c (win) result (res)
use mpi_c_interface_types, only: C_win
integer,value :: win
integer(C_win) :: res
-
res = win
-end function mpi_win_f2c
+end function MPI_Win_f2c
-function pmpi_win_f2c (win) bind(c,name="PMPI_Win_f2c") result (res)
- use mpi_c_interface_types, only: C_win
- integer,value :: win
- integer(C_win) :: res
-
- res = win
-end function pmpi_win_f2c
-
-! MPI_Fint MPI_Win_c2f(MPI_Datatype datatype)
-function mpi_win_c2f (win) bind(c,name="MPI_Win_c2f") result (res)
+function MPI_Win_c2f (win) result (res)
use mpi_c_interface_types, only: C_win
integer(C_win),value :: win
integer :: res
-
res = win
-end function mpi_win_c2f
+end function MPI_Win_c2f
-function pmpi_win_c2f (win) bind(c,name="PMPI_Win_c2f") result (res)
+function pMPI_Win_c2f (win) result (res)
use mpi_c_interface_types, only: C_win
integer(C_win),value :: win
integer :: res
-
res = win
-end function pmpi_win_c2f
-
-! MPI_Op MPI_Op_f2c(MPI_Fint op)
-function mpi_op_f2c (op) bind(c,name="MPI_Op_f2c") result (res)
- use mpi_c_interface_types, only: c_Op
- integer,value :: op
- integer(c_Op) :: res
+end function pMPI_Win_c2f
- res = op
-end function mpi_op_f2c
-function pmpi_op_f2c (op) bind(c,name="PMPI_Op_f2c") result (res)
+function MPI_Op_f2c (op) result (res)
use mpi_c_interface_types, only: c_Op
integer,value :: op
integer(c_Op) :: res
-
res = op
-end function pmpi_op_f2c
+end function MPI_Op_f2c
-! MPI_Fint MPI_Op_c2f(MPI_Datatype datatype)
-function mpi_op_c2f (op) bind(c,name="MPI_Op_c2f") result (res)
+function MPI_Op_c2f (op) result (res)
use mpi_c_interface_types, only: c_Op
integer(c_Op),value :: op
integer :: res
-
- res = op
-end function mpi_op_c2f
-
-function pmpi_op_c2f (op) bind(c,name="PMPI_Op_c2f") result (res)
- use mpi_c_interface_types, only: c_Op
- integer(c_Op),value :: op
- integer :: res
-
res = op
-end function pmpi_op_c2f
+end function MPI_Op_c2f
-! MPI_Info MPI_Info_f2c(MPI_Fint info)
-function mpi_info_f2c (info) bind(c,name="MPI_Info_f2c") result (res)
+function MPI_Info_f2c (info) result (res)
use mpi_c_interface_types, only: c_Info
integer,value :: info
integer(c_Info) :: res
-
- res = info
-end function mpi_info_f2c
-
-function pmpi_info_f2c (info) bind(c,name="PMPI_Info_f2c") result (res)
- use mpi_c_interface_types, only: c_Info
- integer,value :: info
- integer(c_Info) :: res
-
- res = info
-end function pmpi_info_f2c
-
-! MPI_Fint MPI_Info_c2f(MPI_Datatype datatype)
-function mpi_info_c2f (info) bind(c,name="MPI_Info_c2f") result (res)
- use mpi_c_interface_types, only: c_Info
- integer(c_Info),value :: info
- integer :: res
-
res = info
-end function mpi_info_c2f
+end function MPI_Info_f2c
-function pmpi_info_c2f (info) bind(c,name="PMPI_Info_c2f") result (res)
+function MPI_Info_c2f (info) result (res)
use mpi_c_interface_types, only: c_Info
integer(c_Info),value :: info
integer :: res
-
res = info
-end function pmpi_info_c2f
+end function MPI_Info_c2f
-! MPI_Errhandler MPI_Errhandler_f2c(MPI_Fint errhandler)
-function mpi_errhandler_f2c (errhandler) bind(c,name="MPI_Errhandler_f2c") result (res)
+function MPI_Errhandler_f2c (errhandler) result (res)
use mpi_c_interface_types, only: c_Errhandler
integer,value :: errhandler
integer(c_Errhandler) :: res
-
- res = errhandler
-end function mpi_errhandler_f2c
-
-function pmpi_errhandler_f2c (errhandler) bind(c,name="PMPI_Errhandler_f2c") result (res)
- use mpi_c_interface_types, only: c_Errhandler
- integer,value :: errhandler
- integer(c_Errhandler) :: res
-
- res = errhandler
-end function pmpi_errhandler_f2c
-
-! MPI_Fint MPI_Errhandler_c2f(MPI_Datatype datatype)
-function mpi_errhandler_c2f (errhandler) bind(c,name="MPI_Errhandler_c2f") result (res)
- use mpi_c_interface_types, only: c_Errhandler
- integer(c_Errhandler),value :: errhandler
- integer :: res
-
res = errhandler
-end function mpi_errhandler_c2f
+end function MPI_Errhandler_f2c
-function pmpi_errhandler_c2f (errhandler) bind(c,name="PMPI_Errhandler_c2f") result (res)
+function MPI_Errhandler_c2f (errhandler) result (res)
use mpi_c_interface_types, only: c_Errhandler
integer(c_Errhandler),value :: errhandler
integer :: res
-
res = errhandler
-end function pmpi_errhandler_c2f
+end function MPI_Errhandler_c2f
-! MPI_Message MPI_Message_f2c(MPI_Fint message)
-function mpi_message_f2c (message) bind(c,name="MPI_Message_f2c") result (res)
+function MPI_Message_f2c (message) result (res)
use mpi_c_interface_types, only: c_Message
integer,value :: message
integer(c_Message) :: res
-
res = message
-end function mpi_message_f2c
+end function MPI_Message_f2c
-function pmpi_message_f2c (message) bind(c,name="PMPI_Message_f2c") result (res)
- use mpi_c_interface_types, only: c_Message
- integer,value :: message
- integer(c_Message) :: res
-
- res = message
-end function pmpi_message_f2c
-
-! MPI_Fint MPI_Message_c2f(MPI_Datatype datatype)
-function mpi_message_c2f (message) bind(c,name="MPI_Message_c2f") result (res)
- use mpi_c_interface_types, only: c_Message
- integer(c_Message),value :: message
- integer :: res
-
- res = message
-end function mpi_message_c2f
-
-function pmpi_message_c2f (message) bind(c,name="PMPI_Message_c2f") result (res)
+function MPI_Message_c2f (message) result (res)
use mpi_c_interface_types, only: c_Message
integer(c_Message),value :: message
integer :: res
-
res = message
-end function pmpi_message_c2f
+end function MPI_Message_c2f
-end module mpi_f08_types
+end module MPI_f08_types
-----------------------------------------------------------------------
Summary of changes:
src/binding/fortran/use_mpi_f08/mpi_f08_types.F90 | 852 ++++++++-------------
1 files changed, 330 insertions(+), 522 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.1-81-g2e7707f
by noreply@mpich.org 11 Jul '14
by noreply@mpich.org 11 Jul '14
11 Jul '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 2e7707fbbc4b883cb5562b7c9ddca3248c6ef63d (commit)
from 02813e26c1746a11167be3454fb9912673af0711 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/2e7707fbbc4b883cb5562b7c9ddca3248…
commit 2e7707fbbc4b883cb5562b7c9ddca3248c6ef63d
Author: Pavan Balaji <balaji(a)anl.gov>
Date: Fri Jul 11 13:44:56 2014 -0500
Avoid duplicate win_group_ranks creation
We were creating the rank list for the window start group twice
earlier, once for synchronization and once for the actual issuing of
the operations. This patch combines them into a single creation of
the array.
Signed-off-by: Xin Zhao <xinzhao3(a)illinois.edu>
diff --git a/src/mpid/ch3/src/ch3u_rma_sync.c b/src/mpid/ch3/src/ch3u_rma_sync.c
index 859b094..a2158b7 100644
--- a/src/mpid/ch3/src/ch3u_rma_sync.c
+++ b/src/mpid/ch3/src/ch3u_rma_sync.c
@@ -2171,15 +2171,14 @@ int MPIDI_Win_post(MPID_Group *post_grp_ptr, int assert, MPID_Win *win_ptr)
}
-static int recv_post_msgs(MPID_Group *group_ptr, MPID_Win *win_ptr, int local)
+static int recv_post_msgs(MPID_Win *win_ptr, int *ranks_in_win_grp, int local)
{
int mpi_errno = MPI_SUCCESS;
- int start_grp_size, *ranks_in_start_grp, *ranks_in_win_grp, src, rank, i, j;
+ int start_grp_size, src, rank, i, j;
MPI_Request *req;
MPI_Status *status;
MPID_Comm *comm_ptr = win_ptr->comm_ptr;
- MPID_Group *win_grp_ptr;
- MPIU_CHKLMEM_DECL(4);
+ MPIU_CHKLMEM_DECL(2);
MPIDI_STATE_DECL(MPID_STATE_RECV_POST_MSGS);
MPIDI_RMA_FUNC_ENTER(MPID_STATE_RECV_POST_MSGS);
@@ -2187,23 +2186,8 @@ static int recv_post_msgs(MPID_Group *group_ptr, MPID_Win *win_ptr, int local)
/* Wait for 0-byte messages from processes either on the same node
* or not (depending on the "local" parameter), so we know they
* have entered post. */
- start_grp_size = win_ptr->start_group_ptr->size;
- MPIU_CHKLMEM_MALLOC(ranks_in_start_grp, int *, start_grp_size*sizeof(int),
- mpi_errno, "ranks_in_start_grp");
-
- MPIU_CHKLMEM_MALLOC(ranks_in_win_grp, int *, start_grp_size*sizeof(int),
- mpi_errno, "ranks_in_win_grp");
-
- for (i = 0; i < start_grp_size; i++)
- ranks_in_start_grp[i] = i;
- mpi_errno = MPIR_Comm_group_impl(comm_ptr, &win_grp_ptr);
- if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }
-
- mpi_errno = MPIR_Group_translate_ranks_impl(win_ptr->start_group_ptr, start_grp_size,
- ranks_in_start_grp,
- win_grp_ptr, ranks_in_win_grp);
- if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ start_grp_size = win_ptr->start_group_ptr->size;
rank = win_ptr->comm_ptr->rank;
MPIU_CHKLMEM_MALLOC(req, MPI_Request *, start_grp_size*sizeof(MPI_Request), mpi_errno, "req");
@@ -2255,12 +2239,42 @@ static int recv_post_msgs(MPID_Group *group_ptr, MPID_Win *win_ptr, int local)
/* --END ERROR HANDLING-- */
}
+ fn_fail:
+ MPIU_CHKLMEM_FREEALL();
+ MPIDI_RMA_FUNC_EXIT(MPID_STATE_RECV_POST_MSGS);
+ return mpi_errno;
+}
+
+static int fill_ranks_in_win_grp(MPID_Win *win_ptr, int *ranks_in_win_grp)
+{
+ int mpi_errno = MPI_SUCCESS;
+ int i, *ranks_in_start_grp;
+ MPID_Group *win_grp_ptr;
+ MPIU_CHKLMEM_DECL(2);
+ MPIDI_STATE_DECL(MPID_STATE_FILL_RANKS_IN_WIN_GRP);
+
+ MPIDI_RMA_FUNC_ENTER(MPID_STATE_FILL_RANKS_IN_WIN_GRP);
+
+ MPIU_CHKLMEM_MALLOC(ranks_in_start_grp, int *, win_ptr->start_group_ptr->size*sizeof(int),
+ mpi_errno, "ranks_in_start_grp");
+
+ for (i = 0; i < win_ptr->start_group_ptr->size; i++)
+ ranks_in_start_grp[i] = i;
+
+ mpi_errno = MPIR_Comm_group_impl(win_ptr->comm_ptr, &win_grp_ptr);
+ if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }
+
+ mpi_errno = MPIR_Group_translate_ranks_impl(win_ptr->start_group_ptr, win_ptr->start_group_ptr->size,
+ ranks_in_start_grp,
+ win_grp_ptr, ranks_in_win_grp);
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
mpi_errno = MPIR_Group_free_impl(win_grp_ptr);
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
fn_fail:
MPIU_CHKLMEM_FREEALL();
- MPIDI_RMA_FUNC_EXIT(MPID_STATE_RECV_POST_MSGS);
+ MPIDI_RMA_FUNC_EXIT(MPID_STATE_FILL_RANKS_IN_WIN_GRP);
return mpi_errno;
}
@@ -2272,6 +2286,8 @@ static int recv_post_msgs(MPID_Group *group_ptr, MPID_Win *win_ptr, int local)
int MPIDI_Win_start(MPID_Group *group_ptr, int assert, MPID_Win *win_ptr)
{
int mpi_errno=MPI_SUCCESS;
+ int *ranks_in_win_grp;
+ MPIU_CHKLMEM_DECL(1);
MPIDI_STATE_DECL(MPID_STATE_MPIDI_WIN_START);
MPIDI_RMA_FUNC_ENTER(MPID_STATE_MPIDI_WIN_START);
@@ -2326,10 +2342,17 @@ int MPIDI_Win_start(MPID_Group *group_ptr, int assert, MPID_Win *win_ptr)
win_ptr->start_assert = assert;
/* wait for messages from local processes */
- mpi_errno = recv_post_msgs(group_ptr, win_ptr, 1);
+ MPIU_CHKLMEM_MALLOC(ranks_in_win_grp, int *, win_ptr->start_group_ptr->size*sizeof(int),
+ mpi_errno, "ranks_in_win_grp");
+
+ mpi_errno = fill_ranks_in_win_grp(win_ptr, ranks_in_win_grp);
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
+ mpi_errno = recv_post_msgs(win_ptr, ranks_in_win_grp, 1);
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
fn_fail:
+ MPIU_CHKLMEM_FREEALL();
MPIDI_RMA_FUNC_EXIT(MPID_STATE_MPIDI_WIN_START);
return mpi_errno;
}
@@ -2349,11 +2372,10 @@ int MPIDI_Win_complete(MPID_Win *win_ptr)
MPIDI_RMA_Ops_list_t *ops_list;
MPID_Comm *comm_ptr;
MPI_Win source_win_handle, target_win_handle;
- MPID_Group *win_grp_ptr;
- int start_grp_size, *ranks_in_start_grp, *ranks_in_win_grp, rank;
+ int start_grp_size, *ranks_in_win_grp, rank;
int nRequest = 0;
int nRequestNew = 0;
- MPIU_CHKLMEM_DECL(7);
+ MPIU_CHKLMEM_DECL(6);
MPIDI_STATE_DECL(MPID_STATE_MPIDI_WIN_COMPLETE);
MPIDI_RMA_FUNC_ENTER(MPID_STATE_MPIDI_WIN_COMPLETE);
@@ -2382,23 +2404,11 @@ int MPIDI_Win_complete(MPID_Win *win_ptr)
start_grp_size = win_ptr->start_group_ptr->size;
MPIR_T_PVAR_TIMER_START(RMA, rma_wincomplete_recvsync);
- MPIU_CHKLMEM_MALLOC(ranks_in_start_grp, int *, start_grp_size*sizeof(int),
- mpi_errno, "ranks_in_start_grp");
-
+
MPIU_CHKLMEM_MALLOC(ranks_in_win_grp, int *, start_grp_size*sizeof(int),
mpi_errno, "ranks_in_win_grp");
- for (i=0; i<start_grp_size; i++)
- {
- ranks_in_start_grp[i] = i;
- }
-
- mpi_errno = MPIR_Comm_group_impl(comm_ptr, &win_grp_ptr);
- if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }
-
- mpi_errno = MPIR_Group_translate_ranks_impl(win_ptr->start_group_ptr, start_grp_size,
- ranks_in_start_grp,
- win_grp_ptr, ranks_in_win_grp);
+ mpi_errno = fill_ranks_in_win_grp(win_ptr, ranks_in_win_grp);
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
rank = win_ptr->comm_ptr->rank;
@@ -2409,7 +2419,7 @@ int MPIDI_Win_complete(MPID_Win *win_ptr)
if ((win_ptr->start_assert & MPI_MODE_NOCHECK) == 0)
{
/* wait for messages from non-local processes */
- mpi_errno = recv_post_msgs(win_ptr->start_group_ptr, win_ptr, 0);
+ mpi_errno = recv_post_msgs(win_ptr, ranks_in_win_grp, 0);
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
}
MPIR_T_PVAR_TIMER_END(RMA, rma_wincomplete_recvsync);
@@ -2563,9 +2573,6 @@ int MPIDI_Win_complete(MPID_Win *win_ptr)
MPIU_Assert(MPIDI_CH3I_RMA_Ops_isempty(ops_list));
- mpi_errno = MPIR_Group_free_impl(win_grp_ptr);
- if (mpi_errno) MPIU_ERR_POP(mpi_errno);
-
/* free the group stored in window */
MPIR_Group_release(win_ptr->start_group_ptr);
win_ptr->start_group_ptr = NULL;
-----------------------------------------------------------------------
Summary of changes:
src/mpid/ch3/src/ch3u_rma_sync.c | 93 ++++++++++++++++++++-----------------
1 files changed, 50 insertions(+), 43 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.1-80-g02813e2
by noreply@mpich.org 11 Jul '14
by noreply@mpich.org 11 Jul '14
11 Jul '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 02813e26c1746a11167be3454fb9912673af0711 (commit)
from 877fa1a6bec9b3377f73b7c905f3d57651c4048c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/02813e26c1746a11167be3454fb991267…
commit 02813e26c1746a11167be3454fb9912673af0711
Author: Pavan Balaji <balaji(a)anl.gov>
Date: Fri Jul 11 12:47:27 2014 -0500
Use global variable for MPI_PUT operations.
We were using a stack variable earlier, so when FLUSH from a different
thread tried to send that data out it couldn't access that address.
Signed-off-by: Xin Zhao <xinzhao3(a)illinois.edu>
diff --git a/test/mpi/threads/rma/multirma.c b/test/mpi/threads/rma/multirma.c
index eb9d5b5..4501dca 100644
--- a/test/mpi/threads/rma/multirma.c
+++ b/test/mpi/threads/rma/multirma.c
@@ -15,14 +15,16 @@
#define LOOPS 100000
MPI_Win win;
-int errs = 0;
+int errs = 0, dummy;
MTEST_THREAD_RETURN_TYPE run_test(void *arg)
{
int i;
for (i = 0; i < LOOPS; i++) {
- MPI_Put(&i, 1, MPI_INT, 0, 0, 1, MPI_INT, win);
+ /* send a global variable, rather than a stack variable, so
+ * other threads can access the address during flush */
+ MPI_Put(&dummy, 1, MPI_INT, 0, 0, 1, MPI_INT, win);
MPI_Win_flush(0, win);
}
-----------------------------------------------------------------------
Summary of changes:
test/mpi/threads/rma/multirma.c | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.1-79-g877fa1a
by noreply@mpich.org 11 Jul '14
by noreply@mpich.org 11 Jul '14
11 Jul '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 877fa1a6bec9b3377f73b7c905f3d57651c4048c (commit)
from f7aa87dfa660a204a2b63bedc7a07245f74cb43f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/877fa1a6bec9b3377f73b7c905f3d5765…
commit 877fa1a6bec9b3377f73b7c905f3d57651c4048c
Author: Su Huang <suhuang(a)us.ibm.com>
Date: Thu Jul 10 16:40:58 2014 -0400
pamid: Data integrity error hit in MPI_Win_allocate_shared windows(LE)
MPI_Win_shared_query() currently returns the base address of the passed in rank.
All tasks other than task 0 assume that the first set of data belongs to task 0,
second set belongs to task 1 and so on. The assumption caused the data integrity
problem found by win_shared.c.
To fix the problem, instead of returning the base address of a rank,
MPI_Win_shared_query() should return the base address of shared segment
allocated for the window.
(ibm) D198663
Signed-off-by: Michael Blocksome <blocksom(a)us.ibm.com>
diff --git a/src/mpid/pamid/src/onesided/mpid_win_shared_query.c b/src/mpid/pamid/src/onesided/mpid_win_shared_query.c
index aef5458..55ca3a0 100644
--- a/src/mpid/pamid/src/onesided/mpid_win_shared_query.c
+++ b/src/mpid/pamid/src/onesided/mpid_win_shared_query.c
@@ -47,17 +47,16 @@ MPID_Win_shared_query(MPID_Win *win, int rank, MPI_Aint *size,
if (rank == MPI_PROC_NULL) {
for (i=0; i<win->comm_ptr->local_size; ++i) {
if (win->mpid.info[i].base_size != 0) {
- *((void **) base_ptr) = win->mpid.info[i].base_addr;
*size = win->mpid.info[i].base_size;
*disp_unit = win->mpid.info[i].disp_unit;
break;
}
}
} else {
- *((void **) base_ptr) = win->mpid.info[rank].base_addr;
*size = win->mpid.info[rank].base_size;
*disp_unit = win->mpid.info[rank].disp_unit;
}
+ *((void **) base_ptr) = win->base; /* should return the begin. address of shared segment */
return mpi_errno;
}
-----------------------------------------------------------------------
Summary of changes:
.../pamid/src/onesided/mpid_win_shared_query.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.1-78-gf7aa87d
by noreply@mpich.org 10 Jul '14
by noreply@mpich.org 10 Jul '14
10 Jul '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via f7aa87dfa660a204a2b63bedc7a07245f74cb43f (commit)
from 40b864f53f1e87fc6740182e3573e0007065b67b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/f7aa87dfa660a204a2b63bedc7a07245f…
commit f7aa87dfa660a204a2b63bedc7a07245f74cb43f
Author: Junchao Zhang <jczhang(a)mcs.anl.gov>
Date: Tue Jul 8 11:05:30 2014 -0700
Added a makefile for f08 tests
So that f08 tests can be tested separately.
No review since F08 binding is experimental now.
diff --git a/test/mpi/configure.ac b/test/mpi/configure.ac
index 82f9249..0af3ba0 100644
--- a/test/mpi/configure.ac
+++ b/test/mpi/configure.ac
@@ -1546,7 +1546,8 @@ AC_OUTPUT(maint/testmerge \
f90/io/Makefile \
f90/misc/Makefile \
f90/profile/Makefile \
- f08/attr/Makefile \
+ f08/Makefile \
+ f08/attr/Makefile \
f08/datatype/Makefile \
f08/util/Makefile \
f08/coll/Makefile \
diff --git a/test/mpi/f08/Makefile.am b/test/mpi/f08/Makefile.am
new file mode 100644
index 0000000..64d0fc8
--- /dev/null
+++ b/test/mpi/f08/Makefile.am
@@ -0,0 +1,11 @@
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2014 by Argonne National Laboratory.
+# See COPYRIGHT in top-level directory.
+#
+
+include $(top_srcdir)/Makefile_f08.mtest
+
+SUBDIRS = attr coll comm datatype ext info init io misc profile pt2pt rma spawn subarray timer topo
+DIST_SUBDIRS = $(SUBDIRS)
-----------------------------------------------------------------------
Summary of changes:
test/mpi/configure.ac | 3 ++-
test/mpi/f08/{topo => }/Makefile.am | 7 ++-----
2 files changed, 4 insertions(+), 6 deletions(-)
copy test/mpi/f08/{topo => }/Makefile.am (59%)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.1-77-g40b864f
by noreply@mpich.org 09 Jul '14
by noreply@mpich.org 09 Jul '14
09 Jul '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 40b864f53f1e87fc6740182e3573e0007065b67b (commit)
from c34a0106a77b4908acdb8b3776e3adf29ad90fc9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/40b864f53f1e87fc6740182e3573e0007…
commit 40b864f53f1e87fc6740182e3573e0007065b67b
Author: Sangmin Seo <sseo(a)anl.gov>
Date: Wed Jul 9 10:05:02 2014 -0500
Add warning about memory tracing overhead.
When the debugging option about memory usage tracing is turned on,
additional memory overhead for tracing may be significant especially
when a large number of small memory allocations are requested, as
reported in #2068. However, since the tracing data is necessary to
keep track of memory usage, it cannot be removed. Here, we provide
a warning message when the memory overhead for tracing is over the
threshold value.
See #2068
Signed-off-by: Xin Zhao <xinzhao3(a)illinois.edu>
diff --git a/src/mpl/include/mpltrmem.h b/src/mpl/include/mpltrmem.h
index 4253bac..5f64f3e 100644
--- a/src/mpl/include/mpltrmem.h
+++ b/src/mpl/include/mpltrmem.h
@@ -24,6 +24,7 @@ void *MPL_trcalloc(size_t, size_t, int, const char[]);
void *MPL_trrealloc(void *, size_t, int, const char[]);
void *MPL_trstrdup(const char *, int, const char[]);
void MPL_TrSetMaxMem(size_t);
+void MPL_TrSetMaxAlloc(size_t);
/* Make sure that FILE is defined */
#include <stdio.h>
diff --git a/src/mpl/src/mpltrmem.c b/src/mpl/src/mpltrmem.c
index 5efdbbe..5616542 100644
--- a/src/mpl/src/mpltrmem.c
+++ b/src/mpl/src/mpltrmem.c
@@ -127,6 +127,8 @@ static int TRSetBytes = 0;
/* Used to keep track of allocations */
static volatile size_t TRMaxMem = 0;
static volatile int TRMaxMemId = 0;
+static volatile size_t TRNumAlloc = 0;
+static volatile size_t TRMaxAlloc = (size_t)2E6;
/* Used to limit allocation */
static volatile size_t TRMaxMemAllow = 0;
@@ -286,6 +288,16 @@ void *MPL_trmalloc(size_t a, int lineno, const char fname[])
world_rank, (long)a, (long)nsize, new, fname, lineno);
}
+ /* Warn the user about tracing overhead if the total number of memory
+ * allocation is larger than the threshold, TRMaxAlloc. */
+ TRNumAlloc++;
+ if (TRNumAlloc >= TRMaxAlloc) {
+ MPL_error_printf("[%d] %.1lf MB was used for memory usage tracing!\n",
+ world_rank,
+ (double)(sizeof(TrSPACE) * TRNumAlloc) / 1024 / 1024);
+ MPL_TrSetMaxAlloc((size_t)(TRMaxAlloc + 1E6));
+ }
+
/* Without these macros valgrind actually catches far fewer errors when
* using --enable-g=mem. Note that it would be nice to use
* MPL_VG_MALLOCLIKE_BLOCK and friends, but they don't work when the
@@ -427,6 +439,8 @@ void MPL_trfree(void *a_ptr, int line, const char file[])
file, line);
}
+ TRNumAlloc--;
+
/*
* Now, scrub the data (except possibly the first few ints) to
* help catch access to already freed data
@@ -1026,6 +1040,11 @@ void MPL_TrSetMaxMem(size_t size)
TRMaxMemAllow = size;
}
+void MPL_TrSetMaxAlloc(size_t size)
+{
+ TRMaxAlloc = size;
+}
+
static void addrToHex(void *addr, char string[MAX_ADDRESS_CHARS])
{
int i;
-----------------------------------------------------------------------
Summary of changes:
src/mpl/include/mpltrmem.h | 1 +
src/mpl/src/mpltrmem.c | 19 +++++++++++++++++++
2 files changed, 20 insertions(+), 0 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0
[mpich] MPICH primary repository branch, master, updated. v3.1.1-76-gc34a010
by noreply@mpich.org 09 Jul '14
by noreply@mpich.org 09 Jul '14
09 Jul '14
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via c34a0106a77b4908acdb8b3776e3adf29ad90fc9 (commit)
from d42c43f3f9f5f233ceef34a685b40e765aa4d79d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/c34a0106a77b4908acdb8b3776e3adf29…
commit c34a0106a77b4908acdb8b3776e3adf29ad90fc9
Author: Ken Raffenetti <raffenet(a)mcs.anl.gov>
Date: Tue Jul 1 11:11:57 2014 -0500
Solaris build fix for non-strict compile
A previous commit [33d82829] increased the feature level in files
using pread/pwrite functions to strictly adhere to the C99 standard.
The fix inadvertantly caused failed builds when C99 was not enabled
on Solaris. Now we conditionally raise the feature level depending
on the strictness of the build.
Signed-off-by: Rob Latham <robl(a)mcs.anl.gov>
diff --git a/src/mpi/romio/adio/ad_lustre/ad_lustre_rwcontig.c b/src/mpi/romio/adio/ad_lustre/ad_lustre_rwcontig.c
index dbe2255..5f1c232 100644
--- a/src/mpi/romio/adio/ad_lustre/ad_lustre_rwcontig.c
+++ b/src/mpi/romio/adio/ad_lustre/ad_lustre_rwcontig.c
@@ -8,7 +8,11 @@
* Copyright (C) 2008 Sun Microsystems, Lustre group
*/
+#ifdef _STDC_C99
#define _XOPEN_SOURCE 600
+#else
+#define _XOPEN_SOURCE 500
+#endif
#include <unistd.h>
#include <stdlib.h>
diff --git a/src/mpi/romio/adio/ad_xfs/ad_xfs.h b/src/mpi/romio/adio/ad_xfs/ad_xfs.h
index cbddbbb..1a4d4cc 100644
--- a/src/mpi/romio/adio/ad_xfs/ad_xfs.h
+++ b/src/mpi/romio/adio/ad_xfs/ad_xfs.h
@@ -8,7 +8,11 @@
#ifndef AD_XFS_INCLUDE
#define AD_XFS_INCLUDE
+#ifdef _STDC_C99
#define _XOPEN_SOURCE 600
+#else
+#define _XOPEN_SOURCE 500
+#endif
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
diff --git a/src/mpi/romio/adio/common/ad_read.c b/src/mpi/romio/adio/common/ad_read.c
index dc0d773..b03f69b 100644
--- a/src/mpi/romio/adio/common/ad_read.c
+++ b/src/mpi/romio/adio/common/ad_read.c
@@ -6,7 +6,11 @@
*/
+#ifdef _STDC_C99
#define _XOPEN_SOURCE 600
+#else
+#define _XOPEN_SOURCE 500
+#endif
#include <unistd.h>
#include "adio.h"
diff --git a/src/mpi/romio/adio/common/ad_write.c b/src/mpi/romio/adio/common/ad_write.c
index 4a6c445..129cb1c 100644
--- a/src/mpi/romio/adio/common/ad_write.c
+++ b/src/mpi/romio/adio/common/ad_write.c
@@ -6,7 +6,11 @@
*/
+#ifdef _STDC_C99
#define _XOPEN_SOURCE 600
+#else
+#define _XOPEN_SOURCE 500
+#endif
#include <unistd.h>
#include "adio.h"
-----------------------------------------------------------------------
Summary of changes:
src/mpi/romio/adio/ad_lustre/ad_lustre_rwcontig.c | 4 ++++
src/mpi/romio/adio/ad_xfs/ad_xfs.h | 4 ++++
src/mpi/romio/adio/common/ad_read.c | 4 ++++
src/mpi/romio/adio/common/ad_write.c | 4 ++++
4 files changed, 16 insertions(+), 0 deletions(-)
hooks/post-receive
--
MPICH primary repository
1
0