47
47
#define TAG_VAR_INFO 22
48
48
49
49
#define MAX_VARIABLES 100
50
+ #define MAX_DIMS 10
50
51
51
52
typedef struct {
52
53
hid_t file_id ;
@@ -55,6 +56,7 @@ typedef struct {
55
56
hid_t var_id ;
56
57
char varname [NC_MAX_NAME + 1 ];
57
58
size_t refcount ;
59
+ hsize_t chunk_shape [MAX_DIMS ]; // Set by get_var_info
58
60
} vars [MAX_VARIABLES ];
59
61
60
62
int total_vars ;
@@ -78,6 +80,34 @@ varid_t open_variable_async(
78
80
return out ;
79
81
}
80
82
83
+ // Get a dataspace, making sure it can fit the field
84
+ hid_t get_resized_space (async_state_t * state , int idx , int ndims , hsize_t offset [], hsize_t shape []) {
85
+ hid_t data_space = H5Dget_space (state -> vars [idx ].var_id );
86
+ H5ERR (data_space );
87
+
88
+ // Check if we need to extend the dataset
89
+ hsize_t file_size [ndims ];
90
+ hsize_t max_size [ndims ];
91
+ H5ERR (H5Sget_simple_extent_dims (data_space , file_size , max_size ));
92
+ bool needs_resize = false;
93
+ for (int d = 0 ;d < ndims ;++ d ) {
94
+ if (offset [d ] + shape [d ] > file_size [d ]) {
95
+ needs_resize = true;
96
+ file_size [d ] = offset [d ] + shape [d ];
97
+ if ((max_size [d ] != H5S_UNLIMITED ) && (file_size [d ] > max_size [d ])) {
98
+ file_size [d ] = max_size [d ];
99
+ }
100
+ }
101
+ }
102
+ if (needs_resize ) {
103
+ H5ERR (H5Dset_extent (state -> vars [idx ].var_id , file_size ));
104
+ // Re-open
105
+ data_space = H5Dget_space (state -> vars [idx ].var_id );
106
+ H5ERR (data_space );
107
+ }
108
+ return data_space ;
109
+ }
110
+
81
111
void close_variable_async (
82
112
varid_t varid ,
83
113
int async_writer_rank
@@ -172,6 +202,7 @@ void receive_variable_info_async(
172
202
H5ERR (plist );
173
203
174
204
H5ERR (H5Pget_chunk (plist , ndims , varinfo + 0 ));
205
+ H5ERR (H5Pget_chunk (plist , ndims , state -> vars [idx ].chunk_shape ));
175
206
176
207
int nfilters = H5Pget_nfilters (plist );
177
208
H5ERR (nfilters );
@@ -317,8 +348,8 @@ static size_t receive_write_uncompressed_async(
317
348
hid_t mem_space = H5Screate_simple (ndims , shape , NULL );
318
349
H5ERR (mem_space );
319
350
320
- hid_t data_space = H5Dget_space (state -> vars [ idx ]. var_id );
321
- H5ERR ( data_space );
351
+ hid_t data_space = get_resized_space (state , idx , ndims , offset , shape );
352
+
322
353
H5ERR (H5Sselect_hyperslab (data_space , H5S_SELECT_SET ,
323
354
offset , NULL , shape , NULL ));
324
355
@@ -419,6 +450,9 @@ static size_t receive_write_chunk_async(
419
450
hsize_t offset_ [ndims ];
420
451
for (size_t d = 0 ; d < ndims ; ++ d ) {offset_ [d ] = offset [d ];}
421
452
453
+ hid_t data_space = get_resized_space (state , idx , ndims , offset_ , state -> vars [idx ].chunk_shape );
454
+ H5ERR (H5Sclose (data_space ));
455
+
422
456
int err = (H5DOwrite_chunk (state -> vars [idx ].var_id , H5P_DEFAULT , filter_mask ,
423
457
offset_ , buffer_size , buffer ));
424
458
if (err < 0 ) {
@@ -509,9 +543,8 @@ static void receive_close_variable_async(
509
543
void close_async (
510
544
int async_writer_rank
511
545
) {
512
- int buffer = 0 ;
513
546
log_message (LOG_DEBUG , "SEND close file" );
514
- MPI_Send (& buffer , 1 , MPI_INT , async_writer_rank , TAG_CLOSE , MPI_COMM_WORLD );
547
+ MPI_Send (NULL , 0 , MPI_INT , async_writer_rank , TAG_CLOSE , MPI_COMM_WORLD );
515
548
}
516
549
517
550
// Async runner to accept writes
@@ -545,19 +578,28 @@ size_t run_async_writer(
545
578
receive_variable_info_async (& state , status );
546
579
break ;
547
580
case (TAG_WRITE_CHUNK ):
548
- receive_write_chunk_async (& state , status );
581
+ total_size += receive_write_chunk_async (& state , status );
549
582
break ;
550
583
case (TAG_WRITE_FILTER ):
551
- receive_write_uncompressed_async (& state , status );
584
+ total_size += receive_write_uncompressed_async (& state , status );
552
585
break ;
553
586
case (TAG_CLOSE_VARIABLE ):
554
587
receive_close_variable_async (& state , status );
555
588
break ;
556
589
case (TAG_CLOSE ):
557
590
-- open_senders ;
591
+ MPI_Recv (NULL , 0 , MPI_INT , status .MPI_SOURCE , TAG_CLOSE , MPI_COMM_WORLD ,
592
+ MPI_STATUS_IGNORE );
558
593
break ;
559
594
}
560
595
}
596
+
597
+ for (int v = 0 ; v < state .total_vars ; ++ v ) {
598
+ H5ERR (H5Dclose (state .vars [v ].var_id ));
599
+ }
600
+
561
601
H5ERR (H5Fclose (state .file_id ));
562
602
log_message (LOG_DEBUG , "DONE run_async_writer" );
603
+
604
+ return total_size ;
563
605
}
0 commit comments