src/test/mpi-reduce.c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    #include "utils.h"
    
    int main ()
    {
      init_grid (64);
    
      scalar s[];
      foreach()
        s[] = x + y;
    
      // statsf() uses reduction operations
      stats stat = statsf (s);
      fprintf (qerr, "%g %g %g\n", stat.min, stat.sum, stat.max);
    
      // Array reduction
      #define arr_size 10
      int cells[arr_size] = {0};
      foreach (reduction(+:cells[:arr_size])) 
        cells[(int)(10*fabs(x))]++;
    
      for (int i = 0; i < arr_size; i++) 
        fprintf (qerr, "%d ", cells[i]);
      fputc ('\n', qerr);
    
      // Coord reduction
      coord p = {0};
      mat3 p2 = {0};
      foreach (reduction(+:p) reduction(+:p2))
        foreach_dimension() {
          p.x++;
          p2.x.x++;
        }
      fprintf (qerr, "%g %g %g %g\n", p.x, p.y, p2.x.x, p2.y.y);
    
      // test array of coord and mat3 reduction 
      #define arr_size 10
      coord P[arr_size] = {{0}};
      mat3 P2[arr_size] = {{{0}}};
      foreach (reduction(+:P[:arr_size]) reduction(+:P2[:arr_size]))
        foreach_dimension() {
          P[(int)(10*fabs(x))].x++;
          P2[(int)(10*fabs(x))].x.x++;
        }
    
      char * _x="x",* _y="y";
      foreach_dimension(){
        fprintf (qerr,"P.%s : ", _x);
        for (int i = 0; i < arr_size; i++) 
            fprintf (qerr, "%g ", P[i].x);
        fputc ('\n', qerr);
        fprintf (qerr,"P.%s.%s : ", _x,_x);
        for (int i = 0; i < arr_size; i++) 
            fprintf (qerr, "%g ", P2[i].x.x);
        fputc ('\n', qerr);
      }
    }