diff options
Diffstat (limited to 'fortran/testpar/async.F90')
-rw-r--r-- | fortran/testpar/async.F90 | 101 |
1 files changed, 61 insertions, 40 deletions
diff --git a/fortran/testpar/async.F90 b/fortran/testpar/async.F90 index e3a80ad..2235ecf 100644 --- a/fortran/testpar/async.F90 +++ b/fortran/testpar/async.F90 @@ -26,6 +26,10 @@ MODULE test_async_APIs LOGICAL :: async_enabled = .TRUE. LOGICAL :: mpi_thread_mult = .TRUE. + INTEGER(C_INT), PARAMETER :: logical_true = 1 + INTEGER(C_INT), PARAMETER :: logical_false = 0 + + ! Custom group iteration callback data TYPE, bind(c) :: iter_info CHARACTER(KIND=C_CHAR), DIMENSION(1:12) :: name ! The name of the object @@ -174,7 +178,7 @@ CONTAINS INTEGER(HID_T) :: space_id INTEGER(HID_T) :: attr_id0, attr_id1, attr_id2 LOGICAL :: exists - LOGICAL(C_BOOL), TARGET :: exists0 = .FALSE., exists1 = .FALSE., exists2 = .FALSE., exists3 = .FALSE. + INTEGER(C_INT), TARGET :: exists0=logical_false, exists1=logical_false, exists2=logical_false, exists3=logical_false TYPE(C_PTR) :: f_ptr, f_ptr1, f_ptr2 CALL H5EScreate_f(es_id, hdferror) @@ -194,8 +198,8 @@ CONTAINS CALL H5Screate_f(H5S_SCALAR_F, space_id, hdferror) CALL check("H5Screate_f", hdferror, total_error) - f_ptr1 = C_LOC(app_file) - f_ptr2 = C_LOC(app_func) + f_ptr1 = C_LOC(app_file(1:1)) + f_ptr2 = C_LOC(app_func(1:1)) CALL h5acreate_async_f(file_id, attr_name, H5T_NATIVE_INTEGER, space_id, attr_id0, es_id, hdferror, & file=f_ptr1, func=f_ptr2, line=app_line) CALL check("h5acreate_f",hdferror,total_error) @@ -300,10 +304,10 @@ CONTAINS CALL check("H5ESwait_f", hdferror, total_error) CALL VERIFY("H5ESwait_f", err_occurred, .FALSE., total_error) - CALL VERIFY("H5Aexists_async_f", LOGICAL(exists0), .TRUE., total_error) - CALL VERIFY("H5Aexists_async_f", LOGICAL(exists1), .TRUE., total_error) - CALL VERIFY("H5Aexists_by_name_async_f", LOGICAL(exists2), .TRUE., total_error) - CALL VERIFY("H5Aexists_by_name_async_f", LOGICAL(exists3), .TRUE., total_error) + CALL VERIFY("H5Aexists_async_f", exists0, logical_true, total_error) + CALL VERIFY("H5Aexists_async_f", exists1, logical_true, total_error) + CALL VERIFY("H5Aexists_by_name_async_f", exists2, logical_true, total_error) + CALL VERIFY("H5Aexists_by_name_async_f", exists3, logical_true, total_error) CALL VERIFY("H5Aread_async_f", attr_rdata0, attr_data0, total_error) CALL VERIFY("H5Aread_async_f", attr_rdata1, attr_data1, total_error) @@ -784,7 +788,7 @@ CONTAINS INTEGER(hid_t) :: sid = -1 ! Dataspace ID CHARACTER(LEN=12), PARAMETER :: CORDER_GROUP_NAME = "corder_group" CHARACTER(LEN=12), PARAMETER :: CORDER_GROUP_NAME2 = "corder_grp00" - LOGICAL(C_BOOL), TARGET :: exists1, exists2 + INTEGER(C_INT), TARGET :: exists1, exists2 LOGICAL :: exists TYPE(C_PTR) :: f_ptr @@ -911,12 +915,12 @@ CONTAINS CALL H5Fopen_async_f(filename, H5F_ACC_RDWR_F, file_id, es_id, hdferror, access_prp = fapl_id ) CALL check("h5fopen_async_f",hdferror,total_error) - exists1 = .FALSE. + exists1 = logical_false f_ptr = C_LOC(exists1) CALL H5Lexists_async_f(file_id, "hard_zero", f_ptr, es_id, hdferror) CALL check("H5Lexists_async_f",hdferror,total_error) - exists2 = .FALSE. + exists2 = logical_false f_ptr = C_LOC(exists2) CALL H5Lexists_async_f(file_id, "hard_two", f_ptr, es_id, hdferror) CALL check("H5Lexists_async_f",hdferror,total_error) @@ -931,8 +935,8 @@ CONTAINS CALL check("H5ESwait_f", hdferror, total_error) CALL VERIFY("H5ESwait_f", err_occurred, .FALSE., total_error) - CALL VERIFY("H5Lexists_async_f", LOGICAL(exists1), .TRUE., total_error) - CALL VERIFY("H5Lexists_async_f", LOGICAL(exists2), .TRUE., total_error) + CALL VERIFY("H5Lexists_async_f", exists1, logical_true, total_error) + CALL VERIFY("H5Lexists_async_f", exists2, logical_true, total_error) CALL h5fopen_f(filename, H5F_ACC_RDWR_F, file_id, hdferror, access_prp = fapl_id ) CALL check("h5fopen_f",hdferror, total_error) @@ -1255,7 +1259,11 @@ PROGRAM async_test LOGICAL :: registered INTEGER :: sum INTEGER :: nerrors = 0 + INTEGER :: len, idx + CHARACTER(LEN=255) :: vol_connector_string, vol_connector_name + INTEGER(C_INT64_T) :: cap_flags + INTEGER(HID_T) :: plist_id LOGICAL :: cleanup INTEGER :: ret_total_error = 0 @@ -1297,47 +1305,60 @@ PROGRAM async_test ! CALL h5open_f(hdferror) - ! CHECK ASYNC VOLS AVAILABILITY ! - ! (1) Check if ASYNC VOL is available - CALL H5VLis_connector_registered_by_name_f("async", registered, hdferror) - CALL check("H5VLis_connector_registered_by_name_f", hdferror, total_error) - IF(.NOT.registered)THEN + IF(mpi_rank==0) WRITE(*,'(A)', ADVANCE="NO") "VOL CONNECTOR TESTED: " + + CALL get_environment_variable("HDF5_VOL_CONNECTOR", VALUE=vol_connector_string, LENGTH=len) + IF(len .EQ. 0)THEN + + ! No VOL connector set; using native VOL connector + async_enabled = .FALSE. + IF(mpi_rank==0) WRITE(*,'(A,/)') "NATIVE" + + ELSE + + idx = INDEX(vol_connector_string, " ") + vol_connector_name = vol_connector_string(1:idx-1) - ! (2) check if the DAOS VOL is available - CALL H5VLis_connector_registered_by_name_f("daos", registered, hdferror) + ! (1) Check if the VOL is available + CALL H5VLis_connector_registered_by_name_f(TRIM(vol_connector_name), registered, hdferror) CALL check("H5VLis_connector_registered_by_name_f", hdferror, total_error) IF(.NOT.registered)THEN - ! No async compatible VOL found + ! No VOL found registered async_enabled = .FALSE. + IF(mpi_rank==0) WRITE(*,'(A,/)') "NATIVE" ELSE - CALL H5Vlregister_connector_by_name_f("daos", vol_id, hdferror) - CALL check("H5Vlregister_connector_by_name_f", hdferror, total_error) + ! (2) Check if the VOL is async compatible + CALL h5pcreate_f(H5P_FILE_ACCESS_F, plist_id, hdferror) + CALL check("h5pcreate_f", hdferror, total_error) + CALL h5pget_vol_cap_flags_f(plist_id, cap_flags, hdferror) + CALL check("h5pget_vol_cap_flags_f", hdferror, total_error) + CALL h5pclose_f(plist_id, hdferror) + CALL check("h5pcreate_f", hdferror, total_error) + IF(H5VL_CAP_FLAG_ASYNC_F.EQ.1_C_INT64_T) async_enabled = .TRUE. + IF(async_enabled .EQV. .FALSE.)THEN + ! No async compatible VOL found + IF(mpi_rank==0) WRITE(*,'(A,/)') "NATIVE" + ELSE + IF(mpi_rank==0) WRITE(*,'(A,/)') TRIM(vol_connector_name) + CALL H5Vlregister_connector_by_name_f(TRIM(vol_connector_name), vol_id, hdferror) + CALL check("H5Vlregister_connector_by_name_f", hdferror, total_error) + ENDIF ENDIF - ELSE - CALL H5Vlregister_connector_by_name_f("async", vol_id, hdferror) - CALL check("H5Vlregister_connector_by_name_f", hdferror, total_error) - ENDIF - - IF ( (async_enabled .EQV. .TRUE.) .AND. (mpi_thread_mult .EQV. .FALSE.) ) THEN - total_error = -1 ! Skip test - IF(mpi_rank==0) CALL write_test_status(total_error, & - "No MPI_Init_thread support for MPI_THREAD_MULTIPLE", total_error) - CALL MPI_Barrier(MPI_COMM_WORLD, mpierror) - CALL MPI_Finalize(mpierror) - STOP + IF ( (async_enabled .EQV. .TRUE.) .AND. (mpi_thread_mult .EQV. .FALSE.) ) THEN + total_error = -1 ! Skip test + IF(mpi_rank==0) CALL write_test_status(total_error, & + "No MPI_Init_thread support for MPI_THREAD_MULTIPLE", total_error) + CALL MPI_Barrier(MPI_COMM_WORLD, mpierror) + CALL MPI_Finalize(mpierror) + STOP + ENDIF ENDIF -! IF(total_error.LT.0)THEN -! IF(mpi_rank==0) CALL write_test_status(total_error, & -! 'Testing async APIs', total_error) -! STOP -! ENDIF - ! H5ES API TESTING ret_total_error = 0 CALL H5ES_tests(cleanup, ret_total_error) |