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 *)MPIU_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,
63 v = (MPID_Dataloop *)MPIU_Malloc( sizeof(MPID_Dataloop) );
64 v->kind = MPID_DTYPE_VECTOR | DATALOOP_FINAL_MASK;
65 v->loop_params.v_t.count = count;
66 v->loop_params.v_t.blocksize = blocksize;
67 v->loop_params.v_t.stride = stride;
68 v->loop_params.v_t.dataloop = 0;
69 v->extent = (count-1)*stride + blocksize;
78 MPID_Dataloop *MPID_Dataloop_init_blockindexed( int count, int blocksize,
85 bi = (MPID_Dataloop *)MPIU_Malloc( sizeof(MPID_Dataloop) );
86 bi->kind = MPID_DTYPE_BLOCKINDEXED | DATALOOP_FINAL_MASK;
87 bi->loop_params.bi_t.count = count;
88 bi->loop_params.bi_t.blocksize = blocksize;
89 bi->loop_params.bi_t.offset =
90 (MPI_Aint *)MPIU_Malloc( sizeof(MPI_Aint) * count );
91 for (i=0; i<count; i++) {
92 bi->loop_params.bi_t.offset[i] = offset[i];
93 if (offset[i] + blocksize > extent)
94 extent = offset[i] + blocksize;
96 bi->loop_params.bi_t.dataloop = 0;
106 MPID_Dataloop *MPID_Dataloop_init_indexed( int count, int *blocksize,
113 it = (MPID_Dataloop *)MPIU_Malloc( sizeof(MPID_Dataloop) );
114 it->kind = MPID_DTYPE_INDEXED | DATALOOP_FINAL_MASK;
115 it->loop_params.i_t.count = count;
116 it->loop_params.i_t.blocksize = (int *)MPIU_Malloc( sizeof(int) * count );
117 it->loop_params.i_t.offset =
118 (MPI_Aint *)MPIU_Malloc( sizeof(MPI_Aint) * count );
119 for (i=0; i<count; i++) {
120 it->loop_params.i_t.offset[i] = offset[i];
121 it->loop_params.i_t.blocksize[i] = blocksize[i];
122 if (offset[i] + blocksize[i] > extent)
123 extent = offset[i] + blocksize[i];
125 it->loop_params.i_t.dataloop = 0;
132 int main( int argc, char **argv )
134 /* MPID_Dataloop *vecloop; */
135 MPI_Datatype vectype;
136 int count=200, blocksize=4, stride = 7*4;
137 char *src_buf, *dest_buf;
141 MPI_Init( &argc, &argv );
143 /* vecloop = MPID_Dataloop_init_vector( count, blocksize, stride ); */
145 MPI_Type_vector( count, 1, 7, MPI_INT, &vectype );
147 /* Initialize the data */
148 src_buf = (char *)MPIU_Malloc( (count - 1) * stride + blocksize );
149 for (i=0; i<(count-1)*stride+blocksize; i++)
151 for (i=0; i<count; i++) {
152 for (j=0; j<blocksize; j++)
153 src_buf[i*stride+j] = i*blocksize + j;
155 dest_buf = (char *)MPIU_Malloc( count*blocksize );
156 for (i=0; i<count*blocksize; i++) {
160 for (i=0; i<100; i++) {
162 /*MPID_Segment_pack( vecloop, src_buf, dest_buf );*/
163 MPI_Pack( src_buf, count, vectype, dest_buf, count*blocksize,
164 &position, MPI_COMM_WORLD );
167 printf( "Timer for vector pack is %e\n", (r2-r1)/100 );
168 for (i=0; i<count*blocksize; i++) {
169 if (dest_buf[i] != (char)i) {
170 printf( "Error at location %d\n", i );
174 for (k=0; k<100; k++) {
175 char *dest=dest_buf, *src=src_buf;
176 for (i=0; i<count; i++) {
177 for (j=0; j<blocksize; j++)
183 printf( "Timer for hand vector pack is %e\n", (r2-r1)/100 );
186 for (k=0; k<100; k++) {
187 int *dest=(int*)dest_buf, *src=(int*)src_buf;
188 int bsize = blocksize >> 2;
189 int istride = stride >> 2;
191 for (i=0; i<count; i++) {
197 for (i=0; i<count; i++) {
198 for (j=0; j<bsize; j++)
205 printf( "Timer for hand vector pack (int) is %e\n", (r2-r1)/100 );
214 * Type_vector( ey-sy+1, 1, nx, MPI_DOUBLE, &newx1 );
215 * Type_hvector( ez-sz+1, 1, nx*ny_sizeof(double), newx1, &newx );
216 * This gives the a(i,sy:ey,sz:ez) of a(nx,ny,nz) (in Fortran notation)