diff --git a/ompi/mca/fcoll/dynamic/fcoll_dynamic_module.c b/ompi/mca/fcoll/dynamic/fcoll_dynamic_module.c index c70d422542..85b2b7afd1 100644 --- a/ompi/mca/fcoll/dynamic/fcoll_dynamic_module.c +++ b/ompi/mca/fcoll/dynamic/fcoll_dynamic_module.c @@ -37,17 +37,8 @@ static mca_fcoll_base_module_1_0_0_t dynamic = { mca_fcoll_dynamic_module_finalize, mca_fcoll_dynamic_file_read_all, NULL, /* iread_all */ -<<<<<<< HEAD mca_fcoll_dynamic_file_write_all, NULL, /*iwrite_all */ -======= - mca_fcoll_dynamic_file_read_all_begin, - mca_fcoll_dynamic_file_read_all_end, - mca_fcoll_dynamic_file_write_all, - NULL, /*iwrite_all */ - mca_fcoll_dynamic_file_write_all_begin, - mca_fcoll_dynamic_file_write_all_end, ->>>>>>> ff02f765b276ffd0dfd12ba50e85e70fa3db7aca NULL, /* progress */ NULL /* request_free */ }; diff --git a/ompi/mca/fcoll/fcoll.h b/ompi/mca/fcoll/fcoll.h index 066264441d..5bfb555e3c 100644 --- a/ompi/mca/fcoll/fcoll.h +++ b/ompi/mca/fcoll/fcoll.h @@ -118,16 +118,6 @@ typedef int (*mca_fcoll_base_module_file_read_all_fn_t) ompi_status_public_t *status); typedef int (*mca_fcoll_base_module_file_iread_all_fn_t) -<<<<<<< HEAD -======= -(struct mca_io_ompio_file_t *fh, - void *buf, - int count, - struct ompi_datatype_t *datatype, - ompi_request_t **request); - -typedef int (*mca_fcoll_base_module_file_read_all_begin_fn_t) ->>>>>>> ff02f765b276ffd0dfd12ba50e85e70fa3db7aca (struct mca_io_ompio_file_t *fh, void *buf, int count, @@ -142,16 +132,6 @@ typedef int (*mca_fcoll_base_module_file_write_all_fn_t) ompi_status_public_t *status); typedef int (*mca_fcoll_base_module_file_iwrite_all_fn_t) -<<<<<<< HEAD -======= -(struct mca_io_ompio_file_t *fh, - void *buf, - int count, - struct ompi_datatype_t *datatype, - ompi_request_t **request); - -typedef int (*mca_fcoll_base_module_file_write_all_begin_fn_t) ->>>>>>> ff02f765b276ffd0dfd12ba50e85e70fa3db7aca (struct mca_io_ompio_file_t *fh, void *buf, int count, @@ -189,17 +169,8 @@ struct mca_fcoll_base_module_1_0_0_t { /* FCOLL function pointers */ mca_fcoll_base_module_file_read_all_fn_t fcoll_file_read_all; mca_fcoll_base_module_file_iread_all_fn_t fcoll_file_iread_all; -<<<<<<< HEAD mca_fcoll_base_module_file_write_all_fn_t fcoll_file_write_all; mca_fcoll_base_module_file_iwrite_all_fn_t fcoll_file_iwrite_all; -======= - mca_fcoll_base_module_file_read_all_begin_fn_t fcoll_file_read_all_begin; - mca_fcoll_base_module_file_read_all_end_fn_t fcoll_file_read_all_end; - mca_fcoll_base_module_file_write_all_fn_t fcoll_file_write_all; - mca_fcoll_base_module_file_iwrite_all_fn_t fcoll_file_iwrite_all; - mca_fcoll_base_module_file_write_all_begin_fn_t fcoll_file_write_all_begin; - mca_fcoll_base_module_file_write_all_end_fn_t fcoll_file_write_all_end; ->>>>>>> ff02f765b276ffd0dfd12ba50e85e70fa3db7aca mca_fcoll_base_module_progress_fn_t fcoll_progress; mca_fcoll_base_module_request_free_fn_t fcoll_request_free; diff --git a/ompi/mca/fcoll/individual/fcoll_individual_module.c b/ompi/mca/fcoll/individual/fcoll_individual_module.c index d755e06e70..b9c95a86ba 100644 --- a/ompi/mca/fcoll/individual/fcoll_individual_module.c +++ b/ompi/mca/fcoll/individual/fcoll_individual_module.c @@ -37,17 +37,8 @@ static mca_fcoll_base_module_1_0_0_t individual = { mca_fcoll_individual_module_finalize, mca_fcoll_individual_file_read_all, NULL, /* iread_all */ -<<<<<<< HEAD mca_fcoll_individual_file_write_all, NULL, /* iwrite_all */ -======= - mca_fcoll_individual_file_read_all_begin, - mca_fcoll_individual_file_read_all_end, - mca_fcoll_individual_file_write_all, - NULL, /* iwrite_all */ - mca_fcoll_individual_file_write_all_begin, - mca_fcoll_individual_file_write_all_end, ->>>>>>> ff02f765b276ffd0dfd12ba50e85e70fa3db7aca NULL, /* progress */ NULL /* request_free */ }; diff --git a/ompi/mca/fcoll/static/fcoll_static_module.c b/ompi/mca/fcoll/static/fcoll_static_module.c index b3e17db131..f88253ec64 100644 --- a/ompi/mca/fcoll/static/fcoll_static_module.c +++ b/ompi/mca/fcoll/static/fcoll_static_module.c @@ -37,17 +37,8 @@ static mca_fcoll_base_module_1_0_0_t static_t = { mca_fcoll_static_module_finalize, mca_fcoll_static_file_read_all, NULL, /* iread_all */ -<<<<<<< HEAD mca_fcoll_static_file_write_all, NULL, /* iwrite_all */ -======= - mca_fcoll_static_file_read_all_begin, - mca_fcoll_static_file_read_all_end, - mca_fcoll_static_file_write_all, - NULL, /* iwrite_all */ - mca_fcoll_static_file_write_all_begin, - mca_fcoll_static_file_write_all_end, ->>>>>>> ff02f765b276ffd0dfd12ba50e85e70fa3db7aca NULL, /* progress */ NULL /* request_free */ }; diff --git a/ompi/mca/fcoll/two_phase/fcoll_two_phase_module.c b/ompi/mca/fcoll/two_phase/fcoll_two_phase_module.c index f5a5292573..b6e1cb6519 100644 --- a/ompi/mca/fcoll/two_phase/fcoll_two_phase_module.c +++ b/ompi/mca/fcoll/two_phase/fcoll_two_phase_module.c @@ -36,19 +36,9 @@ static mca_fcoll_base_module_1_0_0_t two_phase = { mca_fcoll_two_phase_module_init, mca_fcoll_two_phase_module_finalize, mca_fcoll_two_phase_file_read_all, -<<<<<<< HEAD NULL, /* iread_all */ mca_fcoll_two_phase_file_write_all, NULL, /* iwrite_all */ -======= - NULL, - mca_fcoll_two_phase_file_read_all_begin, - mca_fcoll_two_phase_file_read_all_end, - mca_fcoll_two_phase_file_write_all, - NULL, - mca_fcoll_two_phase_file_write_all_begin, - mca_fcoll_two_phase_file_write_all_end, ->>>>>>> ff02f765b276ffd0dfd12ba50e85e70fa3db7aca NULL, /* progress */ NULL /* request_free */ }; diff --git a/ompi/mca/io/ompio/io_ompio.h b/ompi/mca/io/ompio/io_ompio.h index 6da5cfef77..16ed65906d 100644 --- a/ompi/mca/io/ompio/io_ompio.h +++ b/ompi/mca/io/ompio/io_ompio.h @@ -10,7 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2008-2014 University of Houston. All rights reserved. + * Copyright (c) 2008-2015 University of Houston. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -50,13 +50,13 @@ OMPI_DECLSPEC extern int mca_io_ompio_coll_timing_info; /* * Flags */ -#define OMPIO_CONTIGUOUS_MEMORY 0x00000001 -#define OMPIO_UNIFORM_FVIEW 0x00000002 -#define OMPIO_FILE_IS_OPEN 0x00000004 -#define OMPIO_FILE_VIEW_IS_SET 0x00000008 -#define OMPIO_CONTIGUOUS_FVIEW 0x00000010 -#define OMPIO_AGGREGATOR_IS_SET 0x00000020 -#define OMPIO_SHAREDFP_IS_SET 0x00000040 +#define OMPIO_CONTIGUOUS_MEMORY 0x00000001 +#define OMPIO_UNIFORM_FVIEW 0x00000002 +#define OMPIO_FILE_IS_OPEN 0x00000004 +#define OMPIO_FILE_VIEW_IS_SET 0x00000008 +#define OMPIO_CONTIGUOUS_FVIEW 0x00000010 +#define OMPIO_AGGREGATOR_IS_SET 0x00000020 +#define OMPIO_SHAREDFP_IS_SET 0x00000040 #define QUEUESIZE 2048 #define OMPIO_MIN(a, b) (((a) < (b)) ? (a) : (b)) @@ -297,7 +297,8 @@ struct mca_io_ompio_file_t { size_t f_cc_size; int f_bytes_per_agg; enum ompio_fs_type f_fstype; - + ompi_request_t *f_split_coll_req; + bool f_split_coll_in_use; /* Place for selected sharedfp module to hang it's data. Note: Neither f_sharedfp nor f_sharedfp_component seemed appropriate for this. */ @@ -350,7 +351,8 @@ struct mca_io_ompio_file_t { int *f_init_procs_in_group; int f_final_num_aggrs; - + + /* internal ompio functions required by fbtl and fcoll */ mca_io_ompio_decode_datatype_fn_t f_decode_datatype; mca_io_ompio_generate_current_file_view_fn_t f_generate_current_file_view; diff --git a/ompi/mca/io/ompio/io_ompio_file_open.c b/ompi/mca/io/ompio/io_ompio_file_open.c index e25ef5fe6e..9beb55f105 100644 --- a/ompi/mca/io/ompio/io_ompio_file_open.c +++ b/ompi/mca/io/ompio/io_ompio_file_open.c @@ -122,6 +122,9 @@ ompio_io_ompio_file_open (ompi_communicator_t *comm, ompi_io_ompio_set_file_defaults (ompio_fh); ompio_fh->f_filename = filename; + ompio_fh->f_split_coll_req = NULL; + ompio_fh->f_split_in_use = false; + /*Initialize the print_queues queues here!*/ coll_write_time = (print_queue *) malloc (sizeof(print_queue)); coll_read_time = (print_queue *) malloc (sizeof(print_queue)); diff --git a/ompi/mca/io/ompio/io_ompio_file_read.c b/ompi/mca/io/ompio/io_ompio_file_read.c index 6d7b5eabc9..15657558f2 100644 --- a/ompi/mca/io/ompio/io_ompio_file_read.c +++ b/ompi/mca/io/ompio/io_ompio_file_read.c @@ -9,7 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2008-2014 University of Houston. All rights reserved. + * Copyright (c) 2008-2015 University of Houston. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -379,6 +379,36 @@ int mca_io_ompio_file_read_all (ompi_file_t *fh, return ret; } +int mca_io_ompio_file_iread_all (ompi_file_t *fh, + void *buf, + int count, + struct ompi_datatype_t *datatype, + ompi_request_t **request) +{ + int ret = OMPI_SUCCESS; + mca_io_ompio_data_t *data=NULL; + mca_io_ompio_file_t *fp=NULL; + + data = (mca_io_ompio_data_t *) fh->f_io_selected_data; + fp = &data->ompio_fh; + + if ( NULL != fp->f_fcoll->fcoll_file_iread_all ) { + ret = fp->f_fcoll->fcoll_file_iread_all (&data->ompio_fh, + buf, + count, + datatype, + request); + } + else { + /* this fcoll component does not support non-blocking + collective I/O operations. WE fake it with + individual non-blocking I/O operations. */ + ret = ompio_io_ompio_file_iread ( fp, buf, count, datatype, request ); + } + + return ret; +} + int mca_io_ompio_file_read_at_all (ompi_file_t *fh, OMPI_MPI_OFFSET_TYPE offset, @@ -418,6 +448,41 @@ int ompio_io_ompio_file_read_at_all (mca_io_ompio_file_t *fh, return ret; } +int mca_io_ompio_file_iread_at_all (ompi_file_t *fh, + OMPI_MPI_OFFSET_TYPE offset, + void *buf, + int count, + struct ompi_datatype_t *datatype, + ompi_request_t **request) +{ + int ret = OMPI_SUCCESS; + mca_io_ompio_data_t *data; + mca_io_ompio_file_t *fp=NULL; + OMPI_MPI_OFFSET_TYPE prev_offset; + ompio_io_ompio_file_get_position (fh, &prev_offset ); + + ompi_io_ompio_set_explicit_offset (fh, offset); + + data = (mca_io_ompio_data_t *) fh->f_io_selected_data; + fp = &data->fh_ompio; + if ( NULL != fp->f_fcoll->fcoll_file_iread_all ) { + ret = fp->f_fcoll->fcoll_file_iread_all (&data->ompio_fh, + buf, + count, + datatype, + request); + } + else { + /* this fcoll component does not support non-blocking + collective I/O operations. WE fake it with + individual non-blocking I/O operations. */ + ret = ompio_io_ompio_file_iread ( fp, buf, count, datatype, request ); + } + + + ompi_io_ompio_set_explicit_offset (fh, prev_offset); + return ret; +} /* Infrastructure for shared file pointer operations ** (individual and ordered)*/ @@ -553,10 +618,15 @@ int mca_io_ompio_file_read_all_begin (ompi_file_t *fh, struct ompi_datatype_t *datatype) { int ret = OMPI_SUCCESS; - mca_io_ompio_data_t *data; - - data = (mca_io_ompio_data_t *) fh->f_io_selected_data; + mca_io_ompio_file_t *fp; + fp = (mca_io_ompio_file_t *) &fh->f_io_selected_data->fh_ompio; + if ( true == fp->f_split_coll_in_use ) { + printf("Only one split collective I/O operation allowed per file handle at any given point in time!\n"); + return MPI_ERR_OTHER; + } + ret = mca_io_ompio_file_iread_all ( fh, buf, count, datatype, &fp->f_split_coll_req ); + fp->f_split_coll_in_use = true; return ret; } @@ -566,10 +636,13 @@ int mca_io_ompio_file_read_all_end (ompi_file_t *fh, ompi_status_public_t * status) { int ret = OMPI_SUCCESS; - mca_io_ompio_data_t *data; + mca_io_ompio_file_t *fp; - data = (mca_io_ompio_data_t *) fh->f_io_selected_data; + fp = (mca_io_ompio_file_t *) &fh->f_io_selected_data->fh_ompio; + ret = ompi_mpi_wait ( &fp->f_split_coll_req, status ); + /* remove the flag again */ + fp->f_split_coll_in_use = false; return ret; } @@ -583,7 +656,7 @@ int mca_io_ompio_file_read_at_all_begin (ompi_file_t *fh, mca_io_ompio_data_t *data; data = (mca_io_ompio_data_t *) fh->f_io_selected_data; - + ret = ompio_io_ompio_file_read_at_all_begin ( &data->fh_ompio, offset, buf, count, datatype ); return ret; } @@ -594,17 +667,13 @@ int ompio_io_ompio_file_read_at_all_begin (mca_io_ompio_file_t *fh, struct ompi_datatype_t *datatype) { int ret = OMPI_SUCCESS; - OMPI_MPI_OFFSET_TYPE prev_offset; - ompio_io_ompio_file_get_position (fh, &prev_offset ); - ompi_io_ompio_set_explicit_offset (fh, offset); - /* It is OK to reset the position already here, althgouth - ** the operation might still be pending/ongoing, since - ** the entire array of have - ** already been constructed in the file_read_all_begin operation - */ - - ompi_io_ompio_set_explicit_offset (fh, prev_offset); + if ( true == fh->f_split_coll_in_use ) { + printf("Only one split collective I/O operation allowed per file handle at any given point in time!\n"); + return MPI_ERR_REQUEST; + } + ret = mca_io_ompio_file_iread_at_all ( fh, offset, buf, count, datatype, &fh->f_split_coll_req ); + fh->f_split_coll_in_use = true; return ret; } @@ -616,7 +685,7 @@ int mca_io_ompio_file_read_at_all_end (ompi_file_t *fh, mca_io_ompio_data_t *data; data = (mca_io_ompio_data_t *) fh->f_io_selected_data; - + ret = ompio_io_ompio_file_read_at_all_end ( &data->fh_ompio, but, status ); return ret; } @@ -625,7 +694,9 @@ int ompio_io_ompio_file_read_at_all_end (mca_io_ompio_file_t *ompio_fh, ompi_status_public_t * status) { int ret = OMPI_SUCCESS; + ret = ompi_mpi_wait ( &ompio_fh->f_split_coll_req, status ); - + /* remove the flag again */ + fp->f_split_coll_in_use = false; return ret; } diff --git a/ompi/mca/io/ompio/io_ompio_file_write.c b/ompi/mca/io/ompio/io_ompio_file_write.c index 2bcd36685c..498d5be287 100644 --- a/ompi/mca/io/ompio/io_ompio_file_write.c +++ b/ompi/mca/io/ompio/io_ompio_file_write.c @@ -9,7 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2008-2014 University of Houston. All rights reserved. + * Copyright (c) 2008-2015 University of Houston. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -507,6 +507,36 @@ int mca_io_ompio_file_write_at_all (ompi_file_t *fh, return ret; } +int mca_io_ompio_file_iwrite_all (ompi_file_t *fh, + void *buf, + int count, + struct ompi_datatype_t *datatype, + ompi_request_t **request) +{ + int ret = OMPI_SUCCESS; + mca_io_ompio_data_t *data=NULL; + mca_io_ompio_file_t *fp=NULL; + + data = (mca_io_ompio_data_t *) fh->f_io_selected_data; + fp = &data->ompio_fh; + + if ( NULL != fp->f_fcoll->fcoll_file_iwrite_all ) { + ret = fp->f_fcoll->fcoll_file_iwrite_all (&data->ompio_fh, + buf, + count, + datatype, + request); + } + else { + /* this fcoll component does not support non-blocking + collective I/O operations. WE fake it with + individual non-blocking I/O operations. */ + ret = ompio_io_ompio_file_iwrite ( fp, buf, count, datatype, request ); + } + + return ret; +} + int ompio_io_ompio_file_write_at_all (mca_io_ompio_file_t *fh, OMPI_MPI_OFFSET_TYPE offset, void *buf, @@ -529,6 +559,42 @@ int ompio_io_ompio_file_write_at_all (mca_io_ompio_file_t *fh, return ret; } +int mca_io_ompio_file_iwrite_at_all (ompi_file_t *fh, + OMPI_MPI_OFFSET_TYPE offset, + void *buf, + int count, + struct ompi_datatype_t *datatype, + ompi_request_t **request) +{ + int ret = OMPI_SUCCESS; + mca_io_ompio_data_t *data; + mca_io_ompio_file_t *fp=NULL; + OMPI_MPI_OFFSET_TYPE prev_offset; + ompio_io_ompio_file_get_position (fh, &prev_offset ); + + ompi_io_ompio_set_explicit_offset (fh, offset); + + data = (mca_io_ompio_data_t *) fh->f_io_selected_data; + fp = &data->fh_ompio; + if ( NULL != fp->f_fcoll->fcoll_file_iwrite_all ) { + ret = fp->f_fcoll->fcoll_file_iwrite_all (&data->ompio_fh, + buf, + count, + datatype, + request); + } + else { + /* this fcoll component does not support non-blocking + collective I/O operations. WE fake it with + individual non-blocking I/O operations. */ + ret = ompio_io_ompio_file_iwrite ( fp, buf, count, datatype, request ); + } + + + ompi_io_ompio_set_explicit_offset (fh, prev_offset); + return ret; +} + /* Infrastructure for shared file pointer operations */ /* (Individual and collective */