1/* This is part of the netCDF package.
2   Copyright 20057 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test HDF5 file code. These are not intended to be exhaustive tests,
6   but they use HDF5 the same way that netCDF-4 does, so if these
7   tests don't work, than netCDF-4 won't work either.
8
9   This files tests parallel I/O.
10
11   $Id: tst_h_par.c,v 1.15 2010/05/25 13:53:04 ed Exp $
12*/
13#include <nc_tests.h>
14#include <hdf5.h>
15
16/* Defining USE_MPE causes the MPE trace library to be used (and you
17 * must also relink with -llmpe -lmpe). This causes clog2 output to be
18 * written, which can be converted to slog2 (by the program
19 * clog2TOslog2) and then used in the analysis program jumpshot. */
20/*#define USE_MPE 1*/
21
22#ifdef USE_MPE
23#include <mpe.h>
24#endif /* USE_MPE */
25
26#define FILE_NAME "tst_h_par.h5"
27#define VAR_NAME "HALs_memory"
28#define NDIMS 1
29#define MILLION 1000000
30#define DIM2_LEN 16000000
31#define SC1 100000 /* slice count. */
32
33int
34main(int argc, char **argv)
35{
36   int pmy_rank;
37
38#ifdef USE_MPE
39   int s_inite_inits_definee_defines_writee_writes_closee_close;
40#endif /* USE_MPE */
41
42   MPI_Init(&argc, &argv);
43   MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
44   MPI_Comm_size(MPI_COMM_WORLD, &p);
45
46#ifdef USE_MPE
47   MPE_Init_log();
48   s_init = MPE_Log_get_event_number();
49   e_init = MPE_Log_get_event_number();
50   s_define = MPE_Log_get_event_number();
51   e_define = MPE_Log_get_event_number();
52   s_write = MPE_Log_get_event_number();
53   e_write = MPE_Log_get_event_number();
54   s_close = MPE_Log_get_event_number();
55   e_close = MPE_Log_get_event_number();
56   MPE_Describe_state(s_inite_init, "Init", "red");
57   MPE_Describe_state(s_definee_define, "Define", "yellow");
58   MPE_Describe_state(s_writee_write, "Write", "green");
59   MPE_Describe_state(s_closee_close, "Close", "purple");
60   MPE_Start_log();
61   MPE_Log_event(s_init, 0, "start init");
62#endif /* USE_MPE */
63
64   if (!my_rank)
65      printf("*** Creating file for parallel I/O read, and rereading it...");
66   {
67      hid_t fapl_idfileidwhole_spaceiddsidslice_spaceidwhole_spaceid1xferid;
68      hsize_t start[NDIMS], count[NDIMS];
69      hsize_t dims[1];
70      int data[SC1], data_in[SC1];
71      int num_steps;
72      double ftime;
73      int write_usread_us;
74      int max_write_usmax_read_us;
75      float write_rateread_rate;
76      int is;
77
78      /* We will write the same slice of random data over and over to
79       * fill the file. */
80      for (i = 0; i < SC1i++)
81  data[i] = rand();
82
83#ifdef USE_MPE
84      MPE_Log_event(e_init, 0, "end init");
85      MPE_Log_event(s_define, 0, "start define file");
86#endif /* USE_MPE */
87
88      /* Create file. */
89      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
90      if (H5Pset_fapl_mpio(fapl_idMPI_COMM_WORLDMPI_INFO_NULL) < 0) ERR;
91      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
92       fapl_id)) < 0) ERR;
93
94      /* Create a space to deal with one slice in memory. */
95      dims[0] = SC1;
96      if ((slice_spaceid = H5Screate_simple(NDIMSdimsNULL)) < 0) ERR;
97
98      /* Create a space to write all slices. */
99      dims[0] = DIM2_LEN;
100      if ((whole_spaceid = H5Screate_simple(NDIMSdimsNULL)) < 0) ERR;
101
102      /* Create dataset. */
103      if ((dsid = H5Dcreate1(fileidVAR_NAMEH5T_NATIVE_INT,
104      whole_spaceidH5P_DEFAULT)) < 0) ERR;
105
106      /* Use collective write operations. */
107      if ((xferid = H5Pcreate(H5P_DATASET_XFER)) < 0) ERR;
108      if (H5Pset_dxpl_mpio(xferidH5FD_MPIO_COLLECTIVE) < 0) ERR;
109
110#ifdef USE_MPE
111      MPE_Log_event(e_define, 0, "end define file");
112      if (my_rank)
113  sleep(my_rank);
114#endif /* USE_MPE */
115
116      /* Write the data in num_step steps. */
117      ftime = MPI_Wtime();
118      num_steps = (DIM2_LEN/SC1) / p;
119      for (s = 0; s < num_stepss++)
120      {
121#ifdef USE_MPE
122  MPE_Log_event(s_write, 0, "start write slab");
123#endif /* USE_MPE */
124
125  /* Select hyperslab for write of one slice. */
126  start[0] = s * SC1 * p + my_rank * SC1;
127  count[0] = SC1;
128  if (H5Sselect_hyperslab(whole_spaceidH5S_SELECT_SET,
129  startNULLcountNULL) < 0) ERR;
130
131  if (H5Dwrite(dsidH5T_NATIVE_INTslice_spaceidwhole_spaceid,
132  xferiddata) < 0) ERR;
133
134#ifdef USE_MPE
135  MPE_Log_event(e_write, 0, "end write file");
136#endif /* USE_MPE */
137      }
138      write_us = (MPI_Wtime() - ftime) * MILLION;
139      MPI_Reduce(&write_us, &max_write_us, 1, MPI_INTMPI_MAX, 0, MPI_COMM_WORLD);
140      if (!my_rank)
141      {
142  write_rate = (float)(DIM2_LEN * sizeof(int))/(float)max_write_us;
143  printf("\np=%d, write_rate=%g", pwrite_rate);
144      }
145
146#ifdef USE_MPE
147      MPE_Log_event(s_close, 0, "start close file");
148#endif /* USE_MPE */
149
150      /* Close. These collective operations will allow every process
151       * to catch up. */
152      if (H5Dclose(dsid) < 0 ||
153      H5Sclose(whole_spaceid) < 0 ||
154      H5Sclose(slice_spaceid) < 0 ||
155      H5Pclose(fapl_id) < 0 ||
156      H5Fclose(fileid) < 0)
157  ERR;
158
159#ifdef USE_MPE
160      MPE_Log_event(e_close, 0, "end close file");
161#endif /* USE_MPE */
162
163      /* Open the file. */
164      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
165      if (H5Pset_fapl_mpio(fapl_idMPI_COMM_WORLDMPI_INFO_NULL) < 0) ERR;
166
167
168      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
169      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
170
171      /* Create a space to deal with one slice in memory. */
172      dims[0] = SC1;
173      if ((slice_spaceid = H5Screate_simple(NDIMSdimsNULL)) < 0) ERR;
174
175      /* Open the dataset. */
176      if ((dsid = H5Dopen(fileidVAR_NAME)) < 0) ERR;
177      if ((whole_spaceid1 = H5Dget_space(dsid)) < 0) ERR;
178
179      ftime = MPI_Wtime();
180
181      /* Read the data, a slice at a time. */
182      for (s = 0; s < num_stepss++)
183      {
184  /* Select hyperslab for read of one slice. */
185  start[0] = s * SC1 * p + my_rank * SC1;
186  count[0] = SC1;
187  if (H5Sselect_hyperslab(whole_spaceid1H5S_SELECT_SET,
188  startNULLcountNULL) < 0)
189  {
190     ERR;
191     return 2;
192  }
193
194  if (H5Dread(dsidH5T_NATIVE_INTslice_spaceidwhole_spaceid1,
195  H5P_DEFAULTdata_in) < 0)
196  {
197     ERR;
198     return 2;
199  }
200
201/*   /\* Check the slice of data. *\/ */
202/*   for (i = 0; i < SC1; i++) */
203/*      if (data[i] != data_in[i])  */
204/*      { */
205/*         ERR; */
206/*         return 2; */
207/*      } */
208      }
209      read_us = (MPI_Wtime() - ftime) * MILLION;
210      MPI_Reduce(&read_us, &max_read_us, 1, MPI_INTMPI_MAX, 0, MPI_COMM_WORLD);
211      if (!my_rank)
212      {
213  read_rate = (float)(DIM2_LEN * sizeof(int))/(float)max_read_us;
214  printf(", read_rate=%g\n", read_rate);
215      }
216
217      /* Close down. */
218      if (H5Dclose(dsid) < 0 ||
219      H5Sclose(slice_spaceid) < 0 ||
220      H5Sclose(whole_spaceid1) < 0 ||
221      H5Pclose(fapl_id) < 0 ||
222      H5Fclose(fileid) < 0)
223  ERR;
224   }
225   if (!my_rank)
226      SUMMARIZE_ERR;
227
228   MPI_Finalize();
229
230   if (!my_rank)
231      FINAL_RESULTS;
232   return 0;
233}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed