Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new entry in Release_Notes.
[simgrid.git] / teshsuite / smpi / mpich3-test / datatype / segtest.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *  (C) 2001 by Argonne National Laboratory.
4  *      See COPYRIGHT in top-level directory.
5  */
6 #include "mpi.h"
7 #include "mpiimpl.h"
8 #include <stdio.h>
9
10 /*
11  * Simple segment test, including timing code
12  */
13
14 /*
15  * Build datatype structures
16  *
17  * Contiguous
18  *     n = 1, 4, 16, 64, 128, 512, 2048, 8196 ints
19  * Vector
20  *     blocksize = 1, 4, 64 ints
21  *     stride    = 1, 64, 127
22  * Block Indexed
23  *     blocksize = 1, 4 ints
24  *     offsets   = i*24 for i = 0 to n, n = 0, 64, 512
25  * Indexed
26  *     blocksizes = 1, 2, 4, 3, 7, 5, 6
27  *     offsets    = i*24 for i = 0 to n, n = 0, 4, 7, 64, 512
28  *     (Wrap blocksizes to match offsets)
29  *
30  * Also need a few nested datatypes, such as vector of vectors
31  * Do the versions in Using MPI
32  *
33  */
34
35 /*
36  * Routines to create dataloops for basic dataloops
37  */
38 /*
39  *  Contig
40  */
41 MPID_Dataloop *MPID_Dataloop_init_contig(int count)
42 {
43     MPID_Dataloop *ct;
44
45     ct = (MPID_Dataloop *) MPL_malloc(sizeof(MPID_Dataloop));
46     ct->kind = MPID_DTYPE_CONTIG | DATALOOP_FINAL_MASK;
47     ct->loop_params.c_t.count = count;
48     ct->loop_params.c_t.dataloop = 0;
49     ct->extent = count;
50     ct->handle = 0;
51
52     return ct;
53 }
54
55 /*
56  * Vector
57  */
58 MPID_Dataloop *MPID_Dataloop_init_vector(int count, int blocksize, int stride)
59 {
60     MPID_Dataloop *v;
61
62     v = (MPID_Dataloop *) MPL_malloc(sizeof(MPID_Dataloop));
63     v->kind = MPID_DTYPE_VECTOR | DATALOOP_FINAL_MASK;
64     v->loop_params.v_t.count = count;
65     v->loop_params.v_t.blocksize = blocksize;
66     v->loop_params.v_t.stride = stride;
67     v->loop_params.v_t.dataloop = 0;
68     v->extent = (count - 1) * stride + blocksize;
69     v->handle = 0;
70
71     return v;
72 }
73
74 /*
75  * Block indexed
76  */
77 MPID_Dataloop *MPID_Dataloop_init_blockindexed(int count, int blocksize, MPI_Aint * offset)
78 {
79     MPID_Dataloop *bi;
80     MPI_Aint extent;
81     int i;
82
83     bi = (MPID_Dataloop *) MPL_malloc(sizeof(MPID_Dataloop));
84     bi->kind = MPID_DTYPE_BLOCKINDEXED | DATALOOP_FINAL_MASK;
85     bi->loop_params.bi_t.count = count;
86     bi->loop_params.bi_t.blocksize = blocksize;
87     bi->loop_params.bi_t.offset = (MPI_Aint *) MPL_malloc(sizeof(MPI_Aint) * count);
88     for (i = 0; i < count; i++) {
89         bi->loop_params.bi_t.offset[i] = offset[i];
90         if (offset[i] + blocksize > extent)
91             extent = offset[i] + blocksize;
92     }
93     bi->loop_params.bi_t.dataloop = 0;
94     bi->extent = extent;
95     bi->handle = 0;
96
97     return bi;
98 }
99
100 /*
101  * Indexed
102  */
103 MPID_Dataloop *MPID_Dataloop_init_indexed(int count, int *blocksize, MPI_Aint * offset)
104 {
105     MPID_Dataloop *it;
106     MPI_Aint extent = 0;
107     int i;
108
109     it = (MPID_Dataloop *) MPL_malloc(sizeof(MPID_Dataloop));
110     it->kind = MPID_DTYPE_INDEXED | DATALOOP_FINAL_MASK;
111     it->loop_params.i_t.count = count;
112     it->loop_params.i_t.blocksize = (int *) MPL_malloc(sizeof(int) * count);
113     it->loop_params.i_t.offset = (MPI_Aint *) MPL_malloc(sizeof(MPI_Aint) * count);
114     for (i = 0; i < count; i++) {
115         it->loop_params.i_t.offset[i] = offset[i];
116         it->loop_params.i_t.blocksize[i] = blocksize[i];
117         if (offset[i] + blocksize[i] > extent)
118             extent = offset[i] + blocksize[i];
119     }
120     it->loop_params.i_t.dataloop = 0;
121     it->extent = extent;
122     it->handle = 0;
123
124     return it;
125 }
126
127 int main(int argc, char **argv)
128 {
129     /* MPID_Dataloop *vecloop; */
130     MPI_Datatype vectype;
131     int count = 200, blocksize = 4, stride = 7 * 4;
132     char *src_buf, *dest_buf;
133     int i, j, k;
134     double r1, r2;
135
136     MPI_Init(&argc, &argv);
137
138 /*    vecloop = MPID_Dataloop_init_vector(count, blocksize, stride); */
139
140     MPI_Type_vector(count, 1, 7, MPI_INT, &vectype);
141
142     /* Initialize the data */
143     src_buf = (char *) MPL_malloc((count - 1) * stride + blocksize);
144     for (i = 0; i < (count - 1) * stride + blocksize; i++)
145         src_buf[i] = -i;
146     for (i = 0; i < count; i++) {
147         for (j = 0; j < blocksize; j++)
148             src_buf[i * stride + j] = i * blocksize + j;
149     }
150     dest_buf = (char *) MPL_malloc(count * blocksize);
151     for (i = 0; i < count * blocksize; i++) {
152         dest_buf[i] = -i;
153     }
154     r1 = MPI_Wtime();
155     for (i = 0; i < 100; i++) {
156         int position = 0;
157         /*MPID_Segment_pack(vecloop, src_buf, dest_buf); */
158         MPI_Pack(src_buf, count, vectype, dest_buf, count * blocksize, &position, MPI_COMM_WORLD);
159     }
160     r2 = MPI_Wtime();
161     printf("Timer for vector pack is %e\n", (r2 - r1) / 100);
162     for (i = 0; i < count * blocksize; i++) {
163         if (dest_buf[i] != (char) i) {
164             printf("Error at location %d\n", i);
165         }
166     }
167     r1 = MPI_Wtime();
168     for (k = 0; k < 100; k++) {
169         char *dest = dest_buf, *src = src_buf;
170         for (i = 0; i < count; i++) {
171             for (j = 0; j < blocksize; j++)
172                 *dest++ = src[j];
173             src += stride;
174         }
175     }
176     r2 = MPI_Wtime();
177     printf("Timer for hand vector pack is %e\n", (r2 - r1) / 100);
178
179     r1 = MPI_Wtime();
180     for (k = 0; k < 100; k++) {
181         int *dest = (int *) dest_buf, *src = (int *) src_buf;
182         int bsize = blocksize >> 2;
183         int istride = stride >> 2;
184         if (bsize == 1) {
185             for (i = 0; i < count; i++) {
186                 *dest++ = *src;
187                 src += istride;
188             }
189         }
190         else {
191             for (i = 0; i < count; i++) {
192                 for (j = 0; j < bsize; j++)
193                     *dest++ = src[j];
194                 src += istride;
195             }
196         }
197     }
198     r2 = MPI_Wtime();
199     printf("Timer for hand vector pack (int) is %e\n", (r2 - r1) / 100);
200
201     MPI_Finalize();
202     return 0;
203 }
204
205 /*
206  * Nested vector.
207  *   The y-z subface is
208  *   Type_vector(ey-sy+1, 1, nx, MPI_DOUBLE, &newx1);
209  *   Type_hvector(ez-sz+1, 1, nx*ny_sizeof(double), newx1, &newx);
210  * This gives the a(i,sy:ey,sz:ez) of a(nx,ny,nz) (in Fortran notation)
211  */