Skip to content

Commit eddd406

Browse files
author
Bruce J Palmer
committed
Added 3D array tests to get and accumulate unit tests.
1 parent 2b4d70c commit eddd406

File tree

2 files changed

+293
-6
lines changed

2 files changed

+293
-6
lines changed

xga/testing/acc_unit_test.cpp

Lines changed: 150 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <iostream>
55

66
#define DIM 2048
7+
#define DIM3 128
78
template <typename idx_type, typename data_type>
89
void acc_test()
910
{
@@ -194,9 +195,156 @@ void acc_test()
194195

195196
MPI_Allreduce(&ok, &chk, 1, MPI_INT, MPI_PROD, comm);
196197
if (chk==1 && rank == 0) {
197-
printf("\n Single large acc test PASSES\n\n");
198+
printf("\n Single large acc test PASSES\n");
198199
} else if (chk == 0) {
199-
printf("\n Single large acc test FAILS\n\n");
200+
printf("\n Single large acc test FAILS\n");
201+
}
202+
delete [] buf;
203+
204+
if (rank == 0) {
205+
printf("\n Testing accumulate to three dimensional array\n");
206+
printf("\n Initialize values in array\n");
207+
}
208+
int three = 3;
209+
idx_type dims3d[3], hi3[3], lo3[3], ld3[2];
210+
dims3d[0] = DIM3;
211+
dims3d[1] = 2*DIM3;
212+
dims3d[2] = 4*DIM3;
213+
XGA::GlobalArray<data_type> ga3d(group, three, dims3d);
214+
ga3d.allocate();
215+
nghbr = (rank+1)%size;
216+
ga3d.distribution(rank,lo3,hi3);
217+
ga3d.accessPtr(lo3, hi3, &vptr, ld3);
218+
dptr = static_cast<data_type*>(vptr);
219+
idx_type k, kdim;
220+
idim = hi3[0]-lo3[0]+1;
221+
jdim = hi3[1]-lo3[1]+1;
222+
kdim = hi3[2]-lo3[2]+1;
223+
for (i=0; i<idim; i++) {
224+
for (j=0; j<jdim; j++) {
225+
for (k=0; k<kdim; k++) {
226+
dptr[k+j*kdim+i*kdim*jdim] = static_cast<data_type>(
227+
k+lo3[2]+(j+lo3[1])*dims3d[2]+(i+lo3[0])*dims3d[2]*dims3d[1]);
228+
}
229+
}
230+
}
231+
ga3d.sync();
232+
233+
ga3d.distribution(nghbr,lo3,hi3);
234+
idim = hi3[0]-lo3[0]+1;
235+
jdim = hi3[1]-lo3[1]+1;
236+
kdim = hi3[2]-lo3[2]+1;
237+
nelems = idim*jdim*kdim;
238+
/* initialize local buffer*/
239+
buf = new data_type[nelems];
240+
241+
/* divide each processor block into 8 sub-blocks */
242+
idx_type plo3[3], phi3[3];
243+
ld3[0] = jdim;
244+
ld3[1] = kdim;
245+
for (n=0; n<8; n++) {
246+
if (n==0) {
247+
plo3[0] = lo3[0];
248+
phi3[0] = lo3[0]+(hi3[0]-lo3[0])/2;
249+
plo3[1] = lo3[1];
250+
phi3[1] = lo3[1]+(hi3[1]-lo3[1])/2;
251+
plo3[2] = lo3[2];
252+
phi3[2] = lo3[2]+(hi3[2]-lo3[2])/2;
253+
} else if (n==1) {
254+
plo3[0] = lo3[0]+(hi3[0]-lo3[0])/2 + 1;
255+
phi3[0] = hi3[0];
256+
plo3[1] = lo3[1];
257+
phi3[1] = lo3[1]+(hi3[1]-lo3[1])/2;
258+
plo3[2] = lo3[2];
259+
phi3[2] = lo3[2]+(hi3[2]-lo3[2])/2;
260+
} else if (n==2) {
261+
plo3[0] = lo3[0];
262+
phi3[0] = lo3[0]+(hi3[0]-lo3[0])/2;
263+
plo3[1] = lo3[1]+(hi3[1]-lo3[1])/2 + 1;
264+
phi3[1] = hi3[1];
265+
plo3[2] = lo3[2];
266+
phi3[2] = lo3[2]+(hi3[2]-lo3[2])/2;
267+
} else if (n==3) {
268+
plo3[0] = lo3[0]+(hi3[0]-lo3[0])/2 + 1;
269+
phi3[0] = hi3[0];
270+
plo3[1] = lo3[1]+(hi3[1]-lo3[1])/2 + 1;
271+
phi3[1] = hi3[1];
272+
plo3[2] = lo3[2];
273+
phi3[2] = lo3[2]+(hi3[2]-lo3[2])/2;
274+
} else if (n==4) {
275+
plo3[0] = lo3[0];
276+
phi3[0] = lo3[0]+(hi3[0]-lo3[0])/2;
277+
plo3[1] = lo3[1];
278+
phi3[1] = lo3[1]+(hi3[1]-lo3[1])/2;
279+
plo3[2] = lo3[2]+(hi3[2]-lo3[2])/2 + 1;
280+
phi3[2] = hi3[2];
281+
} else if (n==5) {
282+
plo3[0] = lo3[0]+(hi3[0]-lo3[0])/2 + 1;
283+
phi3[0] = hi3[0];
284+
plo3[1] = lo3[1];
285+
phi3[1] = lo3[1]+(hi3[1]-lo3[1])/2;
286+
plo3[2] = lo3[2]+(hi3[2]-lo3[2])/2 + 1;
287+
phi3[2] = hi3[2];
288+
} else if (n==6) {
289+
plo3[0] = lo3[0];
290+
phi3[0] = lo3[0]+(hi3[0]-lo3[0])/2;
291+
plo3[1] = lo3[1]+(hi3[1]-lo3[1])/2 + 1;
292+
phi3[1] = hi3[1];
293+
plo3[2] = lo3[2]+(hi3[2]-lo3[2])/2 + 1;
294+
phi3[2] = hi3[2];
295+
} else if (n==7) {
296+
plo3[0] = lo3[0]+(hi3[0]-lo3[0])/2 + 1;
297+
phi3[0] = hi3[0];
298+
plo3[1] = lo3[1]+(hi3[1]-lo3[1])/2 + 1;
299+
phi3[1] = hi3[1];
300+
plo3[2] = lo3[2]+(hi3[2]-lo3[2])/2 + 1;
301+
phi3[2] = hi3[2];
302+
}
303+
idx_type ii, jj, kk;
304+
for (i=plo3[0]; i<=phi3[0]; i++) {
305+
ii = i-plo3[0];
306+
for (j=plo3[1]; j<=phi3[1]; j++) {
307+
jj = j-plo3[1];
308+
for (k=plo3[2]; k<=phi3[2]; k++) {
309+
kk = k-plo3[2];
310+
buf[kk+jj*kdim+ii*kdim*jdim]
311+
= static_cast<data_type>(k + j*dims3d[2] + i*dims3d[2]*dims3d[1]);
312+
}
313+
}
314+
}
315+
ga3d.acc(plo3,phi3,buf,ld3,r_one);
316+
}
317+
318+
319+
ga3d.sync();
320+
ga3d.distribution(rank,lo3,hi3);
321+
ga3d.accessPtr(lo3, hi3, &vptr, ld3);
322+
dptr = static_cast<data_type*>(vptr);
323+
ok = 1;
324+
idim = (hi3[0]-lo3[0]+1);
325+
jdim = (hi3[1]-lo3[1]+1);
326+
kdim = (hi3[2]-lo3[2]+1);
327+
for (i=0; i<idim; i++) {
328+
for (j=0; j<jdim; j++) {
329+
for (k=0; k<kdim; k++) {
330+
if (dptr[k+j*kdim+i*kdim*jdim]
331+
!= static_cast<data_type>(2*(k+lo3[2]+(j+lo3[1])*dims3d[2]
332+
+ (i+lo3[0])*dims3d[2]*dims3d[1]))) {
333+
printf("p[%d] Check fails for i: %d j: %d k: %d actual: %f expected: %f\n",
334+
wrank,i,j,k,dptr[k+j*kdim+i*kdim*jdim],
335+
static_cast<data_type>(2*(k+lo3[2]+(j+lo3[1])*dims3d[2]
336+
+ (i+lo3[0])*dims3d[2]*dims3d[1])));
337+
ok = 0;
338+
}
339+
}
340+
}
341+
}
342+
343+
MPI_Allreduce(&ok, &chk, 1, MPI_INT, MPI_PROD, comm);
344+
if (chk==1 && rank == 0) {
345+
printf("\n 3D accumulate test PASSES\n\n");
346+
} else if (chk == 0) {
347+
printf("\n 3D accumulate test FAILS\n\n");
200348
}
201349
delete [] buf;
202350
}

xga/testing/get_unit_test.cpp

Lines changed: 143 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <iostream>
55

66
#define DIM 2048
7+
#define DIM3 128
78
template<typename idx_type, typename data_type>
89
void 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("\nTesting 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("\nTesting 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

Comments
 (0)