Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
remove unwanted files
[simgrid.git] / teshsuite / smpi / mpich-test / pt2pt / pack.c
1 #include "mpi.h"
2 #include <stdio.h>
3
4 #if defined(NEEDS_STDLIB_PROTOTYPES)
5 #include "protofix.h"
6 #endif
7
8 /*
9    Check pack/unpack of mixed datatypes.
10  */
11 #define BUF_SIZE 100
12 int main( int argc, char **argv )
13 {
14     int myrank;
15     char buffer[BUF_SIZE];
16     int n, size, src, dest, errcnt, errs;
17     double a,b;
18     int pos;
19
20     MPI_Status status;
21     MPI_Init(&argc, &argv);
22     
23     MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
24
25     src    = 0;
26     dest   = 1;
27
28     src    = 1;
29     dest   = 0;
30
31     errcnt = 0;
32     if (myrank == src)
33         {
34             pos = 0;
35             n   = 10;
36             a   = 1.1;
37             b   = 2.2;
38             MPI_Pack(&n, 1, MPI_INT, buffer, BUF_SIZE, &pos, MPI_COMM_WORLD);
39             MPI_Pack(&a, 1, MPI_DOUBLE, buffer, BUF_SIZE, &pos, 
40                      MPI_COMM_WORLD);
41             MPI_Pack(&b, 1, MPI_DOUBLE, buffer, BUF_SIZE, &pos, 
42                      MPI_COMM_WORLD);
43             /* printf( "%d\n", pos ); */
44             MPI_Send(&pos, 1, MPI_INT, dest, 999, MPI_COMM_WORLD);
45             MPI_Send(buffer, pos, MPI_PACKED, dest, 99, MPI_COMM_WORLD);
46         }
47     else
48         {
49             MPI_Recv(&size, 1, MPI_INT, src, 999, MPI_COMM_WORLD, &status);
50             MPI_Recv(buffer, size, MPI_PACKED, src, 99, 
51                      MPI_COMM_WORLD, &status);
52             pos = 0;
53             MPI_Unpack(buffer, size, &pos, &n, 1, MPI_INT, MPI_COMM_WORLD);
54             MPI_Unpack(buffer, size, &pos, &a, 1, MPI_DOUBLE, MPI_COMM_WORLD);
55             MPI_Unpack(buffer, size, &pos, &b, 1, MPI_DOUBLE, MPI_COMM_WORLD);
56             /* Check results */
57             if (n != 10) { 
58                 errcnt++;
59                 printf( "Wrong value for n; got %d expected %d\n", n, 10 );
60                 }
61             if (a != 1.1) { 
62                 errcnt++;
63                 printf( "Wrong value for a; got %f expected %f\n", a, 1.1 );
64                 }
65             if (b != 2.2) { 
66                 errcnt++;
67                 printf( "Wrong value for b; got %f expected %f\n", b, 2.2 );
68                 }
69         }
70     MPI_Allreduce( &errcnt, &errs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
71     if (myrank == 0) {
72         if (errs == 0) printf( "No errors\n" );
73         else           printf( "%d errors\n", errs );
74         }
75     MPI_Finalize();
76 return 0;
77 }