65 if (init_values !=
NULL){
82 memcpy(help, h,
sizeof(h));
118 && (
sizeof(MPI_Aint) < 8)
121 ERR(
"segment size must be < 2GiB");
123 ERR(
"shared file pointer not implemented");
127 ERR(
"need larger file size for strided datatype in MPIIO");
129 ERR(
"random offset not available with collective MPIIO");
131 ERR(
"random offset not available with MPIIO fileviews");
146 int mpi_mode = MPI_MODE_UNIQUE_OPEN;
147 MPI_Info mpiHints = MPI_INFO_NULL;
149 if ((mode & W_OK) && (mode & R_OK))
150 mpi_mode |= MPI_MODE_RDWR;
151 else if (mode & W_OK)
152 mpi_mode |= MPI_MODE_WRONLY;
154 mpi_mode |= MPI_MODE_RDONLY;
158 int ret = MPI_File_open(MPI_COMM_SELF, path, mpi_mode, mpiHints, &fd);
163 if (mpiHints != MPI_INFO_NULL)
164 MPI_CHECK(MPI_Info_free(&mpiHints),
"MPI_Info_free failed");
173 return MPIIO_Open(testFileName, iorflags, module_options);
182 int fd_mode = (int)0,
191 MPI_Info mpiHints = MPI_INFO_NULL;
196 fd_mode |= MPI_MODE_RDONLY;
199 fd_mode |= MPI_MODE_WRONLY;
202 fd_mode |= MPI_MODE_RDWR;
205 fd_mode |= MPI_MODE_APPEND;
208 fd_mode |= MPI_MODE_CREATE;
211 fd_mode |= MPI_MODE_EXCL;
214 fprintf(stdout,
"O_DIRECT not implemented in MPIIO\n");
222 fd_mode |= MPI_MODE_UNIQUE_OPEN;
225 comm = MPI_COMM_SELF;
239 fprintf(stdout,
"\nhints passed to MPI_File_open() {\n");
241 fprintf(stdout,
"}\n");
244 MPI_CHECKF(MPI_File_open(comm, testFileName, fd_mode, mpiHints, & mfd->fd),
245 "cannot open file: %s", testFileName);
247 MPI_CHECKF(MPI_File_set_size(mfd->fd, 0),
"cannot truncate file: %s", testFileName);
253 if (mpiHints != MPI_INFO_NULL)
254 MPI_CHECK(MPI_Info_free(&mpiHints),
"MPI_Info_free failed");
255 MPI_CHECK(MPI_File_get_info(mfd->fd, &mpiHints),
256 "cannot get file info");
257 fprintf(stdout,
"\nhints returned from opened file {\n");
259 fprintf(stdout,
"}\n");
269 "cannot preallocate file");
277 MPI_CHECK(MPI_Type_create_resized( mfd->contigType, 0, 0, & mfd->transferType),
"cannot create resized type");
278 MPI_CHECK(MPI_Type_commit(& mfd->contigType),
"cannot commit datatype");
279 MPI_CHECK(MPI_Type_commit(& mfd->transferType),
"cannot commit datatype");
293 struct fileTypeStruct {
294 int globalSizes[2], localSizes[2], startIndices[2];
300 fileTypeStruct.globalSizes[0] = 1;
301 fileTypeStruct.globalSizes[1] = transfersPerBlock * tasksPerFile;
302 fileTypeStruct.localSizes[0] = 1;
303 fileTypeStruct.localSizes[1] = transfersPerBlock;
304 fileTypeStruct.startIndices[0] = 0;
305 fileTypeStruct.startIndices[1] = transfersPerBlock * offsetFactor;
308 (2, fileTypeStruct.globalSizes,
309 fileTypeStruct.localSizes,
310 fileTypeStruct.startIndices, MPI_ORDER_C,
311 mfd->contigType, & mfd->fileType),
312 "cannot create subarray");
313 MPI_CHECK(MPI_Type_commit(& mfd->fileType),
"cannot commit datatype");
318 (MPI_Info) MPI_INFO_NULL),
319 "cannot set file view");
321 MPI_CHECK(MPI_Type_create_resized(mfd->contigType, 0, tasksPerFile * hints->
blockSize, & mfd->fileType),
"cannot create MPI_Type_create_hvector");
322 MPI_CHECK(MPI_Type_commit(& mfd->fileType),
"cannot commit datatype");
326 if (mpiHints != MPI_INFO_NULL)
327 MPI_CHECK(MPI_Info_free(&mpiHints),
"MPI_Info_free failed");
328 return ((
void *) mfd);
346 int (
MPIAPI * Access) (MPI_File,
void *, int,
347 MPI_Datatype, MPI_Status *);
348 int (
MPIAPI * Access_at) (MPI_File, MPI_Offset,
void *, int,
349 MPI_Datatype, MPI_Status *);
350 int (
MPIAPI * Access_all) (MPI_File,
void *, int,
351 MPI_Datatype, MPI_Status *);
352 int (
MPIAPI * Access_at_all) (MPI_File, MPI_Offset,
void *, int,
353 MPI_Datatype, MPI_Status *);
363 if (access ==
WRITE) {
364 Access = (int (
MPIAPI *)(MPI_File,
void *, int,
365 MPI_Datatype, MPI_Status *)) MPI_File_write;
366 Access_at = (int (
MPIAPI *)(MPI_File, MPI_Offset,
void *, int,
367 MPI_Datatype, MPI_Status *)) MPI_File_write_at;
368 Access_all = (int (
MPIAPI *) (MPI_File,
void *, int,
369 MPI_Datatype, MPI_Status *)) MPI_File_write_all;
370 Access_at_all = (int (
MPIAPI *) (MPI_File, MPI_Offset,
void *, int,
371 MPI_Datatype, MPI_Status *)) MPI_File_write_at_all;
378 Access = MPI_File_read;
379 Access_at = MPI_File_read_at;
380 Access_all = MPI_File_read_all;
381 Access_at_all = MPI_File_read_at_all;
417 (MPI_Info) MPI_INFO_NULL),
"cannot set file view");
425 (mfd->
fd, buffer, length,
427 "cannot access collective");
431 (mfd->
fd, buffer, length,
433 "cannot access noncollective");
450 (mfd->
fd, offset, module_options) < 0) {
463 "useSharedFilePointer not implemented\n");
470 buffer, length, MPI_BYTE, &status),
471 "cannot access explicit, collective");
476 buffer, length, MPI_BYTE, &status),
477 "cannot access explicit, noncollective");
493 if (MPI_File_sync(mfd->
fd) != MPI_SUCCESS)
494 EWARN(
"fsync() failed");
505 MPI_CHECK(MPI_File_close(& mfd->
fd),
"cannot close file");
526 MPI_CHECKF(MPI_File_delete(testFileName, (MPI_Info) MPI_INFO_NULL),
527 "cannot delete file: %s", testFileName);
535 static char ver[1024] = {};
536 int version, subversion;
537 MPI_CHECK(MPI_Get_version(&version, &subversion),
"cannot get MPI version");
538 sprintf(ver,
"(%d.%d)", version, subversion);
549 int offsetFactor, tasksPerFile;
574 + (((tempOffset % (hints->
blockSize * tasksPerFile))
579 MPI_CHECK(MPI_File_seek(fd, tempOffset, MPI_SEEK_SET),
580 "cannot seek offset");
593 IOR_offset_t aggFileSizeFromStat, tmpMin, tmpMax, tmpSum;
596 MPI_Info mpiHints = MPI_INFO_NULL;
599 comm = MPI_COMM_SELF;
605 MPI_CHECK(MPI_File_open(comm, testFileName, MPI_MODE_RDONLY,
607 "cannot open file to get file size");
608 MPI_CHECK(MPI_File_get_size(fd, (MPI_Offset *) & aggFileSizeFromStat),
609 "cannot get file size");
610 MPI_CHECK(MPI_File_close(&fd),
"cannot close file");
611 if (mpiHints != MPI_INFO_NULL)
612 MPI_CHECK(MPI_Info_free(&mpiHints),
"MPI_Info_free failed");
614 return (aggFileSizeFromStat);
static aiori_fd_t * MPIIO_Create(char *, int iorflags, aiori_mod_opt_t *)
void ShowHints(MPI_Info *mpiHints)
IOR_offset_t segmentCount
static aiori_xfer_hint_t * hints
#define MPI_CHECKF(MPI_STATUS, FORMAT,...)
struct benchmark_options o
static int MPIIO_check_params(aiori_mod_opt_t *options)
IOR_offset_t MPIIO_GetFileSize(aiori_mod_opt_t *module_options, char *testFileName)
#define MPI_CHECK(MPI_STATUS, MSG)
int aiori_posix_stat(const char *path, struct stat *buf, aiori_mod_opt_t *module_options)
int MPIIO_Access(const char *path, int mode, aiori_mod_opt_t *module_options)
static option_help options[]
static aiori_fd_t * MPIIO_Open(char *, int flags, aiori_mod_opt_t *)
void MPIIO_xfer_hints(aiori_xfer_hint_t *params)
IOR_offset_t transferSize
static option_help * MPIIO_options(aiori_mod_opt_t **init_backend_options, aiori_mod_opt_t *init_values)
static IOR_offset_t SeekOffset(MPI_File, IOR_offset_t, aiori_mod_opt_t *)
static IOR_offset_t MPIIO_Xfer(int, aiori_fd_t *, IOR_size_t *, IOR_offset_t, IOR_offset_t, aiori_mod_opt_t *)
static char * MPIIO_GetVersion()
int aiori_posix_rmdir(const char *path, aiori_mod_opt_t *module_options)
int aiori_posix_mkdir(const char *path, mode_t mode, aiori_mod_opt_t *module_options)
static void MPIIO_Close(aiori_fd_t *, aiori_mod_opt_t *)
int aiori_posix_statfs(const char *path, ior_aiori_statfs_t *stat_buf, aiori_mod_opt_t *module_options)
MPI_Datatype transferType
void SetHints(MPI_Info *mpiHints, char *hintsFileName)
void MPIIO_Delete(char *testFileName, aiori_mod_opt_t *module_options)
long long int IOR_offset_t
static void MPIIO_Fsync(aiori_fd_t *, aiori_mod_opt_t *)