summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5FP.c65
1 files changed, 41 insertions, 24 deletions
diff --git a/src/H5FP.c b/src/H5FP.c
index 16eff94..0921a2c 100644
--- a/src/H5FP.c
+++ b/src/H5FP.c
@@ -40,6 +40,7 @@ MPI_Comm H5FP_SAP_BARRIER_COMM; /* Comm if you want to do a barrier */
unsigned H5FP_sap_rank; /* The rank of the SAP: Supplied by user*/
unsigned H5FP_capt_rank; /* The rank which tells SAP of opens */
+unsigned H5FP_capt_barrier_rank;/* Rank of captain in barrier comm */
/* local functions */
static herr_t H5FP_commit_sap_datatypes(void);
@@ -118,6 +119,18 @@ H5FPinit(MPI_Comm comm, int sap_rank, MPI_Comm *sap_comm, MPI_Comm *sap_barrier_
if ((mrc = MPI_Comm_rank(H5FP_SAP_COMM, (int *)&my_rank)) != MPI_SUCCESS)
HMPI_GOTO_ERROR(FAIL, "MPI_Comm_rank failed", mrc);
+ /* Get the rank of the captain in the barrier Comm */
+ if (H5FP_capt_rank == (unsigned)my_rank)
+ if ((mrc = MPI_Comm_rank(H5FP_SAP_BARRIER_COMM,
+ (int *)&H5FP_capt_barrier_rank)) != MPI_SUCCESS)
+ HMPI_GOTO_ERROR(FAIL, "MPI_Comm_rank failed", mrc);
+
+ /* Broadcast the captain's barrier rank */
+ if ((mrc = MPI_Bcast(&H5FP_capt_barrier_rank, 1, MPI_UNSIGNED,
+ (int)H5FP_capt_rank,
+ H5FP_SAP_COMM)) != MPI_SUCCESS)
+ HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mrc);
+
/* Create the MPI types used for communicating with the SAP */
if (H5FP_commit_sap_datatypes() != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "H5FP_commit_sap_datatypes failed");
@@ -312,11 +325,12 @@ done:
static herr_t
H5FP_commit_sap_datatypes(void)
{
- int block_length[5];
+ int block_length[5], i;
MPI_Aint displs[5];
MPI_Datatype old_types[5];
- H5FP_request req;
+ H5FP_request sap_req;
H5FP_read sap_read;
+ H5FP_alloc sap_alloc;
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5FP_commit_sap_datatypes, FAIL);
@@ -324,24 +338,23 @@ H5FP_commit_sap_datatypes(void)
/* Commit the H5FP_request_t datatype */
block_length[0] = 8;
block_length[1] = 1;
- block_length[2] = 1;
- block_length[3] = 4;
- block_length[4] = sizeof(req.oid);
+ block_length[2] = 4;
+ block_length[3] = 1;
+ block_length[4] = sizeof(sap_req.oid);
old_types[0] = MPI_UNSIGNED;
- old_types[1] = HADDR_AS_MPI_TYPE;
- old_types[2] = MPI_UNSIGNED_LONG;
- old_types[3] = MPI_LONG_LONG_INT;
+ old_types[1] = MPI_UNSIGNED_LONG;
+ old_types[2] = MPI_LONG_LONG_INT;
+ old_types[3] = HADDR_AS_MPI_TYPE;
old_types[4] = MPI_UNSIGNED_CHAR;
- MPI_Address(&req.req_type, &displs[0]);
- MPI_Address(&req.addr, &displs[1]);
- MPI_Address(&req.feature_flags, &displs[2]);
- MPI_Address(&req.meta_block_size, &displs[3]);
- MPI_Address(&req.oid, &displs[4]);
- displs[4] -= displs[3];
- displs[3] -= displs[2];
- displs[2] -= displs[1];
- displs[1] -= displs[0];
- displs[0] -= displs[0];
+ MPI_Address(&sap_req.req_type, &displs[0]);
+ MPI_Address(&sap_req.feature_flags, &displs[1]);
+ MPI_Address(&sap_req.meta_block_size, &displs[2]);
+ MPI_Address(&sap_req.addr, &displs[3]);
+ MPI_Address(&sap_req.oid, &displs[4]);
+
+ /* Calculate the displacements */
+ for (i = 4; i >= 0; --i)
+ displs[i] -= displs[0];
if (MPI_Type_struct(5, block_length, displs, old_types,
&H5FP_request_t) != MPI_SUCCESS)
@@ -369,8 +382,10 @@ H5FP_commit_sap_datatypes(void)
old_types[1] = HADDR_AS_MPI_TYPE;
MPI_Address(&sap_read.req_id, &displs[0]);
MPI_Address(&sap_read.addr, &displs[1]);
- displs[1] -= displs[0];
- displs[0] -= displs[0];
+
+ /* Calculate the displacements */
+ for (i = 1; i >= 0; --i)
+ displs[i] -= displs[0];
if (MPI_Type_struct(2, block_length, displs, old_types,
&H5FP_read_t) != MPI_SUCCESS)
@@ -384,10 +399,12 @@ H5FP_commit_sap_datatypes(void)
block_length[1] = 1;
old_types[0] = MPI_UNSIGNED;
old_types[1] = HADDR_AS_MPI_TYPE;
- MPI_Address(&sap_read.req_id, &displs[0]);
- MPI_Address(&sap_read.addr, &displs[1]);
- displs[1] -= displs[0];
- displs[0] -= displs[0];
+ MPI_Address(&sap_alloc.req_id, &displs[0]);
+ MPI_Address(&sap_alloc.addr, &displs[1]);
+
+ /* Calculate the displacements */
+ for (i = 1; i >= 0; --i)
+ displs[i] -= displs[0];
if (MPI_Type_struct(2, block_length, displs, old_types,
&H5FP_alloc_t) != MPI_SUCCESS)