1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
3 * (C) 2001 by Argonne National Laboratory.
4 * See COPYRIGHT in top-level directory.
11 * Simple segment test, including timing code
15 * Build datatype structures
18 * n = 1, 4, 16, 64, 128, 512, 2048, 8196 ints
20 * blocksize = 1, 4, 64 ints
23 * blocksize = 1, 4 ints
24 * offsets = i*24 for i = 0 to n, n = 0, 64, 512
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)
30 * Also need a few nested datatypes, such as vector of vectors
31 * Do the versions in Using MPI
36 * Routines to create dataloops for basic dataloops
41 MPID_Dataloop *MPID_Dataloop_init_contig(int count)
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;
58 MPID_Dataloop *MPID_Dataloop_init_vector(int count, int blocksize, int stride)
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;
77 MPID_Dataloop *MPID_Dataloop_init_blockindexed(int count, int blocksize, MPI_Aint * offset)
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;
93 bi->loop_params.bi_t.dataloop = 0;
103 MPID_Dataloop *MPID_Dataloop_init_indexed(int count, int *blocksize, MPI_Aint * offset)
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];
120 it->loop_params.i_t.dataloop = 0;
127 int main(int argc, char **argv)
129 /* MPID_Dataloop *vecloop; */
130 MPI_Datatype vectype;
131 int count = 200, blocksize = 4, stride = 7 * 4;
132 char *src_buf, *dest_buf;
136 MPI_Init(&argc, &argv);
138 /* vecloop = MPID_Dataloop_init_vector(count, blocksize, stride); */
140 MPI_Type_vector(count, 1, 7, MPI_INT, &vectype);
142 /* Initialize the data */
143 src_buf = (char *) MPL_malloc((count - 1) * stride + blocksize);
144 for (i = 0; i < (count - 1) * stride + blocksize; i++)
146 for (i = 0; i < count; i++) {
147 for (j = 0; j < blocksize; j++)
148 src_buf[i * stride + j] = i * blocksize + j;
150 dest_buf = (char *) MPL_malloc(count * blocksize);
151 for (i = 0; i < count * blocksize; i++) {
155 for (i = 0; i < 100; i++) {
157 /*MPID_Segment_pack(vecloop, src_buf, dest_buf); */
158 MPI_Pack(src_buf, count, vectype, dest_buf, count * blocksize, &position, MPI_COMM_WORLD);
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);
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++)
177 printf("Timer for hand vector pack is %e\n", (r2 - r1) / 100);
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;
185 for (i = 0; i < count; i++) {
191 for (i = 0; i < count; i++) {
192 for (j = 0; j < bsize; j++)
199 printf("Timer for hand vector pack (int) is %e\n", (r2 - r1) / 100);
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)