SIONlib  1.7.1
Scalable I/O library for parallel access to task-local files
sion_internal_collstat.c
Go to the documentation of this file.
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2016 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
14 #include <stdlib.h>
15 #include <stdio.h>
16 #include <stdarg.h>
17 #include <string.h>
18 #include <time.h>
19 
20 #include "sion_internal.h"
21 #include "sion_error_handler.h"
22 #include "sion_debug.h"
23 
24 #include "sion_internal_collstat.h"
25 
26 #define DFUNCTION "_sion_create_and_init_collstat"
27 _sion_collstat * _sion_create_and_init_collstat( _sion_filedesc *sion_filedesc ) {
28  _sion_collstat *collstat;
29  int t;
30 
31  collstat = (_sion_collstat *) malloc(sizeof(_sion_collstat));
32  if (collstat == NULL) {
33  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"cannot allocate collstat structure of size %lu (sion_collstat), aborting ...\n",
34  (unsigned long) sizeof(_sion_collstat));
35  return(NULL);
36  }
37 
38  collstat->req_collsize=sion_filedesc->collsize;
39  collstat->firstsize=0;
40  collstat->gsize=0;
41  collstat->avg_size_per_sender=0;
42  collstat->max_size_per_sender=0;
43  collstat->min_size_per_sender=1e10;
44 
45  collstat->num_collectors=0;
46  collstat->avg_sender_per_collector=0;
47  collstat->max_sender_per_collector=0;
48  collstat->min_sender_per_collector=10000000;
49  collstat->avg_size_per_collector=0;
50  collstat->max_size_per_collector=0;
51  collstat->min_size_per_collector=1e10;
52 
53 
54  /* calculate overall data size */
55  collstat->gsize=0;
56  for (t = 0; t < sion_filedesc->ntasks; t++) {
57  collstat->gsize+=sion_filedesc->all_chunksizes[t];
58  if(sion_filedesc->all_chunksizes[t]>collstat->max_size_per_sender) collstat->max_size_per_sender=sion_filedesc->all_chunksizes[t];
59  if(sion_filedesc->all_chunksizes[t]<collstat->min_size_per_sender) collstat->min_size_per_sender=sion_filedesc->all_chunksizes[t];
60  }
61  if(sion_filedesc->ntasks>0) collstat->avg_size_per_sender = (double) collstat->gsize / (double) sion_filedesc->ntasks;
62 
63  DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK, "gsize=%ld\n", (long) collstat->gsize));
64 
65  return(collstat);
66 }
67 #undef DFUNCTION
68 
69 
70 #define DFUNCTION "_sion_update_collstat"
71 int _sion_update_collstat( _sion_collstat *collstat, _sion_filedesc *sion_filedesc ) {
72  int rc = SION_SUCCESS;
73  int t, s;
74  sion_int64 currentsize;
75 
76  /* calculate overall data size */
77 
78  for (t = 0; t < sion_filedesc->ntasks; t++) {
79 
80  if(t == sion_filedesc->all_coll_collector[t]) {
81  /* its a collector */
82 
83  /* accumulate data for collector */
84  currentsize=0;
85  for (s = t; s < t+sion_filedesc->all_coll_collsize[t]; s++) {
86  currentsize += sion_filedesc->all_chunksizes[s];
87  }
88 
89  /* statistics */
90  collstat->num_collectors++;
91  collstat->avg_size_per_collector+=currentsize;
92  if(currentsize>collstat->max_size_per_collector) collstat->max_size_per_collector=currentsize;
93  if(currentsize<collstat->min_size_per_collector) collstat->min_size_per_collector=currentsize;
94  if(sion_filedesc->all_coll_collsize[t]<collstat->min_sender_per_collector) collstat->min_sender_per_collector=sion_filedesc->all_coll_collsize[t];
95  if(sion_filedesc->all_coll_collsize[t]>collstat->max_sender_per_collector) collstat->max_sender_per_collector=sion_filedesc->all_coll_collsize[t];
96 
97  }
98  }
99  if(collstat->num_collectors>0) collstat->avg_size_per_collector/=collstat->num_collectors;
100 
101  return(rc);
102 }
103 #undef DFUNCTION
104 
105 
106 #define DFUNCTION "_sion_print_collstat"
107 int _sion_print_collstat( _sion_collstat *collstat, _sion_filedesc *sion_filedesc ) {
108  int rc = SION_SUCCESS;
109  int t,s;
110 
111  fprintf(stderr, "collective statistics: req_collsize=%11d\n", collstat->req_collsize);
112  fprintf(stderr, "collective statistics: req_num_collectors=%11d\n", collstat->req_num_collectors);
113  fprintf(stderr, "collective statistics: num_collectors=%11d\n", collstat->num_collectors);
114  fprintf(stderr, "collective statistics: avg_sender_per_collector=%14.2f\n", collstat->avg_sender_per_collector);
115  fprintf(stderr, "collective statistics: min_sender_per_collector=%11d\n", collstat->min_sender_per_collector);
116  fprintf(stderr, "collective statistics: max_sender_per_collector=%11d\n", collstat->max_sender_per_collector);
117 
118  fprintf(stderr, "collective statistics: avg_size_per_collector=%14.2f bytes\n", collstat->avg_size_per_collector);
119  fprintf(stderr, "collective statistics: min_size_per_collector=%11lld bytes\n", collstat->min_size_per_collector);
120  fprintf(stderr, "collective statistics: max_size_per_collector=%11lld bytes\n", collstat->max_size_per_collector);
121 
122  fprintf(stderr, "collective statistics: avg_size_per_sender=%14.2f bytes\n", collstat->avg_size_per_sender);
123  fprintf(stderr, "collective statistics: min_size_per_sender=%11lld bytes\n", collstat->min_size_per_sender);
124  fprintf(stderr, "collective statistics: max_size_per_sender=%11lld bytes\n", collstat->max_size_per_sender);
125 
126  if(sion_filedesc->colldebug>=3) {
127  for (t = 0; t < sion_filedesc->ntasks; t++) {
128 
129  if(t == sion_filedesc->all_coll_collector[t]) {
130  /* its a collector */
131  fprintf(stderr,"collective statistics: startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld COLLECTOR collsize=%3d\n",
132  t, sion_filedesc->all_startpointers[t], sion_filedesc->all_startpointers[t] / 1024.0 / 1024.0,
133  t, sion_filedesc->all_chunksizes[t],
134  sion_filedesc->all_coll_collsize[t] );
135 
136  for (s = t+1; s < t+sion_filedesc->all_coll_collsize[t]; s++) {
137  fprintf(stderr,"collective statistics: startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld SENDER to %3d\n",
138  s, sion_filedesc->all_startpointers[s], sion_filedesc->all_startpointers[s] / 1024.0 / 1024.0,
139  s, sion_filedesc->all_chunksizes[s], t );
140  }
141  }
142  }
143  }
144 
145  return(rc);
146 }
147 #undef DFUNCTION
148 
149 #define DFUNCTION "_sion_debugprint_collstat"
150 int _sion_debugprint_collstat( _sion_collstat *sion_collstat, _sion_filedesc *sion_filedesc ) {
151  int rc = SION_SUCCESS;
152  int t, s;
153 
154 
155  DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK, " enter\n"));
156 
157  for (t = 0; t < sion_filedesc->ntasks; t++) {
158  if(t == sion_filedesc->all_coll_collector[t]) {
159  /* its a collector */
160  DPRINTFP((2048, DFUNCTION, _SION_DEFAULT_RANK, " startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld COLLECTOR collsize=%3d\n",
161  t, sion_filedesc->all_startpointers[t], sion_filedesc->all_startpointers[t] / 1024.0 / 1024.0,
162  t, sion_filedesc->all_chunksizes[t],
163  sion_filedesc->all_coll_collsize[t] ));
164 
165  for (s = t+1; s < t+sion_filedesc->all_coll_collsize[t]; s++) {
166  DPRINTFP((2048, DFUNCTION, _SION_DEFAULT_RANK, " startpointers[%2d]=%10lld (%10.4fMB) chunksizes[%2d]=%8lld SENDER to %3d\n",
167  s, sion_filedesc->all_startpointers[s], sion_filedesc->all_startpointers[s] / 1024.0 / 1024.0,
168  s, sion_filedesc->all_chunksizes[s], t ));
169  }
170  }
171  }
172 
173  DPRINTFP((2, DFUNCTION, _SION_DEFAULT_RANK, " leave\n",t));
174  return(rc);
175 }
176 #undef DFUNCTION
177 
178 #define DFUNCTION "_sion_dprint_collstat"
179 int _sion_destroy_collstat( _sion_collstat *sion_collstat ) {
180  int rc = SION_SUCCESS;
181 
182  if(sion_collstat) {
183  free(sion_collstat);
184  }
185 
186  return(rc);
187 }
188 #undef DFUNCTION
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
sion_int32 * all_coll_collector
sion_int64 * all_startpointers
sion_int64 * all_chunksizes
sion_int32 * all_coll_collsize