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