Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
96c651635e538916dce9e083d98d587658e422fa
[simgrid.git] / teshsuite / smpi / mpich3-test / rma / accfence2_am.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *
4  *  (C) 2003 by Argonne National Laboratory.
5  *      See COPYRIGHT in top-level directory.
6  */
7 #include "mpi.h"
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include "mpitest.h"
11
12 #ifndef MAX_INT
13 #define MAX_INT 0x7fffffff
14 #endif
15
16 /*
17 static char MTEST_Descrip[] = "Test MPI_Accumulate with fence";
18 */
19
20 /* same as accfence2.c, but uses alloc_mem */
21
22 int main( int argc, char *argv[] )
23 {
24     int errs = 0;
25     int rank, size, source;
26     int minsize = 2, count, i; 
27     MPI_Comm      comm;
28     MPI_Win       win;
29     int           *winbuf, *sbuf;
30
31     MTest_Init( &argc, &argv );
32
33     /* The following illustrates the use of the routines to 
34        run through a selection of communicators and datatypes.
35        Use subsets of these for tests that do not involve combinations 
36        of communicators, datatypes, and counts of datatypes */
37     while (MTestGetIntracommGeneral( &comm, minsize, 1 )) {
38         if (comm == MPI_COMM_NULL) continue;
39         /* Determine the sender and receiver */
40         MPI_Comm_rank( comm, &rank );
41         MPI_Comm_size( comm, &size );
42         source = 0;
43         
44         for (count = 32768; count < 65000; count = count * 2) {
45
46
47             /* We compare with an integer value that can be as large as
48                size * (count * count + (1/2)*(size-1))
49                For large machines (size large), this can exceed the 
50                maximum integer for some large values of count.  We check
51                that in advance and break this loop if the above value 
52                would exceed MAX_INT.  Specifically,
53
54                size*count*count + (1/2)*size*(size-1) > MAX_INT
55                count*count > (MAX_INT/size - (1/2)*(size-1))
56             */
57             if (count * count > (MAX_INT/size - (size-1)/2)) break;
58
59             MPI_Alloc_mem( count * sizeof(int), MPI_INFO_NULL, &winbuf );
60             MPI_Alloc_mem( count * sizeof(int), MPI_INFO_NULL, &sbuf );
61
62             for (i=0; i<count; i++) winbuf[i] = 0;
63             for (i=0; i<count; i++) sbuf[i] = rank + i * count;
64             MPI_Win_create( winbuf, count * sizeof(int), sizeof(int),
65                             MPI_INFO_NULL, comm, &win );
66             MPI_Win_fence( 0, win );
67             MPI_Accumulate( sbuf, count, MPI_INT, source, 0, count, MPI_INT,
68                                 MPI_SUM, win );
69             MPI_Win_fence( 0, win );
70             if (rank == source) {
71                 /* Check the results */
72                 for (i=0; i<count; i++) {
73                     int result = i * count * size + (size*(size-1))/2;
74                     if (winbuf[i] != result) {
75                         if (errs < 10) {
76                             fprintf( stderr, "Winbuf[%d] = %d, expected %d (count = %d, size = %d)\n",
77                                      i, winbuf[i], result, count, size );
78                         }
79                         errs++;
80                     }
81                 }
82             }
83
84             MPI_Win_free( &win );
85
86             MPI_Free_mem(winbuf);
87             MPI_Free_mem(sbuf);
88         }
89         MTestFreeComm(&comm);
90     }
91
92     MTest_Finalize( errs );
93     MPI_Finalize();
94     return 0;
95 }