44#include < iostream>
55
66#define DIM 2048
7+ #define DIM3 128
78template <typename idx_type, typename data_type>
89void get_test ()
910{
@@ -177,9 +178,143 @@ void get_test()
177178
178179 MPI_Allreduce (&ok, &chk, 1 , MPI_INT, MPI_PROD, comm);
179180 if (chk==1 && rank == 0 ) {
180- printf (" \n Single large get test PASSES\n\n " );
181+ printf (" \n Single large get test PASSES\n " );
181182 } else if (chk == 0 ) {
182- printf (" \n Single large get test FAILS\n\n " );
183+ printf (" \n Single large get test FAILS\n " );
184+ }
185+ if (" \n Testing get from three dimensional array\n " );
186+ int three = 3 ;
187+ idx_type dims3d[3 ], hi3[3 ], lo3[3 ], ld3[2 ];
188+ dims3d[0 ] = DIM3;
189+ dims3d[1 ] = 2 *DIM3;
190+ dims3d[2 ] = 4 *DIM3;
191+ XGA::GlobalArray<data_type> ga3d (group, three, dims3d);
192+ ga3d.allocate ();
193+ delete [] buf;
194+ nghbr = (rank+1 )%size;
195+ ga3d.distribution (rank,lo3,hi3);
196+ ga3d.accessPtr (lo3, hi3, &vptr, ld3);
197+ dptr = static_cast <data_type*>(vptr);
198+ idx_type k, kdim;
199+ idim = hi3[0 ]-lo3[0 ]+1 ;
200+ jdim = hi3[1 ]-lo3[1 ]+1 ;
201+ kdim = hi3[2 ]-lo3[2 ]+1 ;
202+ buf = new data_type[idim*jdim*kdim];
203+ ld3[0 ] = jdim;
204+ ld3[1 ] = kdim;
205+ /* initialize local buffer to zero */
206+ for (i=0 ; i<idim; i++) {
207+ for (j=0 ; j<jdim; j++) {
208+ for (k=0 ; k<kdim; k++) {
209+ buf[k+j*kdim+i*kdim*jdim] = static_cast <data_type>(0 );
210+ }
211+ }
212+ }
213+ /* initialize global array */
214+ for (i=0 ; i<idim; i++) {
215+ for (j=0 ; j<jdim; j++) {
216+ for (k=0 ; k<kdim; k++) {
217+ dptr[k+j*kdim+i*kdim*jdim] = static_cast <data_type>(
218+ k+lo3[2 ]+(j+lo3[1 ])*dims3d[2 ]+(i+lo3[0 ])*dims3d[2 ]*dims3d[1 ]);
219+ }
220+ }
221+ }
222+ ga3d.sync ();
223+ ga3d.distribution (nghbr,lo3,hi3);
224+ /* divide each processor block into 8 sub-blocks */
225+ idx_type plo3[3 ], phi3[3 ];
226+ for (n=0 ; n<8 ; n++) {
227+ if (n==0 ) {
228+ plo3[0 ] = lo3[0 ];
229+ phi3[0 ] = lo3[0 ]+(hi3[0 ]-lo3[0 ])/2 ;
230+ plo3[1 ] = lo3[1 ];
231+ phi3[1 ] = lo3[1 ]+(hi3[1 ]-lo3[1 ])/2 ;
232+ plo3[2 ] = lo3[2 ];
233+ phi3[2 ] = lo3[2 ]+(hi3[2 ]-lo3[2 ])/2 ;
234+ } else if (n==1 ) {
235+ plo3[0 ] = lo3[0 ]+(hi3[0 ]-lo3[0 ])/2 + 1 ;
236+ phi3[0 ] = hi3[0 ];
237+ plo3[1 ] = lo3[1 ];
238+ phi3[1 ] = lo3[1 ]+(hi3[1 ]-lo3[1 ])/2 ;
239+ plo3[2 ] = lo3[2 ];
240+ phi3[2 ] = lo3[2 ]+(hi3[2 ]-lo3[2 ])/2 ;
241+ } else if (n==2 ) {
242+ plo3[0 ] = lo3[0 ];
243+ phi3[0 ] = lo3[0 ]+(hi3[0 ]-lo3[0 ])/2 ;
244+ plo3[1 ] = lo3[1 ]+(hi3[1 ]-lo3[1 ])/2 + 1 ;
245+ phi3[1 ] = hi3[1 ];
246+ plo3[2 ] = lo3[2 ];
247+ phi3[2 ] = lo3[2 ]+(hi3[2 ]-lo3[2 ])/2 ;
248+ } else if (n==3 ) {
249+ plo3[0 ] = lo3[0 ]+(hi3[0 ]-lo3[0 ])/2 + 1 ;
250+ phi3[0 ] = hi3[0 ];
251+ plo3[1 ] = lo3[1 ]+(hi3[1 ]-lo3[1 ])/2 + 1 ;
252+ phi3[1 ] = hi3[1 ];
253+ plo3[2 ] = lo3[2 ];
254+ phi3[2 ] = lo3[2 ]+(hi3[2 ]-lo3[2 ])/2 ;
255+ } else if (n==4 ) {
256+ plo3[0 ] = lo3[0 ];
257+ phi3[0 ] = lo3[0 ]+(hi3[0 ]-lo3[0 ])/2 ;
258+ plo3[1 ] = lo3[1 ];
259+ phi3[1 ] = lo3[1 ]+(hi3[1 ]-lo3[1 ])/2 ;
260+ plo3[2 ] = lo3[2 ]+(hi3[2 ]-lo3[2 ])/2 + 1 ;
261+ phi3[2 ] = hi3[2 ];
262+ } else if (n==5 ) {
263+ plo3[0 ] = lo3[0 ]+(hi3[0 ]-lo3[0 ])/2 + 1 ;
264+ phi3[0 ] = hi3[0 ];
265+ plo3[1 ] = lo3[1 ];
266+ phi3[1 ] = lo3[1 ]+(hi3[1 ]-lo3[1 ])/2 ;
267+ plo3[2 ] = lo3[2 ]+(hi3[2 ]-lo3[2 ])/2 + 1 ;
268+ phi3[2 ] = hi3[2 ];
269+ } else if (n==6 ) {
270+ plo3[0 ] = lo3[0 ];
271+ phi3[0 ] = lo3[0 ]+(hi3[0 ]-lo3[0 ])/2 ;
272+ plo3[1 ] = lo3[1 ]+(hi3[1 ]-lo3[1 ])/2 + 1 ;
273+ phi3[1 ] = hi3[1 ];
274+ plo3[2 ] = lo3[2 ]+(hi3[2 ]-lo3[2 ])/2 + 1 ;
275+ phi3[2 ] = hi3[2 ];
276+ } else if (n==7 ) {
277+ plo3[0 ] = lo3[0 ]+(hi3[0 ]-lo3[0 ])/2 + 1 ;
278+ phi3[0 ] = hi3[0 ];
279+ plo3[1 ] = lo3[1 ]+(hi3[1 ]-lo3[1 ])/2 + 1 ;
280+ phi3[1 ] = hi3[1 ];
281+ plo3[2 ] = lo3[2 ]+(hi3[2 ]-lo3[2 ])/2 + 1 ;
282+ phi3[2 ] = hi3[2 ];
283+ }
284+ data_type *tbuf = buf + plo3[2 ]-lo3[2 ]+(plo3[1 ]-lo3[1 ])*kdim
285+ +(plo3[0 ]-lo3[0 ])*kdim*jdim;
286+ ga3d.get (plo3,phi3,tbuf,ld3);
287+ }
288+ ga3d.sync ();
289+ ga3d.distribution (rank,lo3,hi3);
290+ ga3d.accessPtr (lo3, hi3, &vptr, ld3);
291+ dptr = static_cast <data_type*>(vptr);
292+ ok = 1 ;
293+ idim = hi3[0 ]-lo3[0 ]+1 ;
294+ jdim = hi3[1 ]-lo3[1 ]+1 ;
295+ kdim = hi3[2 ]-lo3[2 ]+1 ;
296+ for (i=0 ; i<idim; i++) {
297+ for (j=0 ; j<jdim; j++) {
298+ for (k=0 ; k<kdim; k++) {
299+ if (dptr[k+j*kdim+i*kdim*jdim] !=
300+ static_cast <data_type>(k+lo3[2 ]+(j+lo3[1 ])*dims3d[2 ]
301+ +(i+lo3[0 ])*dims3d[2 ]*dims3d[1 ])) {
302+ printf (" p[%d] Check fails for i: %d j: %d k: %d"
303+ " actual: %f expected: %f\n " ,
304+ wrank,i+lo3[0 ],j+lo3[1 ],k+lo3[2 ],dptr[k+j*kdim+i*kdim*jdim],
305+ static_cast <data_type>(k+lo3[2 ]+(j+lo[1 ])*dims3d[2 ]
306+ + (i+lo3[0 ])*dims3d[2 ]*dims3d[1 ]));
307+ ok = 0 ;
308+ }
309+ }
310+ }
311+ }
312+
313+ MPI_Allreduce (&ok, &chk, 1 , MPI_INT, MPI_PROD, comm);
314+ if (chk==1 && rank == 0 ) {
315+ printf (" \n 3D get test PASSES\n\n " );
316+ } else if (chk == 0 ) {
317+ printf (" \n 3D get test FAILS\n\n " );
183318 }
184319 delete [] buf;
185320}
@@ -190,10 +325,14 @@ int main(int argc, char **argv)
190325 int rank = group->rank ();
191326 int size = group->size ();
192327 if (rank == 0 ) {
193- int64_t dims[2 ];
328+ int64_t dims[2 ], dims3d[ 3 ] ;
194329 dims[0 ] = DIM;
195330 dims[1 ] = 2 *DIM;
196- printf (" \n Testing GET on a %d x %d matrix" ,dims[0 ],dims[1 ]);
331+ dims3d[0 ] = DIM3;
332+ dims3d[1 ] = 2 *DIM3;
333+ dims3d[2 ] = 4 *DIM3;
334+ printf (" \n Testing GET on a 2D %d x %d matrix and a\n " ,dims[0 ],dims[1 ]);
335+ printf (" 3D %ld x %ld x %ld array" ,dims3d[0 ],dims3d[1 ],dims3d[2 ]);
197336 printf (" running on %d processors\n " ,size);
198337 }
199338 if (rank == 0 ) {
0 commit comments