Skip to content

Commit

Permalink
Update MPI broadcasting code.
Browse files Browse the repository at this point in the history
  • Loading branch information
lars2015 committed Jul 19, 2024
1 parent 5535a05 commit ea41013
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 25 deletions.
29 changes: 14 additions & 15 deletions src/mptrac.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,30 +42,29 @@ static curandGenerator_t rng_curand;
/*****************************************************************************/

#ifdef MPI
void broadcast_large_data(void* data, size_t N, int root, MPI_Comm comm) {

void broadcast_large_data(
void *data,
size_t N) {

#define CHUNK_SIZE 2147483647

/* Get rank... */
int rank;
MPI_Comm_rank(comm, &rank);


/* Broadcast the size of the data first... */
MPI_Bcast(&N, 1, MPI_UINT64_T, root, comm);
MPI_Bcast(&N, 1, MPI_UINT64_T, 0, MPI_COMM_WORLD);

/* Calculate the number of chunks... */
size_t num_chunks = (N + CHUNK_SIZE - 1) / CHUNK_SIZE;

/* Loop over chunks... */
for (size_t i = 0; i < num_chunks; i++) {

/* Determine the start and end indices for the current chunk... */
size_t start = i * CHUNK_SIZE;
size_t end = (start + CHUNK_SIZE > N) ? N : start + CHUNK_SIZE;
size_t chunk_size = end - start;

/* Broadcast the current chunk... */
MPI_Bcast((char*)data + start, (int)chunk_size, MPI_BYTE, root, comm);
MPI_Bcast((char *) data + start, (int) chunk_size, MPI_BYTE, 0,
MPI_COMM_WORLD);
}
}
#endif
Expand Down Expand Up @@ -5803,10 +5802,10 @@ int read_met(
LOG(2, "Broadcast data on rank %d...", rank);

/* Broadcast... */
broadcast_large_data(met, sizeof(met_t), 0, MPI_COMM_WORLD);
broadcast_large_data(met, sizeof(met_t));
}
#endif

/* Return success... */
return 1;
}
Expand Down
28 changes: 18 additions & 10 deletions src/mptrac.h
Original file line number Diff line number Diff line change
Expand Up @@ -3421,22 +3421,30 @@ typedef struct {
Functions...
------------------------------------------------------------ */

#ifdef MPI
/**
* @brief Broadcasts large data in chunks from the root process to all other processes in the given communicator.
* @brief Broadcasts large data across all processes in an MPI communicator.
*
* This function divides the data into manageable chunks and broadcasts each
* chunk sequentially. This approach is necessary because the data size may
* exceed the maximum allowable message size for a single MPI_Bcast operation.
*
* This function splits the data into manageable chunks (up to 2 GB - 1 byte each) and broadcasts each chunk sequentially.
* This approach avoids issues with broadcasting very large data sizes that exceed the limits of a single MPI_Bcast call.
* @param data Pointer to the data to be broadcasted.
* @param N Size of the data in bytes.
*
* @param data Pointer to the data to be broadcast. This pointer should point to a contiguous block of memory.
* @param N The size of the data in bytes.
* @param root The rank of the root process that holds the initial data.
* @param comm The MPI communicator.
* The function first broadcasts the total size of the data to all processes.
* Then, it calculates the number of chunks needed to broadcast the entire data.
* Each chunk is broadcasted in sequence until the entire data has been sent.
*
* The maximum chunk size is defined as CHUNK_SIZE (2147483647 bytes).
*
* @note The function assumes that the MPI environment has been initialized
* before calling this function and will be finalized afterward.
*
* @author Lars Hoffmann
*/
void broadcast_large_data(void* data, size_t N, int root, MPI_Comm comm);
#endif
void broadcast_large_data(
void *data,
size_t N);

/**
* @brief Converts Cartesian coordinates to geographic coordinates.
Expand Down

0 comments on commit ea41013

Please sign in to comment.