22 #include <sys/types.h> 37 #include "sion_hints.h" 44 #define DFUNCTION "_sion_calculate_set_alignment" 45 sion_int64 _sion_calculate_set_alignment(
_sion_filedesc *sion_filedesc,
int t) {
46 sion_int64 lsize=SION_SIZE_NOT_VALID;
57 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
"old file version (<=3) task=%d lsize=%ld\n", t, (
long) lsize));
65 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
"new file version (>3) task=%d lsize=%ld, WRITE chunksize set\n", t, (
long) lsize));
68 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
"new file version (>3) task=%d lsize=%ld, READ no align\n", t, (
long) lsize));
82 #define DFUNCTION "_sion_get_size_metadatablock1" 85 int rc = SION_SIZE_NOT_VALID;
89 firstsize = strlen(
SION_ID) + 8 *
sizeof(sion_int32)
91 + SION_FILENAME_LENGTH
92 + sion_filedesc->
ntasks *
sizeof(sion_int64) + sion_filedesc->
ntasks *
sizeof(sion_int64)
93 +
sizeof(sion_int32) + 3 *
sizeof(sion_int64);
106 #define DFUNCTION "_sion_calculate_startpointers" 107 int _sion_calculate_startpointers(
_sion_filedesc *sion_filedesc )
110 int rc = SION_SUCCESS;
114 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
117 firstsize=_sion_get_size_metadatablock1(sion_filedesc);
119 #ifdef WFLARGEMETABLOCK 120 if (firstsize<4*1024*1024) firstsize=4*1024*1024;
123 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d\n", firstsize));
130 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
" startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld\n",
133 for (i = 1; i < sion_filedesc->
ntasks; i++) {
135 lsize=_sion_calculate_set_alignment(sion_filedesc,i-1);
141 DPRINTFP((2048,
DFUNCTION, _SION_DEFAULT_RANK,
" startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld chunksizes[%2d]=%8lld\n",
145 lsize=_sion_calculate_set_alignment(sion_filedesc,sion_filedesc->
ntasks - 1);
148 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"leave globalskip is %lld\n", sion_filedesc->
globalskip));
161 #define DFUNCTION "_sion_calculate_num_collector" 163 int rc = SION_SUCCESS;
164 int max_num_collectors;
168 max_num_collectors = (int) (collstat->gsize/sion_filedesc->
fsblksize);
169 if(collstat->gsize%sion_filedesc->
fsblksize>0) max_num_collectors++;
170 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"max_num_collectors=%d\n", max_num_collectors));
174 *num_collectors = (int) (sion_filedesc->
ntasks/sion_filedesc->
collsize);
175 if(sion_filedesc->
ntasks%sion_filedesc->
collsize>0) (*num_collectors)++;
178 if(*num_collectors > max_num_collectors) *num_collectors=max_num_collectors;
180 DPRINTFP((32,
DFUNCTION, _SION_DEFAULT_RANK,
"user given collsize %d -> set num_collectors to %d\n",
181 sion_filedesc->
collsize,*num_collectors));
185 *num_collectors = max_num_collectors;
188 if(*num_collectors>sion_filedesc->
ntasks) *num_collectors=sion_filedesc->
ntasks;
191 if ((sion_filedesc->
ntasks>=512) && (*num_collectors>32)) *num_collectors=32;
192 else if((sion_filedesc->
ntasks>=256) && (*num_collectors>16)) *num_collectors=16;
193 else if((sion_filedesc->
ntasks>=128) && (*num_collectors>8)) *num_collectors=8;
194 else if((sion_filedesc->
ntasks>=64) && (*num_collectors>8)) *num_collectors=8;
195 else if((sion_filedesc->
ntasks>=32) && (*num_collectors>8)) *num_collectors=8;
196 else if((sion_filedesc->
ntasks>=16) && (*num_collectors>4)) *num_collectors=4;
200 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"SIONlib heuristic collsize=%d num_collectors=%d\n",
201 sion_filedesc->
collsize, *num_collectors));
205 collstat->avg_data_per_collector = (
206 (sion_int64) (collstat->gsize / *num_collectors)
211 if((collstat->gsize / *num_collectors)%sion_filedesc->
fsblksize>0) collstat->avg_data_per_collector+=sion_filedesc->
fsblksize;
212 DPRINTFP((32,
DFUNCTION, _SION_DEFAULT_RANK,
"avg_data_per_collectors=%ld\n",(
long) collstat->avg_data_per_collector));
225 #define DFUNCTION "_sion_calculate_startpointers_collective" 226 int _sion_calculate_startpointers_collective(
_sion_filedesc *sion_filedesc )
229 int rc = SION_SUCCESS;
230 int i, firstsize, num_collectors, numsender, lastcoll, s;
232 sion_int64 currentsize, aligned_size, startpointer;
235 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
240 "_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"));
244 collstat=_sion_create_and_init_collstat(sion_filedesc);
247 collstat->firstsize=firstsize=_sion_get_size_metadatablock1(sion_filedesc);
248 _sion_calculate_num_collector(sion_filedesc, collstat, &num_collectors);
249 collstat->req_num_collectors=num_collectors;
251 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d collsize=%d num_collectors=%d\n",
252 firstsize, sion_filedesc->
collsize, num_collectors));
254 numsender=1;lastcoll=0;
258 for (i = 1; i < sion_filedesc->
ntasks; i++) {
259 if( (currentsize+sion_filedesc->
all_chunksizes[i]<=collstat->avg_data_per_collector) ||
267 for(s=lastcoll;s<i;s++) {
274 aligned_size = ((sion_int64) currentsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
277 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" align chunksizes[%2d]=%8lld + %lld\n",
278 i-1, sion_filedesc->
all_chunksizes[i-1], aligned_size-currentsize));
284 numsender = 1; lastcoll= i; currentsize = sion_filedesc->
all_chunksizes[i];
290 aligned_size = ((sion_int64) currentsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
292 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" align chunksizes[%2d]=%8lld + %lld\n",
298 for(s=lastcoll;s<sion_filedesc->
ntasks;s++) {
307 startpointer = (firstsize % sion_filedesc->
fsblksize == 0) ? firstsize : ((firstsize / sion_filedesc->
fsblksize) + 1) * sion_filedesc->
fsblksize;
310 for (i = 0; i < sion_filedesc->
ntasks; i++) {
318 _sion_update_collstat(collstat,sion_filedesc);
319 _sion_print_collstat(collstat, sion_filedesc);
322 _sion_debugprint_collstat(collstat, sion_filedesc);
324 _sion_destroy_collstat(collstat);
326 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"leave globalskip is %lld\n", sion_filedesc->
globalskip));
338 #define DFUNCTION "_sion_calculate_startpointers_collective_merge" 339 int _sion_calculate_startpointers_collective_merge(
_sion_filedesc *sion_filedesc )
342 int rc = SION_SUCCESS;
343 int i, firstsize, num_collectors, numsender, lastcoll, s;
345 sion_int64 currentsize, newsize, aligned_size, startpointer;
348 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"enter ntasks=%d fsblksize=%d chunksizes[0]=%lld\n",
353 "_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"));
357 collstat=_sion_create_and_init_collstat(sion_filedesc);
360 collstat->firstsize=firstsize=_sion_get_size_metadatablock1(sion_filedesc);
361 _sion_calculate_num_collector(sion_filedesc, collstat, &num_collectors);
362 collstat->req_num_collectors=num_collectors;
364 DPRINTFP((2,
DFUNCTION, _SION_DEFAULT_RANK,
"firstsize=%d collsize=%d num_collectors=%d\n",
365 firstsize, sion_filedesc->
collsize, num_collectors));
367 numsender=1;lastcoll=0;
370 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" currentsize=%lld chunksizes[%2d]=%8lld\n",
374 for (i = 1; i < sion_filedesc->
ntasks; i++) {
375 if( (currentsize+sion_filedesc->
all_chunksizes[i]<=collstat->avg_data_per_collector) ||
380 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" currentsize=%lld chunksizes[%2d]=%8lld\n",
390 aligned_size = ((sion_int64) newsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
393 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" resize chunksizes[%2d]=%8lld + %lld\n",
397 for(s=lastcoll+1;s<i;s++) {
401 _sion_calculate_set_alignment(sion_filedesc,s);
410 for(s=lastcoll;s<i;s++) {
416 numsender = 1; lastcoll= i; currentsize = sion_filedesc->
all_chunksizes[i];
425 aligned_size = ((sion_int64) newsize/sion_filedesc->
fsblksize) * sion_filedesc->
fsblksize;
428 DPRINTFP((128,
DFUNCTION, _SION_DEFAULT_RANK,
" resize chunksizes[%2d]=%8lld + %lld\n",
433 for(s=lastcoll+1;s<i;s++) {
439 for(s=lastcoll;s<sion_filedesc->
ntasks;s++) {
448 startpointer = (firstsize % sion_filedesc->
fsblksize == 0) ? firstsize : ((firstsize / sion_filedesc->
fsblksize) + 1) * sion_filedesc->
fsblksize;
451 for (i = 0; i < sion_filedesc->
ntasks; i++) {
459 _sion_update_collstat(collstat,sion_filedesc);
460 _sion_print_collstat(collstat, sion_filedesc);
463 _sion_debugprint_collstat(collstat, sion_filedesc);
465 _sion_destroy_collstat(collstat);
467 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
int _sion_errorprint(int rc, int level, const char *format,...)
Internal SION error.
sion_int64 * all_chunksizes
#define DFUNCTION
Calculates the size of the first meta data block.
#define SION_FILEMODE_WRITE
sion_int32 * all_coll_collsize