14 #define _XOPEN_SOURCE 700 24 #include <sys/types.h> 33 #include "sion_error_handler.h" 40 #include "sion_hints.h" 47 #define DFUNCTION "_sion_calculate_set_alignment" 48 sion_int64 _sion_calculate_set_alignment(
_sion_filedesc *sion_filedesc,
int t) {
49 sion_int64 lsize=SION_SIZE_NOT_VALID;
60 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
"old file version (<=3) task=%d lsize=%ld\n", t, (
long) lsize));
68 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
"new file version (>3) task=%d lsize=%ld, WRITE chunksize set\n", t, (
long) lsize));
71 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
"new file version (>3) task=%d lsize=%ld, READ no align\n", t, (
long) lsize));
85 #define DFUNCTION "_sion_get_size_metadatablock1" 92 firstsize = strlen(
SION_ID) + 8 *
sizeof(sion_int32)
94 + SION_FILENAME_LENGTH
95 + sion_filedesc->
ntasks *
sizeof(sion_int64) + sion_filedesc->
ntasks *
sizeof(sion_int64)
96 +
sizeof(sion_int32) + 3 *
sizeof(sion_int64);
109 #define DFUNCTION "_sion_calculate_startpointers" 110 int _sion_calculate_startpointers(
_sion_filedesc *sion_filedesc )
113 int rc = SION_SUCCESS;
117 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
120 firstsize=_sion_get_size_metadatablock1(sion_filedesc);
122 #ifdef WFLARGEMETABLOCK 123 if (firstsize<4*1024*1024) firstsize=4*1024*1024;
126 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d\n", firstsize));
133 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
" startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld\n",
136 for (i = 1; i < sion_filedesc->
ntasks; i++) {
138 lsize=_sion_calculate_set_alignment(sion_filedesc,i-1);
144 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
" startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld chunksizes[%2d]=%8lld\n",
148 lsize=_sion_calculate_set_alignment(sion_filedesc,sion_filedesc->
ntasks - 1);
151 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"leave globalskip is %lld\n", sion_filedesc->
globalskip));
164 #define DFUNCTION "_sion_calculate_num_collector" 166 int rc = SION_SUCCESS;
167 int max_num_collectors;
171 max_num_collectors = (int) (collstat->gsize/sion_filedesc->
fsblksize);
172 if(collstat->gsize%sion_filedesc->
fsblksize>0) max_num_collectors++;
173 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"max_num_collectors=%d\n", max_num_collectors));
177 *num_collectors = (int) (sion_filedesc->
ntasks/sion_filedesc->
collsize);
178 if(sion_filedesc->
ntasks%sion_filedesc->
collsize>0) (*num_collectors)++;
181 if(*num_collectors > max_num_collectors) *num_collectors=max_num_collectors;
183 DPRINTFP((32,
DFUNCTION, _SION_DEFAULT_RANK,
"user given collsize %d -> set num_collectors to %d\n",
184 sion_filedesc->
collsize,*num_collectors));
188 *num_collectors = max_num_collectors;
191 if(*num_collectors>sion_filedesc->
ntasks) *num_collectors=sion_filedesc->
ntasks;
194 if ((sion_filedesc->
ntasks>=512) && (*num_collectors>32)) *num_collectors=32;
195 else if((sion_filedesc->
ntasks>=256) && (*num_collectors>16)) *num_collectors=16;
196 else if((sion_filedesc->
ntasks>=128) && (*num_collectors>8)) *num_collectors=8;
197 else if((sion_filedesc->
ntasks>=64) && (*num_collectors>8)) *num_collectors=8;
198 else if((sion_filedesc->
ntasks>=32) && (*num_collectors>8)) *num_collectors=8;
199 else if((sion_filedesc->
ntasks>=16) && (*num_collectors>4)) *num_collectors=4;
203 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"SIONlib heuristic collsize=%d num_collectors=%d\n",
204 sion_filedesc->
collsize, *num_collectors));
208 collstat->avg_data_per_collector = (
209 (sion_int64) (collstat->gsize / *num_collectors)
214 if((collstat->gsize / *num_collectors)%sion_filedesc->
fsblksize>0) collstat->avg_data_per_collector+=sion_filedesc->
fsblksize;
215 DPRINTFP((32,
DFUNCTION, _SION_DEFAULT_RANK,
"avg_data_per_collectors=%ld\n",(
long) collstat->avg_data_per_collector));
228 #define DFUNCTION "_sion_calculate_startpointers_collective" 229 int _sion_calculate_startpointers_collective(
_sion_filedesc *sion_filedesc )
232 int rc = SION_SUCCESS;
233 int i, firstsize, num_collectors, numsender, lastcoll, s;
235 sion_int64 currentsize, aligned_size, startpointer;
238 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
242 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
243 "_sion_calculate_startpointers_collective: files with old sionlib file format (<3) can not be read by collective calls, please use standard read calls, aborting ...\n"));
247 collstat=_sion_create_and_init_collstat(sion_filedesc);
250 collstat->firstsize=firstsize=_sion_get_size_metadatablock1(sion_filedesc);
251 _sion_calculate_num_collector(sion_filedesc, collstat, &num_collectors);
252 collstat->req_num_collectors=num_collectors;
254 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d collsize=%d num_collectors=%d\n",
255 firstsize, sion_filedesc->
collsize, num_collectors));
257 numsender=1;lastcoll=0;
261 for (i = 1; i < sion_filedesc->
ntasks; i++) {
262 if( (currentsize+sion_filedesc->
all_chunksizes[i]<=collstat->avg_data_per_collector) ||
270 for(s=lastcoll;s<i;s++) {
277 aligned_size = ((sion_int64) currentsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
280 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" align chunksizes[%2d]=%8lld + %lld\n",
281 i-1, sion_filedesc->
all_chunksizes[i-1], aligned_size-currentsize));
287 numsender = 1; lastcoll= i; currentsize = sion_filedesc->
all_chunksizes[i];
293 aligned_size = ((sion_int64) currentsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
295 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" align chunksizes[%2d]=%8lld + %lld\n",
301 for(s=lastcoll;s<sion_filedesc->
ntasks;s++) {
310 startpointer = (firstsize % sion_filedesc->
fsblksize == 0) ? firstsize : ((firstsize / sion_filedesc->
fsblksize) + 1) * sion_filedesc->
fsblksize;
313 for (i = 0; i < sion_filedesc->
ntasks; i++) {
321 _sion_update_collstat(collstat,sion_filedesc);
322 _sion_print_collstat(collstat, sion_filedesc);
325 _sion_debugprint_collstat(collstat, sion_filedesc);
327 _sion_destroy_collstat(collstat);
329 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"leave globalskip is %lld\n", sion_filedesc->
globalskip));
341 #define DFUNCTION "_sion_calculate_startpointers_collective_merge" 342 int _sion_calculate_startpointers_collective_merge(
_sion_filedesc *sion_filedesc )
345 int rc = SION_SUCCESS;
346 int i, firstsize, num_collectors, numsender, lastcoll, s;
348 sion_int64 currentsize, newsize, aligned_size, startpointer;
351 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
355 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
356 "_sion_calculate_startpointers_collective: files with old sionlib file format (<3) can not be read by collective calls, please use standard read calls, aborting ...\n"));
360 collstat=_sion_create_and_init_collstat(sion_filedesc);
363 collstat->firstsize=firstsize=_sion_get_size_metadatablock1(sion_filedesc);
364 _sion_calculate_num_collector(sion_filedesc, collstat, &num_collectors);
365 collstat->req_num_collectors=num_collectors;
367 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d collsize=%d num_collectors=%d\n",
368 firstsize, sion_filedesc->
collsize, num_collectors));
370 numsender=1;lastcoll=0;
373 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" currentsize=%lld chunksizes[%2d]=%8lld\n",
377 for (i = 1; i < sion_filedesc->
ntasks; i++) {
378 if( (currentsize+sion_filedesc->
all_chunksizes[i]<=collstat->avg_data_per_collector) ||
383 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" currentsize=%lld chunksizes[%2d]=%8lld\n",
393 aligned_size = ((sion_int64) newsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
396 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" resize chunksizes[%2d]=%8lld + %lld\n",
400 for(s=lastcoll+1;s<i;s++) {
404 _sion_calculate_set_alignment(sion_filedesc,s);
413 for(s=lastcoll;s<i;s++) {
419 numsender = 1; lastcoll= i; currentsize = sion_filedesc->
all_chunksizes[i];
428 aligned_size = ((sion_int64) newsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
431 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" resize chunksizes[%2d]=%8lld + %lld\n",
436 for(s=lastcoll+1;s<i;s++) {
440 _sion_calculate_set_alignment(sion_filedesc,s);
448 for(s=lastcoll;s<sion_filedesc->
ntasks;s++) {
457 startpointer = (firstsize % sion_filedesc->
fsblksize == 0) ? firstsize : ((firstsize / sion_filedesc->
fsblksize) + 1) * sion_filedesc->
fsblksize;
460 for (i = 0; i < sion_filedesc->
ntasks; i++) {
468 _sion_update_collstat(collstat,sion_filedesc);
469 _sion_print_collstat(collstat, sion_filedesc);
472 _sion_debugprint_collstat(collstat, sion_filedesc);
474 _sion_destroy_collstat(collstat);
476 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"leave globalskip is %lld\n", sion_filedesc->
globalskip));
Sion File Descriptor Structure.
sion_int32 * all_coll_collector
sion_int32 * all_coll_capability
#define SION_CAPABILITY_ONLY_SENDER
sion_int64 * all_startpointers
sion_int64 * all_chunksizes
#define DFUNCTION
Calculates the size of the first meta data block.
#define SION_FILEMODE_WRITE
sion_int32 * all_coll_collsize