@@ -71,32 +71,47 @@ append_h5_data(bench_params params, time_step *ts, hid_t loc, hid_t *dset_ids, h
7171
7272 dapl = H5Pcreate (H5P_DATASET_ACCESS );
7373
74- int * data_1D_INT , * * data_2D_INT , * * * data_3D_INT ;
75- float * data_1D_FLOAT , * * data_2D_FLOAT , * * * data_3D_FLOAT ;
74+ int * data_1D_INT = NULL , * * data_2D_INT = NULL , * * * data_3D_INT = NULL ;
75+ float * data_1D_FLOAT = NULL , * * data_2D_FLOAT = NULL , * * * data_3D_FLOAT = NULL ;
76+
77+ /* H5Dwrite expects a single contiguous buffer for multi-dimensional
78+ * datasets. Back the 2D/3D row/plane pointers with one contiguous
79+ * allocation per type so the row indexing in the fill loops still
80+ * works while H5Dwrite reads from real contiguous memory. */
81+ int * data_2D_INT_buf = NULL , * data_3D_INT_buf = NULL ;
82+ float * data_2D_FLOAT_buf = NULL , * data_3D_FLOAT_buf = NULL ;
83+ int * * data_3D_INT_planes = NULL ;
84+ float * * data_3D_FLOAT_planes = NULL ;
7685
7786 if (params .num_dims == 1 ) {
7887 H5B_MALLOC (data_1D_INT , params .dim_1 * sizeof (int ));
7988 H5B_MALLOC (data_1D_FLOAT , params .dim_1 * sizeof (float ));
8089 }
8190
8291 if (params .num_dims == 2 ) {
92+ H5B_MALLOC (data_2D_INT_buf , params .dim_1 * params .dim_2 * sizeof (int ));
93+ H5B_MALLOC (data_2D_FLOAT_buf , params .dim_1 * params .dim_2 * sizeof (float ));
8394 H5B_MALLOC (data_2D_INT , params .dim_1 * sizeof (int * ));
8495 H5B_MALLOC (data_2D_FLOAT , params .dim_1 * sizeof (float * ));
8596 for (int i = 0 ; i < params .dim_1 ; i ++ ) {
86- H5B_MALLOC ( data_2D_INT [i ], params . dim_2 * sizeof ( int )) ;
87- H5B_MALLOC ( data_2D_FLOAT [i ], params . dim_2 * sizeof ( float )) ;
97+ data_2D_INT [i ] = data_2D_INT_buf + i * params . dim_2 ;
98+ data_2D_FLOAT [i ] = data_2D_FLOAT_buf + i * params . dim_2 ;
8899 }
89100 }
90101
91102 if (params .num_dims == 3 ) {
103+ H5B_MALLOC (data_3D_INT_buf , params .dim_1 * params .dim_2 * params .dim_3 * sizeof (int ));
104+ H5B_MALLOC (data_3D_FLOAT_buf , params .dim_1 * params .dim_2 * params .dim_3 * sizeof (float ));
105+ H5B_MALLOC (data_3D_INT_planes , params .dim_1 * params .dim_2 * sizeof (int * ));
106+ H5B_MALLOC (data_3D_FLOAT_planes , params .dim_1 * params .dim_2 * sizeof (float * ));
92107 H5B_MALLOC (data_3D_INT , params .dim_1 * sizeof (int * * ));
93108 H5B_MALLOC (data_3D_FLOAT , params .dim_1 * sizeof (float * * ));
94109 for (int i = 0 ; i < params .dim_1 ; i ++ ) {
95- H5B_MALLOC ( data_3D_INT [i ], params . dim_2 * sizeof ( int * )) ;
96- H5B_MALLOC ( data_3D_FLOAT [i ], params . dim_2 * sizeof ( float * )) ;
110+ data_3D_INT [i ] = data_3D_INT_planes + i * params . dim_2 ;
111+ data_3D_FLOAT [i ] = data_3D_FLOAT_planes + i * params . dim_2 ;
97112 for (int j = 0 ; j < params .dim_2 ; j ++ ) {
98- H5B_MALLOC ( data_3D_INT [i ][j ], params .dim_3 * sizeof ( int )) ;
99- H5B_MALLOC ( data_3D_FLOAT [i ][j ], params .dim_3 * sizeof ( float )) ;
113+ data_3D_INT [i ][j ] = data_3D_INT_buf + ( i * params .dim_2 + j ) * params . dim_3 ;
114+ data_3D_FLOAT [i ][j ] = data_3D_FLOAT_buf + ( i * params .dim_2 + j ) * params . dim_3 ;
100115 }
101116 }
102117 }
@@ -199,25 +214,25 @@ append_h5_data(bench_params params, time_step *ts, hid_t loc, hid_t *dset_ids, h
199214 break ;
200215
201216 case CONTIG_2D :
202- H5Dwrite (dset_ids [0 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT );
203- H5Dwrite (dset_ids [1 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT );
204- H5Dwrite (dset_ids [2 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT );
205- H5Dwrite (dset_ids [3 ], H5T_NATIVE_INT , memspace , filespace , dapl , data_2D_INT );
206- H5Dwrite (dset_ids [4 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT );
207- H5Dwrite (dset_ids [5 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT );
208- H5Dwrite (dset_ids [6 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT );
209- H5Dwrite (dset_ids [7 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT );
217+ H5Dwrite (dset_ids [0 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT_buf );
218+ H5Dwrite (dset_ids [1 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT_buf );
219+ H5Dwrite (dset_ids [2 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT_buf );
220+ H5Dwrite (dset_ids [3 ], H5T_NATIVE_INT , memspace , filespace , dapl , data_2D_INT_buf );
221+ H5Dwrite (dset_ids [4 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT_buf );
222+ H5Dwrite (dset_ids [5 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT_buf );
223+ H5Dwrite (dset_ids [6 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT_buf );
224+ H5Dwrite (dset_ids [7 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_2D_FLOAT_buf );
210225 break ;
211226
212227 case CONTIG_3D :
213- H5Dwrite (dset_ids [0 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT );
214- H5Dwrite (dset_ids [1 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT );
215- H5Dwrite (dset_ids [2 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT );
216- H5Dwrite (dset_ids [3 ], H5T_NATIVE_INT , memspace , filespace , dapl , data_3D_INT );
217- H5Dwrite (dset_ids [4 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT );
218- H5Dwrite (dset_ids [5 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT );
219- H5Dwrite (dset_ids [6 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT );
220- H5Dwrite (dset_ids [7 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT );
228+ H5Dwrite (dset_ids [0 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT_buf );
229+ H5Dwrite (dset_ids [1 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT_buf );
230+ H5Dwrite (dset_ids [2 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT_buf );
231+ H5Dwrite (dset_ids [3 ], H5T_NATIVE_INT , memspace , filespace , dapl , data_3D_INT_buf );
232+ H5Dwrite (dset_ids [4 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT_buf );
233+ H5Dwrite (dset_ids [5 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT_buf );
234+ H5Dwrite (dset_ids [6 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT_buf );
235+ H5Dwrite (dset_ids [7 ], H5T_NATIVE_FLOAT , memspace , filespace , dapl , data_3D_FLOAT_buf );
221236 break ;
222237 default :
223238 printf ("Unknown read pattern\n" );
@@ -239,25 +254,19 @@ append_h5_data(bench_params params, time_step *ts, hid_t loc, hid_t *dset_ids, h
239254 }
240255
241256 if (params .num_dims == 2 ) {
242- for (int i = 0 ; i < params .dim_1 ; i ++ ) {
243- free (data_2D_INT [i ]);
244- free (data_2D_FLOAT [i ]);
245- }
246257 free (data_2D_INT );
247258 free (data_2D_FLOAT );
259+ free (data_2D_INT_buf );
260+ free (data_2D_FLOAT_buf );
248261 }
249262
250263 if (params .num_dims == 3 ) {
251- for (int i = 0 ; i < params .dim_1 ; i ++ ) {
252- for (int j = 0 ; j < params .dim_2 ; j ++ ) {
253- free (data_3D_INT [i ][j ]);
254- free (data_3D_FLOAT [i ][j ]);
255- }
256- free (data_3D_INT [i ]);
257- free (data_3D_FLOAT [i ]);
258- }
259264 free (data_3D_INT );
260265 free (data_3D_FLOAT );
266+ free (data_3D_INT_planes );
267+ free (data_3D_FLOAT_planes );
268+ free (data_3D_INT_buf );
269+ free (data_3D_FLOAT_buf );
261270 }
262271}
263272
0 commit comments