diff options
author | Mohamad Chaarawi <chaarawi@hdfgroup.org> | 2014-02-25 19:46:43 (GMT) |
---|---|---|
committer | Mohamad Chaarawi <chaarawi@hdfgroup.org> | 2014-02-25 19:46:43 (GMT) |
commit | c5170c77aab259b1060f713ea04dbda0386f90d4 (patch) | |
tree | bb77b0b67a3ef012f681e42114eedda35721d897 | |
parent | b9f277756bd66cd60dd2150e9800598fe3757135 (diff) | |
download | hdf5-c5170c77aab259b1060f713ea04dbda0386f90d4.zip hdf5-c5170c77aab259b1060f713ea04dbda0386f90d4.tar.gz hdf5-c5170c77aab259b1060f713ea04dbda0386f90d4.tar.bz2 |
[svn-r24737] fix async execution for view operations.
-rw-r--r-- | examples/h5ff_client_view.c | 66 | ||||
-rw-r--r-- | src/H5V.c | 26 | ||||
-rw-r--r-- | src/H5VLiod.c | 15 | ||||
-rw-r--r-- | src/H5VLiod_client.h | 14 |
4 files changed, 87 insertions, 34 deletions
diff --git a/examples/h5ff_client_view.c b/examples/h5ff_client_view.c index 5b7cc78..c3620f6 100644 --- a/examples/h5ff_client_view.c +++ b/examples/h5ff_client_view.c @@ -14,9 +14,9 @@ static int my_rank = 0, my_size = 1; static void -write_dataset(const char *file_name, const char *dataset_name, - hsize_t total, hsize_t ncomponents, hid_t datatype_id, - hsize_t ntuples, hsize_t start, void *buf) +test_view(const char *file_name, const char *dataset_name, + hsize_t total, hsize_t ncomponents, hid_t datatype_id, + hsize_t ntuples, hsize_t start, void *buf) { hid_t file_id, view_id; hid_t did1, did2, did3, gid1; @@ -34,13 +34,20 @@ write_dataset(const char *file_name, const char *dataset_name, double lower_bound1 = 39.1, upper_bound1 = 42.1; int lower_bound2 = 295, upper_bound2 = 298; hid_t query_id1, query_id2, query_id3, query_id4, query_id5, query_id6; - hid_t query_id; + hid_t query_id; + hid_t e_stack; + H5ES_status_t status; + size_t num_events = 0; MPI_Request mpi_reqs[6]; /* Choose the IOD VOL plugin to use with this file. */ fapl_id = H5Pcreate(H5P_FILE_ACCESS); H5Pset_fapl_iod(fapl_id, MPI_COMM_WORLD, MPI_INFO_NULL); + /* create an event Queue for managing asynchronous requests. */ + e_stack = H5EScreate(); + assert(e_stack); + /* Open an existing file. */ file_id = H5Fcreate_ff(file_name, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id, H5_EVENT_STACK_NULL); @@ -226,7 +233,7 @@ write_dataset(const char *file_name, const char *dataset_name, assert(query_id); /* create a view on D1 */ - view_id = H5Vcreate_ff(did1, query_id, H5P_DEFAULT, rid2, H5_EVENT_STACK_NULL); + view_id = H5Vcreate_ff(did1, query_id, H5P_DEFAULT, rid2, e_stack); assert(view_id > 0); { @@ -240,10 +247,7 @@ write_dataset(const char *file_name, const char *dataset_name, ret = H5Dclose_ff(did1, H5_EVENT_STACK_NULL); assert(0 == ret); - ret = H5Vget_location_ff(view_id, &did1, H5_EVENT_STACK_NULL); - assert(0 == ret); - - ret = H5Dclose_ff(did1, H5_EVENT_STACK_NULL); + ret = H5Vget_location_ff(view_id, &did1, e_stack); assert(0 == ret); ret = H5Vget_query(view_id, &query_id); @@ -255,10 +259,23 @@ write_dataset(const char *file_name, const char *dataset_name, assert(0 == obj_count); assert(1 == reg_count); + H5ESget_count(e_stack, &num_events); + H5ESwait_all(e_stack, &status); + H5ESclear(e_stack); + printf("%d events in event stack. Completion status = %d\n", num_events, status); + + ret = H5Dclose_ff(did1, H5_EVENT_STACK_NULL); + assert(0 == ret); + ret = H5Vget_elem_regions_ff(view_id, 0, 1, &did1, - ®ion_space, H5_EVENT_STACK_NULL); + ®ion_space, e_stack); assert(0 == ret); + H5ESget_count(e_stack, &num_events); + H5ESwait_all(e_stack, &status); + H5ESclear(e_stack); + printf("%d events in event stack. Completion status = %d\n", num_events, status); + r_ndims = H5Sget_simple_extent_dims(region_space, r_dims, NULL); assert(2 == r_ndims); @@ -277,11 +294,11 @@ write_dataset(const char *file_name, const char *dataset_name, H5Vclose(view_id); - gid1 = H5Gopen_ff(file_id, "G1", H5P_DEFAULT, rid2, H5_EVENT_STACK_NULL); + gid1 = H5Gopen_ff(file_id, "G1", H5P_DEFAULT, rid2, e_stack); assert(gid1 > 0); /* create a view on all datasets under G1 */ - view_id = H5Vcreate_ff(gid1, query_id, H5P_DEFAULT, rid2, H5_EVENT_STACK_NULL); + view_id = H5Vcreate_ff(gid1, query_id, H5P_DEFAULT, rid2, e_stack); assert(view_id > 0); { @@ -293,10 +310,10 @@ write_dataset(const char *file_name, const char *dataset_name, hsize_t r_dims[2]; H5Qclose(query_id); - ret = H5Gclose_ff(gid1, H5_EVENT_STACK_NULL); + ret = H5Gclose_ff(gid1, e_stack); assert(0 == ret); - ret = H5Vget_location_ff(view_id, &gid1, H5_EVENT_STACK_NULL); + ret = H5Vget_location_ff(view_id, &gid1, e_stack); assert(0 == ret); assert(gid1 > 0); @@ -309,13 +326,18 @@ write_dataset(const char *file_name, const char *dataset_name, assert(0 == obj_count); assert(3 == reg_count); - ret = H5Vget_elem_regions_ff(view_id, 0, reg_count, did, regions, H5_EVENT_STACK_NULL); + ret = H5Vget_elem_regions_ff(view_id, 0, reg_count, did, regions, e_stack); assert(0 == ret); + H5ESget_count(e_stack, &num_events); + H5ESwait_all(e_stack, &status); + H5ESclear(e_stack); + printf("%d events in event stack. Completion status = %d\n", num_events, status); + for(i=0 ; i<reg_count ; i++) { assert(did[i] > 0); - ret = H5Dclose_ff(did[i], H5_EVENT_STACK_NULL); + ret = H5Dclose_ff(did[i], e_stack); assert(0 == ret); r_ndims = H5Sget_simple_extent_dims(regions[i], r_dims, NULL); @@ -335,6 +357,11 @@ write_dataset(const char *file_name, const char *dataset_name, } } + H5ESget_count(e_stack, &num_events); + H5ESwait_all(e_stack, &status); + H5ESclear(e_stack); + printf("%d events in event stack. Completion status = %d\n", num_events, status); + H5Vclose(view_id); H5Qclose(query_id); @@ -368,6 +395,9 @@ write_dataset(const char *file_name, const char *dataset_name, ret = H5TRclose(tid1); assert(0 == ret); + ret = H5ESclose(e_stack); + assert(ret == 0); + MPI_Barrier(MPI_COMM_WORLD); /* Close the file. */ @@ -414,8 +444,8 @@ main(int argc, char **argv) MPI_Barrier(MPI_COMM_WORLD); - write_dataset(file_name, dataset_name, total, ncomponents, H5T_NATIVE_INT, - ntuples, start, data); + test_view(file_name, dataset_name, total, ncomponents, H5T_NATIVE_INT, + ntuples, start, data); MPI_Barrier(MPI_COMM_WORLD); @@ -425,6 +425,13 @@ H5Vget_counts(hid_t view_id, hsize_t *attr_count, hsize_t *obj_count, hsize_t *e if(NULL == (view = (H5VL_iod_view_t *)H5I_object_verify(view_id, H5I_VIEW))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an view ID"); + if(view->common.request) { + if(H5VL_IOD_PENDING == view->common.request->state) { + if(H5VL_iod_request_wait(view->common.file, view->common.request) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't wait on operation"); + } + } + if(NULL != attr_count) *attr_count = view->attr_info.count; if(NULL != obj_count) @@ -487,8 +494,12 @@ H5Vget_location_ff(hid_t view_id, hid_t *loc_id, hid_t estack_id) vol_plugin->nrefs ++; } - tr.file = view->file; + tr.file = view->common.file; tr.trans_num = view->c_version; + tr.req_info.request = NULL; + tr.req_info.head = NULL; + tr.req_info.tail = NULL; + tr.req_info.num_req = 0; if(NULL == (opened_obj = H5VL_iod_obj_open_token(view->loc_info.buf, &tr, &opened_type, req))) @@ -539,6 +550,13 @@ H5Vget_elem_regions_ff(hid_t view_id, hsize_t start, hsize_t count, hid_t datase if(NULL == (view = (H5VL_iod_view_t *)H5I_object_verify(view_id, H5I_VIEW))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an view ID"); + if(view->common.request) { + if(H5VL_IOD_PENDING == view->common.request->state) { + if(H5VL_iod_request_wait(view->common.file, view->common.request) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't wait on operation"); + } + } + if(start >= view->region_info.count || start+count > view->region_info.count) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "start/count out of range") @@ -564,8 +582,12 @@ H5Vget_elem_regions_ff(hid_t view_id, hsize_t start, hsize_t count, hid_t datase vol_plugin->nrefs ++; } - tr.file = view->file; + tr.file = view->common.file; tr.trans_num = view->c_version; + tr.req_info.request = NULL; + tr.req_info.head = NULL; + tr.req_info.tail = NULL; + tr.req_info.num_req = 0; if(NULL == (opened_obj = H5VL_iod_obj_open_token(view->region_info.tokens[i].buf, &tr, &opened_type, req))) diff --git a/src/H5VLiod.c b/src/H5VLiod.c index bd5be88..fa8f843 100644 --- a/src/H5VLiod.c +++ b/src/H5VLiod.c @@ -6161,7 +6161,7 @@ H5VL_iod_obj_open_token(const void *token, H5TR_t *tr, H5I_type_t *opened_type, if(H5VL__iod_create_and_forward(H5VL_OBJECT_OPEN_BY_TOKEN_ID, HG_OBJECT_OPEN_BY_TOKEN, (H5VL_iod_object_t *)dset, 1, 0, NULL, - (H5VL_iod_req_info_t *)tr, &input, + NULL, &input, &dset->remote_dset.iod_oh, dset, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship dataset open_by_token"); @@ -6227,7 +6227,7 @@ H5VL_iod_obj_open_token(const void *token, H5TR_t *tr, H5I_type_t *opened_type, if(H5VL__iod_create_and_forward(H5VL_OBJECT_OPEN_BY_TOKEN_ID, HG_OBJECT_OPEN_BY_TOKEN, (H5VL_iod_object_t *)dtype, 1, 0, NULL, - (H5VL_iod_req_info_t *)tr, &input, + NULL, &input, &dtype->remote_dtype.iod_oh, dtype, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship datatype open_by_token"); @@ -6277,7 +6277,7 @@ H5VL_iod_obj_open_token(const void *token, H5TR_t *tr, H5I_type_t *opened_type, if(H5VL__iod_create_and_forward(H5VL_OBJECT_OPEN_BY_TOKEN_ID, HG_OBJECT_OPEN_BY_TOKEN, (H5VL_iod_object_t *)grp, 1, 0, NULL, - (H5VL_iod_req_info_t *)tr, &input, + NULL, &input, &grp->remote_group.iod_oh, grp, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship group open_by_token"); @@ -6358,7 +6358,7 @@ H5VL_iod_obj_open_token(const void *token, H5TR_t *tr, H5I_type_t *opened_type, if(H5VL__iod_create_and_forward(H5VL_OBJECT_OPEN_BY_TOKEN_ID, HG_OBJECT_OPEN_BY_TOKEN, (H5VL_iod_object_t *)map, 1, 0, NULL, - (H5VL_iod_req_info_t *)tr, &input, + NULL, &input, &map->remote_map, map, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship map open"); @@ -9995,7 +9995,7 @@ H5VL_iod_view_create(void *_obj, hid_t query_id, hid_t vcpl_id, hid_t rcxt_id, v input.cs_scope = obj->file->md_integrity_scope; /* initialize View object */ - view->file = obj->file; + view->common.file = obj->file; view->c_version = rc->c_version; /* store a token for the location object */ @@ -10032,8 +10032,9 @@ H5VL_iod_view_create(void *_obj, hid_t query_id, hid_t vcpl_id, hid_t rcxt_id, v #endif if(H5VL__iod_create_and_forward(H5VL_VIEW_CREATE_ID, HG_VIEW_CREATE, - obj, 0, num_parents, parent_reqs, - (H5VL_iod_req_info_t *)rc, &input, view, view, req) < 0) + (H5VL_iod_object_t *)view, 1, num_parents, parent_reqs, + (H5VL_iod_req_info_t *)rc, &input, &view->valid_view, + view, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship view create"); ret_value = (void *)view; diff --git a/src/H5VLiod_client.h b/src/H5VLiod_client.h index 653f8f5..01ccaf8 100644 --- a/src/H5VLiod_client.h +++ b/src/H5VLiod_client.h @@ -275,14 +275,14 @@ typedef struct H5VL_iod_dtype_t { /* struct that contains the information about a View object */ typedef struct H5VL_iod_view_t { /* Do NOT change the order of the parameters */ - hbool_t valid_view; - region_info_t region_info; - obj_info_t obj_info; - attr_info_t attr_info; - loc_info_t loc_info; - struct H5VL_iod_file_t *file; + H5VL_iod_object_t common; /* must be first */ + hbool_t valid_view; /* indicates whether the view constructed is valid or not */ + region_info_t region_info; /* struct containing dataset tokens and region dataspace IDs of view */ + obj_info_t obj_info; /* struct containing object info from link queries in view */ + attr_info_t attr_info; /* struct containing attr info from attribute queries in view */ + loc_info_t loc_info; /* token for the location object where the view was constructed */ uint64_t c_version; - hid_t query_id; + hid_t query_id; hid_t vcpl_id; } H5VL_iod_view_t; |