24 #ifndef __USE_FILE_OFFSET64 25 #define __USE_FILE_OFFSET64 31 #include <sys/types.h> 49 int _sion_errorprint_mpi(
int rc,
int level,
const char *format, ...)
57 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
62 if (t) rankselect = atoi(t);
65 case _SION_ERROR_RETURN:
66 if((rankselect<0) || (rankselect==rank)) {
67 fprintf(stderr,
"SION_ERROR_RETURN on rank %d, rc=%d: ",rank,rc);
69 vfprintf(stderr, format, ap);
75 case _SION_ERROR_ABORT:
76 if((rankselect<0) || (rankselect==rank)) {
77 fprintf(stderr,
"SION_ERROR_ABORT on rank %d, rc=%d: ",rank,rc);
79 vfprintf(stderr, format, ap);
86 if((rankselect<0) || (rankselect==rank)) {
88 fprintf(stderr,
"SION_ERROR_UNKNOWN on rank %d, rc=%d: ",rank,rc);
90 vfprintf(stderr, format, ap);
115 int rc = SION_SUCCESS;
119 MPI_Comm_size(gComm, >asks);
120 MPI_Comm_rank(gComm, &gRank);
122 if (gtasks < numFiles) {
123 return(_sion_errorprint_mpi(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
124 "_sion_gen_info_from_gcomm_mpi: Number of files(%d) cannot be bigger the the number of tasks(%d), aborting...\n",
128 task_per_file = gtasks / numFiles;
131 if (gRank >= (numFiles * task_per_file)) {
132 *filenumber = numFiles - 1;
135 *filenumber = gRank / task_per_file;
138 if(*filenumber == numFiles - 1) {
139 *lrank=gRank-(numFiles - 1)*task_per_file;
140 *lsize=gtasks-(numFiles - 1)*task_per_file;
142 *lrank=gRank%task_per_file;
143 *lsize=task_per_file;
146 DPRINTFP((1,
"_sion_get_info_from_splitted_comm_mpi", gRank,
"Global communicator divided in %d local communicators (%f: %d of %d)\n",
147 numFiles,*filenumber,*lrank,*lsize));
152 int _sion_get_info_from_splitted_comm_mpi(MPI_Comm gComm, MPI_Comm lComm,
int *numComm,
int *CommNumber,
int *lrank,
int *lsize) {
153 int gSize, gRank, lSize, lRank;
154 int *allRanks=NULL, *allSizes=NULL, i, ntasks;
156 int rc = SION_SUCCESS;
159 MPI_Comm_size(gComm, &gSize);
160 MPI_Comm_rank(gComm, &gRank);
162 if (lComm != MPI_COMM_NULL) {
163 MPI_Comm_size(lComm, &lSize);
164 MPI_Comm_rank(lComm, &lRank);
171 DPRINTFP((32,
"_sion_get_info_from_splitted_comm_mpi", gRank,
"lRank: %d\n", lRank));
175 allRanks = (
int *) malloc(gSize *
sizeof(
int));
176 allSizes = (
int *) malloc(gSize *
sizeof(
int));
177 if ((allRanks == NULL) || (allSizes == NULL)) {
178 return(_sion_errorprint_mpi(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_get_info_from_splitted_comm_mpi: Cannot allocate temp arrays of size %lu\n", (
unsigned long) gSize *
sizeof(int)));
183 MPI_Gather(&lRank, 1, MPI_INT, allRanks, 1, MPI_INT, 0, gComm);
184 MPI_Gather(&lSize, 1, MPI_INT, allSizes, 1, MPI_INT, 0, gComm);
189 for (i = 0; i < gSize; i++) {
190 if (allRanks[i] == 0) {
193 MPI_Send(&ncomms, 1, MPI_INT, i, i, gComm);
194 DPRINTFP((32,
"sion_paropen_comms_mpi", gRank,
"Sent ncomms=%05d to %d with TAG %d\n", ncomms, i, i));
201 ntasks += allSizes[i];
206 if ((lRank == 0) && (gRank != 0)) {
207 MPI_Recv(&color, 1, MPI_INT, 0, gRank, gComm, &status);
208 DPRINTFP((32,
"sion_paropen_comms_mpi", gRank,
"Received ncomms=%05d from %d with TAG %d\n", color, status.MPI_SOURCE, status.MPI_TAG));
212 MPI_Bcast(&ncomms, 1, MPI_INT, 0, gComm);
213 MPI_Bcast(&ntasks, 1, MPI_INT, 0, gComm);
216 DPRINTFP((32,
"_sion_get_info_from_splitted_comm_mpi", gRank,
"#Comms=%05d #Tasks=%05d #TotalTasks=%05d\n", ncomms, ntasks, gSize));
218 if (lComm != MPI_COMM_NULL) {
219 MPI_Bcast(&color, 1, MPI_INT, 0, lComm);
223 if(allRanks) free(allRanks);
224 if(allSizes) free(allSizes);
235 int _sion_get_numfiles_from_file_mpi(
char *fname) {
239 int numfiles = SION_SIZE_NOT_VALID;
240 sion_int64 chunksize;
241 sion_int32 fsblksize;
244 sid = _sion_open_rank(fname,
"br", &chunksize, &fsblksize, &rank, &fileptr);
246 numfiles = sion_get_number_of_files(sid);
248 _sion_close_sid(sid);
250 DPRINTFP((1,
"_sion_get_numfiles_from_file_mpi", _SION_DEFAULT_RANK,
"sion file %s has %d files\n", fname, numfiles));
255 int _sion_get_filenumber_from_files_mpi(
char *fname, MPI_Comm gComm,
int *numfiles,
int *filenumber,
int *lRank) {
257 int sid, gSize, gRank, ntasks, nfiles;
258 int rc = SION_SUCCESS;
260 sion_int64 *chunksizes;
261 sion_int32 fsblksize;
267 MPI_Comm_size(gComm, &gSize);
268 MPI_Comm_rank(gComm, &gRank);
270 DPRINTFP((1,
"_sion_get_filenumber_from_files_mpi", gRank,
"before open\n"));
273 chunksizes=NULL;globalranks=NULL;
274 sid=
_sion_open_read(fname,_SION_FMODE_READ|_SION_FMODE_ANSI,_SION_READ_MASTER_ONLY_OF_MULTI_FILES,
275 &ntasks,&nfiles,&chunksizes,&fsblksize,&globalranks,&fileptr);
278 DPRINTFP((1,
"_sion_get_filenumber_from_files_mpi", gRank,
"after open\n"));
280 DPRINTFP((1,
"_sion_get_filenumber_from_files_mpi", gRank,
"sion file %d files rc=%d\n", *numfiles, rc));
287 MPI_Bcast(numfiles, 1, MPI_INT, 0, gComm);
289 if((gRank == 0) && (*numfiles>1)) {
290 if(mapping_size!=gSize) {
291 return(_sion_errorprint_mpi(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_get_filenumber_from_files_mpi: Incorrect sum of ntasks of files %d <> %d\n", mapping_size, gSize));
296 return(_sion_errorprint_mpi(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_get_filenumber_from_files_mpi: could not get numfiles from sion file\n"));
300 DPRINTFP((1,
"_sion_get_filenumber_from_files_mpi", gRank,
"before scatter\n"));
301 MPI_Scatter(mapping, 2, SION_MPI_INT32, lpos, 2, SION_MPI_INT32, 0, gComm);
304 DPRINTFP((1,
"_sion_get_filenumber_from_files_mpi", gRank,
"after scatter\n"));
308 DPRINTFP((1,
"_sion_get_filenumber_from_files_mpi", gRank,
"only one file -> filenumber=%d lRank=%d\n",*filenumber,*lRank));
313 if (sid>=0) _sion_close_sid(sid);
316 DPRINTFP((1,
"_sion_get_filenumber_from_files_mpi", gRank,
"close rc=%d\n",rc));
int sion_get_mapping(int sid, int *mapping_size, sion_int32 **mapping, int *numfiles)
Returns pointers to the internal field mapping.
char * _sion_getenv(const char *name)
int _sion_gen_info_from_gcomm_mpi(int numFiles, MPI_Comm gComm, int *filenumber, int *lrank, int *lsize)
Splits a Communicator in numfiles different communicators.
int _sion_open_read(const char *fname, sion_int64 file_mode_flags, int read_all, int *ntasks, int *nfiles, sion_int64 **chunksizes, sion_int32 *fsblksize, int **globalranks, FILE **fileptr)
internal sion serial open function for reading on one or more files