int lemonWriteLatticeParallelMapped(LemonWriter *writer, void *data, MPI_Offset siteSize, int const *latticeDims, int const *mapping) { int written; int error; MPI_Status status; LemonSetup setup; error = lemonClearWriterState(writer); if (error != LEMON_SUCCESS) return error; lemonSetupIOTypes(&setup, writer->cartesian, siteSize, latticeDims, mapping); /* Install the data organization we worked out above on the file as a view */ MPI_Barrier(writer->cartesian); MPI_File_set_view(*writer->fp, writer->off + writer->pos, setup.etype, setup.ftype, "native", MPI_INFO_NULL); /* Blast away! */ MPI_File_write_at_all(*writer->fp, writer->pos, data, setup.localVol, setup.etype, &status); MPI_File_sync(*writer->fp); MPI_Barrier(writer->cartesian); writer->pos += setup.totalVol * siteSize; /* We should reset the shared file pointer, in an MPI_BYTE based view... */ MPI_Barrier(writer->cartesian); MPI_File_set_view(*writer->fp, 0, MPI_BYTE, MPI_BYTE, "native", MPI_INFO_NULL); /* Free up the resources we claimed for this operation. */ lemonFreeIOTypes(&setup); MPI_Get_count(&status, MPI_BYTE, &written); if (written != siteSize * setup.localVol) { fprintf(stderr, "[LEMON] Node %d reports in lemonWriteLatticeParallel:\n" " Could not write the required amount of data.\n", writer->my_rank); return LEMON_ERR_WRITE; } return LEMON_SUCCESS; }
int lemonReadLatticeParallelMapped(LemonReader *reader, void *data, MPI_Offset siteSize, int const *latticeDims, int const *mapping) { int read; int error; MPI_Status status; LemonSetup setup; error = lemonClearReaderState(reader); if (error != LEMON_SUCCESS) return error; lemonSetupIOTypes(&setup, reader->cartesian, siteSize, latticeDims, mapping); /* Install the data organization we worked out above on the file as a view. We keep the individual file pointers synchronized explicitly, so assume they are here. */ MPI_File_set_view(*reader->fp, reader->off + reader->pos, setup.etype, setup.ftype, "native", MPI_INFO_NULL); /* Blast away! */ MPI_File_read_at_all(*reader->fp, reader->pos, data, setup.localVol, setup.etype, &status); MPI_Barrier(reader->cartesian); /* Synchronize the file pointer */ MPI_Get_count(&status, MPI_BYTE, &read); reader->pos += setup.totalVol * siteSize; /* We want to leave the file in a well-defined state, so we reset the view to a default. */ /* We don't want to reread any data, so we maximize the file pointer globally. */ MPI_Barrier(reader->cartesian); MPI_File_set_view(*reader->fp, 0, MPI_BYTE, MPI_BYTE, "native", MPI_INFO_NULL); lemonFreeIOTypes(&setup); /* Doing a data read should never get us to EOF, only header scanning -- any shortfall is an error */ if (read != siteSize * setup.localVol) { fprintf(stderr, "[LEMON] Node %d reports in lemonReadLatticeParallel:\n" " Could not read the required amount of data.\n", reader->my_rank); return LEMON_ERR_READ; } return LEMON_SUCCESS; }