diff options
Diffstat (limited to 'src/H5FP.c')
-rw-r--r-- | src/H5FP.c | 513 |
1 files changed, 0 insertions, 513 deletions
diff --git a/src/H5FP.c b/src/H5FP.c deleted file mode 100644 index 6d85b88..0000000 --- a/src/H5FP.c +++ /dev/null @@ -1,513 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -/* Private header files */ -#include "H5private.h" /* Generic Functions */ -#include "H5Eprivate.h" /* Error Handling */ -#include "H5MMprivate.h" /* Memory management */ -#include "H5Oprivate.h" /* Object Headers */ - -#ifdef H5_HAVE_FPHDF5 - -#include "H5FPprivate.h" /* Flexible Parallel Functions */ - -MPI_Datatype H5FP_request; /* MPI datatype for the H5FP_request_t type */ -MPI_Datatype H5FP_reply; /* MPI datatype for the H5FP_reply_t type */ -MPI_Datatype H5FP_read; /* MPI datatype for the H5FP_read_t type */ -MPI_Datatype H5FP_alloc; /* MPI datatype for the H5FP_alloc_t type */ -MPI_Datatype H5FP_eoa; /* MPI datatype for the H5FP_eoa_t type */ -MPI_Datatype H5FP_super; /* MPI datatype for the H5FP_super_t type */ - -/* SAP specific variables */ -MPI_Comm H5FP_SAP_COMM; /* Comm we use: Supplied by user */ -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); -static herr_t H5FP_request_sap_stop(void); - -/* - *===----------------------------------------------------------------------=== - * Public (API) Functions - *===----------------------------------------------------------------------=== - */ - -/* - * Function: H5FPinit - * Purpose: Initialize the SAP environment: duplicate the COMM the user - * supplies to us, set aside the SAP_RANK as the SAP. - * Return: Success: SUCCEED - * Failure: FAIL - * Programmer: Bill Wendling, 26. July, 2002 - * Modifications: - */ -herr_t -H5FPinit(MPI_Comm comm, int sap_rank, MPI_Comm *sap_comm, MPI_Comm *sap_barrier_comm) -{ - MPI_Group sap_group = MPI_GROUP_NULL, sap_barrier_group = MPI_GROUP_NULL; - int mrc, comm_size, my_rank; - herr_t ret_value = SUCCEED; - - FUNC_ENTER_API(H5FPinit, FAIL); - H5TRACE4("e","McIs*Mc*Mc",comm,sap_rank,sap_comm,sap_barrier_comm); - - /* initialize to NULL so that we can release if an error occurs */ - H5FP_request = MPI_DATATYPE_NULL; - H5FP_reply = MPI_DATATYPE_NULL; - H5FP_read = MPI_DATATYPE_NULL; - H5FP_alloc = MPI_DATATYPE_NULL; - H5FP_eoa = MPI_DATATYPE_NULL; - H5FP_super = MPI_DATATYPE_NULL; - - *sap_comm = H5FP_SAP_COMM = MPI_COMM_NULL; - *sap_barrier_comm = H5FP_SAP_BARRIER_COMM = MPI_COMM_NULL; - - /* Set the global variable to track the SAP's rank */ - H5FP_sap_rank = sap_rank; - - /* Make a private copy of the communicator passed to us */ - if (MPI_Comm_dup(comm, &H5FP_SAP_COMM) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_dup failed"); - - *sap_comm = H5FP_SAP_COMM; - - if (MPI_Comm_group(H5FP_SAP_COMM, &sap_group) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_group failed"); - - /* Exclude the SAP from the barrier group group */ - if (MPI_Group_excl(sap_group, 1, (int *)&H5FP_sap_rank, - &sap_barrier_group) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Group_excl failed"); - - /* Create communicator for barrier group (all processes except the SAP) */ - if (MPI_Comm_create(H5FP_SAP_COMM, sap_barrier_group, - &H5FP_SAP_BARRIER_COMM) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_create failed"); - - *sap_barrier_comm = H5FP_SAP_BARRIER_COMM; - - /* Get the size of all the processes (including the SAP) */ - if (MPI_Comm_size(H5FP_SAP_COMM, &comm_size) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_size failed"); - - /* - * We assign the process right after the sap_rank as the one which - * will tell the SAP that files have been opened or closed. We mod - * it so that we don't go over the size of the communicator. - */ - H5FP_capt_rank = (H5FP_sap_rank + 1) % comm_size; - - /* Get this processes rank */ - if ((mrc = MPI_Comm_rank(H5FP_SAP_COMM, (int *)&my_rank)) != MPI_SUCCESS) - HMPI_GOTO_ERROR(FAIL, "MPI_Comm_rank failed", mrc); - - H5FP_capt_barrier_rank = 0; - - /* 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"); - - /* Go loop, if we are the SAP */ - if ((unsigned)my_rank == H5FP_sap_rank) - H5FP_sap_receive_loop(); - - /* Fall through and return to user, if not SAP */ - -done: - if (ret_value == FAIL) { - /* we've encountered an error...clean up */ - if (H5FP_request != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_request) != MPI_SUCCESS) - HDONE_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_reply != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_reply) != MPI_SUCCESS) - HDONE_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_read != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_read) != MPI_SUCCESS) - HDONE_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_alloc != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_alloc) != MPI_SUCCESS) - HDONE_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_eoa != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_eoa) != MPI_SUCCESS) - HDONE_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_super != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_super) != MPI_SUCCESS) - HDONE_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_SAP_BARRIER_COMM != MPI_COMM_NULL) - /* this comm will be NULL for the SAP */ - if (MPI_Comm_free(&H5FP_SAP_BARRIER_COMM) != MPI_SUCCESS) - HDONE_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_free failed"); - - if (H5FP_SAP_COMM != MPI_COMM_NULL) - if (MPI_Comm_free(&H5FP_SAP_COMM) != MPI_SUCCESS) - HDONE_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_free failed"); - } - - if (sap_group != MPI_GROUP_NULL) - MPI_Group_free(&sap_group); - - if (sap_barrier_group != MPI_GROUP_NULL) - MPI_Group_free(&sap_barrier_group); - - FUNC_LEAVE_API(ret_value); -} - -/* - * Function: H5FPfinalize - * Purpose: Get rid of the initilized environment we setup with H5FPinit. - * Mostly just freeing the duplicated COMM object and committed - * datatypes. - * Return: Success: SUCCEED - * Failure: FAIL - * Programmer: Bill Wendling, 26. July, 2002 - * Modifications: - */ -herr_t -H5FPfinalize(void) -{ - int mrc, my_rank; - herr_t ret_value = SUCCEED; - - FUNC_ENTER_API(H5FPfinalize, FAIL); - H5TRACE0("e",""); - - /* Get this processes rank */ - if ((mrc = MPI_Comm_rank(H5FP_SAP_COMM, (int *)&my_rank)) != MPI_SUCCESS) - HMPI_GOTO_ERROR(FAIL, "MPI_Comm_rank failed", mrc); - - /* Stop the SAP */ - if ((unsigned)my_rank != H5FP_sap_rank) - if (H5FP_request_sap_stop() < 0) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Error stopping the SAP"); - - /* Release the MPI types we created */ - if (H5FP_request != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_request) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_reply != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_reply) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_read != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_read) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_alloc != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_alloc) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_eoa != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_eoa) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - if (H5FP_super != MPI_DATATYPE_NULL) - if (MPI_Type_free(&H5FP_super) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed"); - - /* Release the barrier communicator */ - if (H5FP_SAP_BARRIER_COMM != MPI_COMM_NULL) - /* this comm will be NULL for the SAP */ - if (MPI_Comm_free(&H5FP_SAP_BARRIER_COMM) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_free failed"); - - /* Release the FPH5 communicator */ - if (MPI_Comm_free(&H5FP_SAP_COMM) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_free failed"); - -done: - FUNC_LEAVE_API(ret_value); -} - -/* - *===----------------------------------------------------------------------=== - * Public Library (non-API) Functions - *===----------------------------------------------------------------------=== - */ - -/* - * Function: H5FP_send_metadata - * Purpose: Send a string of metadata to a process. - * Return: Success: SUCCEED - * Failure: FAIL - * Programmer: Bill Wendling, 30. July, 2002 - * Modifications: - */ -herr_t -H5FP_send_metadata(const char *mdata, int len, int to) -{ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5FP_send_metadata, FAIL); - - assert(mdata); - assert(len); - - /* casts the CONST away: Okay */ - if (MPI_Send((void *)mdata, len, MPI_BYTE, to, H5FP_TAG_METADATA, H5FP_SAP_COMM) - != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Send failed"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - -/* - * Function: H5FP_read_metadata - * Purpose: Read a string of metadata from process FROM. - * Return: Success: SUCCEED - * Failure: FAIL - * Programmer: Bill Wendling, 31. January, 2003 - * Modifications: - */ -herr_t -H5FP_read_metadata(char **mdata, int len, int from) -{ - MPI_Status status; - herr_t ret_value = SUCCEED; - int mrc; - - FUNC_ENTER_NOAPI(H5FP_read_metadata, FAIL); - - /* check args */ - assert(mdata); - - /* - * There is metadata associated with this request. Get it as a - * string (requires another read). - */ - if ((*mdata = (char *)H5MM_malloc((size_t)len + 1)) == NULL) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "out of memory"); - - HDmemset(*mdata, 0, (size_t)len + 1); - - if ((mrc = MPI_Recv(*mdata, len + 1, MPI_BYTE, from, H5FP_TAG_METADATA, - H5FP_SAP_COMM, &status)) != MPI_SUCCESS) { - HDfree(*mdata); - *mdata = NULL; - HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mrc); - } - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - -/* - *===----------------------------------------------------------------------=== - * Private Functions - *===----------------------------------------------------------------------=== - */ - -/* - * Function: H5FP_commit_sap_datatypes - * Purpose: Commit the H5FP_request, H5FP_reply, H5FP_read, - * H5FP_alloc, H5FP_eoa and H5FP_super structure datatypes - * to MPI. - * Return: Success: SUCCEED - * Failure: FAIL - * Programmer: Bill Wendling, 26. July, 2002 - * Modifications: - */ -static herr_t -H5FP_commit_sap_datatypes(void) -{ - int block_length[5]; - int i; - MPI_Aint displs[5]; - MPI_Datatype old_types[5]; - H5FP_request_t sap_req; - H5FP_reply_t sap_reply; - H5FP_read_t sap_read; - H5FP_alloc_t sap_alloc; - H5FP_eoa_t sap_eoa; - H5FP_super_t sap_super; - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5FP_commit_sap_datatypes, FAIL); - - /* Commit the H5FP_request datatype */ - block_length[0] = 8; - block_length[1] = 1; - block_length[2] = 4; - block_length[3] = 2; - old_types[0] = MPI_UNSIGNED; - old_types[1] = MPI_UNSIGNED_LONG; - old_types[2] = MPI_LONG_LONG_INT; - old_types[3] = HADDR_AS_MPI_TYPE; - MPI_Address(&sap_req.req_id, &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]); - - /* Calculate the displacements */ - for (i = 4; i >= 0; --i) - displs[i] -= displs[0]; - - if (MPI_Type_struct(4, block_length, displs, old_types, &H5FP_request) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_struct failed"); - - if (MPI_Type_commit(&H5FP_request) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_commit failed"); - - /* Commit the H5FP_reply datatype */ - block_length[0] = 4; - old_types[0] = MPI_UNSIGNED; - MPI_Address(&sap_reply.req_id, &displs[0]); - - /* Calculate the displacements */ - for (i = 0; i >= 0; --i) - displs[i] -= displs[0]; - - if (MPI_Type_struct(1, block_length, displs, old_types, &H5FP_reply) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_struct failed"); - - if (MPI_Type_commit(&H5FP_reply) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_commit failed"); - - /* Commit the H5FP_read datatype */ - block_length[0] = 5; - 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]); - - /* 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) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_struct failed"); - - if (MPI_Type_commit(&H5FP_read) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_commit failed"); - - /* Commit the H5FP_alloc datatype */ - block_length[0] = 4; - block_length[1] = 2; - old_types[0] = MPI_UNSIGNED; - old_types[1] = HADDR_AS_MPI_TYPE; - 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) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_struct failed"); - - if (MPI_Type_commit(&H5FP_alloc) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_commit failed"); - - /* Commit the H5FP_eoa datatype */ - block_length[0] = 3; - block_length[1] = 1; - old_types[0] = MPI_UNSIGNED; - old_types[1] = HADDR_AS_MPI_TYPE; - MPI_Address(&sap_eoa.req_id, &displs[0]); - MPI_Address(&sap_eoa.eoa, &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_eoa) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_struct failed"); - - if (MPI_Type_commit(&H5FP_eoa) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_commit failed"); - - /* Commit the H5FP_super datatype */ - block_length[0] = 1; - block_length[1] = 1; - old_types[0] = HADDR_AS_MPI_TYPE; - old_types[1] = MPI_LONG_LONG_INT; - MPI_Address(&sap_super.addr, &displs[0]); - MPI_Address(&sap_super.size, &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_super) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_struct failed"); - - if (MPI_Type_commit(&H5FP_super) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_commit failed"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - -/* - * Function: H5FP_request_sap_stop - * Purpose: Request that the SAP stop it's loop processing. Each - * process should send this to the SAP. - * Return: Success: SUCCEED - * Failure: FAIL - * Programmer: Bill Wendling, 02. August, 2002 - * Modifications: - */ -static herr_t -H5FP_request_sap_stop(void) -{ - H5FP_request_t req; - int mrc, my_rank; - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5FP_request_sap_stop, FAIL); - - /* Get this processes rank */ - if ((mrc = MPI_Comm_rank(H5FP_SAP_COMM, (int *)&my_rank)) != MPI_SUCCESS) - HMPI_GOTO_ERROR(FAIL, "MPI_Comm_rank failed", mrc); - - HDmemset(&req, 0, sizeof(req)); - req.req_type = H5FP_REQ_STOP; - req.req_id = 0; - req.proc_rank = my_rank; - - if (MPI_Send(&req, 1, H5FP_request, (int)H5FP_sap_rank, - H5FP_TAG_REQUEST, H5FP_SAP_COMM) != MPI_SUCCESS) - HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Send failed"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - -#endif /* H5_HAVE_FPHDF5 */ |