22 #include <sys/types.h> 31 #include "sion_error_handler.h" 38 #include "sion_hints.h" 45 #define DFUNCTION "_sion_calculate_set_alignment" 46 sion_int64 _sion_calculate_set_alignment(
_sion_filedesc *sion_filedesc,
int t) {
47 sion_int64 lsize=SION_SIZE_NOT_VALID;
58 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
"old file version (<=3) task=%d lsize=%ld\n", t, (
long) lsize));
66 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
"new file version (>3) task=%d lsize=%ld, WRITE chunksize set\n", t, (
long) lsize));
69 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
"new file version (>3) task=%d lsize=%ld, READ no align\n", t, (
long) lsize));
83 #define DFUNCTION "_sion_get_size_metadatablock1" 90 firstsize = strlen(
SION_ID) + 8 *
sizeof(sion_int32)
92 + SION_FILENAME_LENGTH
93 + sion_filedesc->
ntasks *
sizeof(sion_int64) + sion_filedesc->
ntasks *
sizeof(sion_int64)
94 +
sizeof(sion_int32) + 3 *
sizeof(sion_int64);
107 #define DFUNCTION "_sion_calculate_startpointers" 108 int _sion_calculate_startpointers(
_sion_filedesc *sion_filedesc )
111 int rc = SION_SUCCESS;
115 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
118 firstsize=_sion_get_size_metadatablock1(sion_filedesc);
120 #ifdef WFLARGEMETABLOCK 121 if (firstsize<4*1024*1024) firstsize=4*1024*1024;
124 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d\n", firstsize));
131 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
" startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld\n",
134 for (i = 1; i < sion_filedesc->
ntasks; i++) {
136 lsize=_sion_calculate_set_alignment(sion_filedesc,i-1);
142 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
" startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld chunksizes[%2d]=%8lld\n",
146 lsize=_sion_calculate_set_alignment(sion_filedesc,sion_filedesc->
ntasks - 1);
149 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"leave globalskip is %lld\n", sion_filedesc->
globalskip));
162 #define DFUNCTION "_sion_calculate_num_collector" 164 int rc = SION_SUCCESS;
165 int max_num_collectors;
169 max_num_collectors = (int) (collstat->gsize/sion_filedesc->
fsblksize);
170 if(collstat->gsize%sion_filedesc->
fsblksize>0) max_num_collectors++;
171 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"max_num_collectors=%d\n", max_num_collectors));
175 *num_collectors = (int) (sion_filedesc->
ntasks/sion_filedesc->
collsize);
176 if(sion_filedesc->
ntasks%sion_filedesc->
collsize>0) (*num_collectors)++;
179 if(*num_collectors > max_num_collectors) *num_collectors=max_num_collectors;
181 DPRINTFP((32,
DFUNCTION, _SION_DEFAULT_RANK,
"user given collsize %d -> set num_collectors to %d\n",
182 sion_filedesc->
collsize,*num_collectors));
186 *num_collectors = max_num_collectors;
189 if(*num_collectors>sion_filedesc->
ntasks) *num_collectors=sion_filedesc->
ntasks;
192 if ((sion_filedesc->
ntasks>=512) && (*num_collectors>32)) *num_collectors=32;
193 else if((sion_filedesc->
ntasks>=256) && (*num_collectors>16)) *num_collectors=16;
194 else if((sion_filedesc->
ntasks>=128) && (*num_collectors>8)) *num_collectors=8;
195 else if((sion_filedesc->
ntasks>=64) && (*num_collectors>8)) *num_collectors=8;
196 else if((sion_filedesc->
ntasks>=32) && (*num_collectors>8)) *num_collectors=8;
197 else if((sion_filedesc->
ntasks>=16) && (*num_collectors>4)) *num_collectors=4;
201 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"SIONlib heuristic collsize=%d num_collectors=%d\n",
202 sion_filedesc->
collsize, *num_collectors));
206 collstat->avg_data_per_collector = (
207 (sion_int64) (collstat->gsize / *num_collectors)
212 if((collstat->gsize / *num_collectors)%sion_filedesc->
fsblksize>0) collstat->avg_data_per_collector+=sion_filedesc->
fsblksize;
213 DPRINTFP((32,
DFUNCTION, _SION_DEFAULT_RANK,
"avg_data_per_collectors=%ld\n",(
long) collstat->avg_data_per_collector));
226 #define DFUNCTION "_sion_calculate_startpointers_collective" 227 int _sion_calculate_startpointers_collective(
_sion_filedesc *sion_filedesc )
230 int rc = SION_SUCCESS;
231 int i, firstsize, num_collectors, numsender, lastcoll, s;
233 sion_int64 currentsize, aligned_size, startpointer;
236 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
240 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
241 "_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"));
245 collstat=_sion_create_and_init_collstat(sion_filedesc);
248 collstat->firstsize=firstsize=_sion_get_size_metadatablock1(sion_filedesc);
249 _sion_calculate_num_collector(sion_filedesc, collstat, &num_collectors);
250 collstat->req_num_collectors=num_collectors;
252 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d collsize=%d num_collectors=%d\n",
253 firstsize, sion_filedesc->
collsize, num_collectors));
255 numsender=1;lastcoll=0;
259 for (i = 1; i < sion_filedesc->
ntasks; i++) {
260 if( (currentsize+sion_filedesc->
all_chunksizes[i]<=collstat->avg_data_per_collector) ||
268 for(s=lastcoll;s<i;s++) {
275 aligned_size = ((sion_int64) currentsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
278 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" align chunksizes[%2d]=%8lld + %lld\n",
279 i-1, sion_filedesc->
all_chunksizes[i-1], aligned_size-currentsize));
285 numsender = 1; lastcoll= i; currentsize = sion_filedesc->
all_chunksizes[i];
291 aligned_size = ((sion_int64) currentsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
293 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" align chunksizes[%2d]=%8lld + %lld\n",
299 for(s=lastcoll;s<sion_filedesc->
ntasks;s++) {
308 startpointer = (firstsize % sion_filedesc->
fsblksize == 0) ? firstsize : ((firstsize / sion_filedesc->
fsblksize) + 1) * sion_filedesc->
fsblksize;
311 for (i = 0; i < sion_filedesc->
ntasks; i++) {
319 _sion_update_collstat(collstat,sion_filedesc);
320 _sion_print_collstat(collstat, sion_filedesc);
323 _sion_debugprint_collstat(collstat, sion_filedesc);
325 _sion_destroy_collstat(collstat);
327 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"leave globalskip is %lld\n", sion_filedesc->
globalskip));
339 #define DFUNCTION "_sion_calculate_startpointers_collective_merge" 340 int _sion_calculate_startpointers_collective_merge(
_sion_filedesc *sion_filedesc )
343 int rc = SION_SUCCESS;
344 int i, firstsize, num_collectors, numsender, lastcoll, s;
346 sion_int64 currentsize, newsize, aligned_size, startpointer;
349 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
353 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
354 "_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"));
358 collstat=_sion_create_and_init_collstat(sion_filedesc);
361 collstat->firstsize=firstsize=_sion_get_size_metadatablock1(sion_filedesc);
362 _sion_calculate_num_collector(sion_filedesc, collstat, &num_collectors);
363 collstat->req_num_collectors=num_collectors;
365 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d collsize=%d num_collectors=%d\n",
366 firstsize, sion_filedesc->
collsize, num_collectors));
368 numsender=1;lastcoll=0;
371 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" currentsize=%lld chunksizes[%2d]=%8lld\n",
375 for (i = 1; i < sion_filedesc->
ntasks; i++) {
376 if( (currentsize+sion_filedesc->
all_chunksizes[i]<=collstat->avg_data_per_collector) ||
381 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" currentsize=%lld chunksizes[%2d]=%8lld\n",
391 aligned_size = ((sion_int64) newsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
394 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" resize chunksizes[%2d]=%8lld + %lld\n",
398 for(s=lastcoll+1;s<i;s++) {
402 _sion_calculate_set_alignment(sion_filedesc,s);
411 for(s=lastcoll;s<i;s++) {
417 numsender = 1; lastcoll= i; currentsize = sion_filedesc->
all_chunksizes[i];
426 aligned_size = ((sion_int64) newsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
429 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" resize chunksizes[%2d]=%8lld + %lld\n",
434 for(s=lastcoll+1;s<i;s++) {
438 _sion_calculate_set_alignment(sion_filedesc,s);
446 for(s=lastcoll;s<sion_filedesc->
ntasks;s++) {
455 startpointer = (firstsize % sion_filedesc->
fsblksize == 0) ? firstsize : ((firstsize / sion_filedesc->
fsblksize) + 1) * sion_filedesc->
fsblksize;
458 for (i = 0; i < sion_filedesc->
ntasks; i++) {
466 _sion_update_collstat(collstat,sion_filedesc);
467 _sion_print_collstat(collstat, sion_filedesc);
470 _sion_debugprint_collstat(collstat, sion_filedesc);
472 _sion_destroy_collstat(collstat);
474 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