17 #include <sys/types.h> 25 #include "sion_debug.h" 26 #include "sion_internal.h" 28 #include "sion_filedesc.h" 29 #include "sion_tools.h" 31 #include "sion_file.h" 32 #include "sion_hints.h" 34 #include "sion_internal_startptr.h" 35 #include "sion_internal_collstat.h" 39 #define DFUNCTION "_sion_calculate_set_alignment" 40 sion_int64 _sion_calculate_set_alignment(
_sion_filedesc *sion_filedesc,
int t) {
41 sion_int64 lsize=SION_SIZE_NOT_VALID;
52 DPRINTFP((2048, DFUNCTION, _SION_DEFAULT_RANK,
"old file version (<=3) task=%d lsize=%ld\n", t, (
long) lsize));
54 if (sion_filedesc->
mode==SION_FILEMODE_WRITE) {
60 DPRINTFP((2048, DFUNCTION, _SION_DEFAULT_RANK,
"new file version (>3) task=%d lsize=%ld, WRITE chunksize set\n", t, (
long) lsize));
63 DPRINTFP((2048, DFUNCTION, _SION_DEFAULT_RANK,
"new file version (>3) task=%d lsize=%ld, READ no align\n", t, (
long) lsize));
77 #define DFUNCTION "_sion_get_size_metadatablock1" 80 int rc = SION_SIZE_NOT_VALID;
84 firstsize = strlen(
SION_ID) + 8 *
sizeof(sion_int32)
86 + SION_FILENAME_LENGTH
87 + sion_filedesc->
ntasks *
sizeof(sion_int64) + sion_filedesc->
ntasks *
sizeof(sion_int64)
88 +
sizeof(sion_int32) + 3 *
sizeof(sion_int64);
101 #define DFUNCTION "_sion_calculate_startpointers" 102 int _sion_calculate_startpointers(
_sion_filedesc *sion_filedesc )
105 int rc = SION_SUCCESS;
109 DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
112 firstsize=_sion_get_size_metadatablock1(sion_filedesc);
114 #ifdef WFLARGEMETABLOCK 115 if (firstsize<4*1024*1024) firstsize=4*1024*1024;
118 DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d\n", firstsize));
125 DPRINTFP((2048, DFUNCTION, _SION_DEFAULT_RANK,
" startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld\n",
128 for (i = 1; i < sion_filedesc->
ntasks; i++) {
130 lsize=_sion_calculate_set_alignment(sion_filedesc,i-1);
136 DPRINTFP((2048, DFUNCTION, _SION_DEFAULT_RANK,
" startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld chunksizes[%2d]=%8lld\n",
140 lsize=_sion_calculate_set_alignment(sion_filedesc,sion_filedesc->
ntasks - 1);
143 DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK,
"leave globalskip is %lld\n", sion_filedesc->
globalskip));
156 #define DFUNCTION "_sion_calculate_num_collector" 158 int rc = SION_SUCCESS;
159 int max_num_collectors;
163 max_num_collectors = (int) (collstat->gsize/sion_filedesc->
fsblksize);
164 if(collstat->gsize%sion_filedesc->
fsblksize>0) max_num_collectors++;
165 DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK,
"max_num_collectors=%d\n", max_num_collectors));
169 *num_collectors = (int) (sion_filedesc->
ntasks/sion_filedesc->
collsize);
170 if(sion_filedesc->
ntasks%sion_filedesc->
collsize>0) (*num_collectors)++;
173 if(*num_collectors > max_num_collectors) *num_collectors=max_num_collectors;
175 DPRINTFP((32, DFUNCTION, _SION_DEFAULT_RANK,
"user given collsize %d -> set num_collectors to %d\n",
176 sion_filedesc->
collsize,*num_collectors));
180 *num_collectors = max_num_collectors;
183 if(*num_collectors>sion_filedesc->
ntasks) *num_collectors=sion_filedesc->
ntasks;
186 if ((sion_filedesc->
ntasks>=512) && (*num_collectors>32)) *num_collectors=32;
187 else if((sion_filedesc->
ntasks>=256) && (*num_collectors>16)) *num_collectors=16;
188 else if((sion_filedesc->
ntasks>=128) && (*num_collectors>8)) *num_collectors=8;
189 else if((sion_filedesc->
ntasks>=64) && (*num_collectors>8)) *num_collectors=8;
190 else if((sion_filedesc->
ntasks>=32) && (*num_collectors>8)) *num_collectors=8;
191 else if((sion_filedesc->
ntasks>=16) && (*num_collectors>4)) *num_collectors=4;
195 DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK,
"SIONlib heuristic collsize=%d num_collectors=%d\n",
196 sion_filedesc->
collsize, *num_collectors));
200 collstat->avg_data_per_collector = (
201 (sion_int64) (collstat->gsize / *num_collectors)
206 if((collstat->gsize / *num_collectors)%sion_filedesc->
fsblksize>0) collstat->avg_data_per_collector+=sion_filedesc->
fsblksize;
207 DPRINTFP((32, DFUNCTION, _SION_DEFAULT_RANK,
"avg_data_per_collectors=%ld\n",(
long) collstat->avg_data_per_collector));
220 #define DFUNCTION "_sion_calculate_startpointers_collective" 221 int _sion_calculate_startpointers_collective(
_sion_filedesc *sion_filedesc )
224 int rc = SION_SUCCESS;
225 int i, firstsize, num_collectors, numsender, lastcoll, s;
227 sion_int64 currentsize, aligned_size, startpointer;
230 DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
234 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
235 "_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"));
239 collstat=_sion_create_and_init_collstat(sion_filedesc);
242 collstat->firstsize=firstsize=_sion_get_size_metadatablock1(sion_filedesc);
243 _sion_calculate_num_collector(sion_filedesc, collstat, &num_collectors);
244 collstat->req_num_collectors=num_collectors;
246 DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d collsize=%d num_collectors=%d\n",
247 firstsize, sion_filedesc->
collsize, num_collectors));
249 numsender=1;lastcoll=0;
253 for (i = 1; i < sion_filedesc->
ntasks; i++) {
254 if( (currentsize+sion_filedesc->
all_chunksizes[i]<=collstat->avg_data_per_collector) ||
262 for(s=lastcoll;s<i;s++) {
268 if (sion_filedesc->
mode==SION_FILEMODE_WRITE) {
269 aligned_size = ((sion_int64) currentsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
272 DPRINTFP((128, DFUNCTION, _SION_DEFAULT_RANK,
" align chunksizes[%2d]=%8lld + %lld\n",
273 i-1, sion_filedesc->
all_chunksizes[i-1], aligned_size-currentsize));
279 numsender = 1; lastcoll= i; currentsize = sion_filedesc->
all_chunksizes[i];
284 if (sion_filedesc->
mode==SION_FILEMODE_WRITE) {
285 aligned_size = ((sion_int64) currentsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
287 DPRINTFP((128, DFUNCTION, _SION_DEFAULT_RANK,
" align chunksizes[%2d]=%8lld + %lld\n",
293 for(s=lastcoll;s<sion_filedesc->
ntasks;s++) {
302 startpointer = (firstsize % sion_filedesc->
fsblksize == 0) ? firstsize : ((firstsize / sion_filedesc->
fsblksize) + 1) * sion_filedesc->
fsblksize;
305 for (i = 0; i < sion_filedesc->
ntasks; i++) {
313 _sion_update_collstat(collstat,sion_filedesc);
314 _sion_print_collstat(collstat, sion_filedesc);
317 _sion_debugprint_collstat(collstat, sion_filedesc);
319 _sion_destroy_collstat(collstat);
321 DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK,
"leave globalskip is %lld\n", sion_filedesc->
globalskip));
333 #define DFUNCTION "_sion_calculate_startpointers_collective_merge" 334 int _sion_calculate_startpointers_collective_merge(
_sion_filedesc *sion_filedesc )
337 int rc = SION_SUCCESS;
338 int i, firstsize, num_collectors, numsender, lastcoll, s;
340 sion_int64 currentsize, newsize, aligned_size, startpointer;
343 DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
347 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
348 "_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"));
352 collstat=_sion_create_and_init_collstat(sion_filedesc);
355 collstat->firstsize=firstsize=_sion_get_size_metadatablock1(sion_filedesc);
356 _sion_calculate_num_collector(sion_filedesc, collstat, &num_collectors);
357 collstat->req_num_collectors=num_collectors;
359 DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d collsize=%d num_collectors=%d\n",
360 firstsize, sion_filedesc->
collsize, num_collectors));
362 numsender=1;lastcoll=0;
365 DPRINTFP((128, DFUNCTION, _SION_DEFAULT_RANK,
" currentsize=%lld chunksizes[%2d]=%8lld\n",
369 for (i = 1; i < sion_filedesc->
ntasks; i++) {
370 if( (currentsize+sion_filedesc->
all_chunksizes[i]<=collstat->avg_data_per_collector) ||
375 DPRINTFP((128, DFUNCTION, _SION_DEFAULT_RANK,
" currentsize=%lld chunksizes[%2d]=%8lld\n",
381 if (sion_filedesc->
mode==SION_FILEMODE_WRITE) {
385 aligned_size = ((sion_int64) newsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
388 DPRINTFP((128, DFUNCTION, _SION_DEFAULT_RANK,
" resize chunksizes[%2d]=%8lld + %lld\n",
392 for(s=lastcoll+1;s<i;s++) {
396 _sion_calculate_set_alignment(sion_filedesc,s);
405 for(s=lastcoll;s<i;s++) {
411 numsender = 1; lastcoll= i; currentsize = sion_filedesc->
all_chunksizes[i];
416 if (sion_filedesc->
mode==SION_FILEMODE_WRITE) {
420 aligned_size = ((sion_int64) newsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
423 DPRINTFP((128, DFUNCTION, _SION_DEFAULT_RANK,
" resize chunksizes[%2d]=%8lld + %lld\n",
428 for(s=lastcoll+1;s<i;s++) {
434 for(s=lastcoll;s<sion_filedesc->
ntasks;s++) {
443 startpointer = (firstsize % sion_filedesc->
fsblksize == 0) ? firstsize : ((firstsize / sion_filedesc->
fsblksize) + 1) * sion_filedesc->
fsblksize;
446 for (i = 0; i < sion_filedesc->
ntasks; i++) {
454 _sion_update_collstat(collstat,sion_filedesc);
455 _sion_print_collstat(collstat, sion_filedesc);
458 _sion_debugprint_collstat(collstat, sion_filedesc);
460 _sion_destroy_collstat(collstat);
462 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
sion_int64 * all_startpointers
sion_int64 * all_chunksizes
sion_int32 * all_coll_collsize