254#define nbparameter 24
260 Int ia, ja, ib, jb, m, n;
261 Int gcontext, context0, context1;
262 Int myprow1, myprow0, mypcol0, mypcol1;
265 double *ptrmyblock, *ptrsavemyblock, *ptrmyblockcopy, *ptrmyblockvide;
267 MPI_Init(&argc, &argv);
269 setvbuf(stdout, NULL, _IOLBF, 0);
270 setvbuf(stderr, NULL, _IOLBF, 0);
272 free(malloc(14000000));
282 if ((fp = fopen(
"GEMR2D.dat",
"r")) == NULL) {
283 fprintf(stderr,
"Can't open GEMR2D.dat\n");
286 printf(
"\n// DGEMR2D TESTER for DOUBLE PRECISION //\n");
287 getparam(fp, &nbre, NULL);
288 printf(
"////////// %d tests \n\n", nbre);
289 parameters[0] = nbre;
293 nbre = parameters[0];
296 printf(
"\n m n m0 n0 sr0 sc0 i0 j0 p0 q0 nbr0 nbc0 \
297m1 n1 sr1 sc1 i1 j1 p1 q1 nbr1 nbc1\n\n");
303 fprintf(stderr,
"bonjour,je suis le noeud %d\n", mypnum);
305 while (nbre-- != 0) {
318 printf(
"\t\t************* TEST # %d **********\n",
320 printf(
" %3d %3d %3d %3d %3d %3d %3d %3d \
321%3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d",
328 if (p0 * q0 > nprocs || p1 * q1 > nprocs) {
329 fprintf(stderr,
"not enough nodes:%d processors required\n",
330 max(p0 * q0, p1 * q1));
335 parameters[2] = ma.
nbrow;
336 parameters[3] = ma.
nbcol;
339 parameters[6] = mb.
nbrow;
340 parameters[7] = mb.
nbcol;
341 parameters[8] = ma.
m;
342 parameters[9] = ma.
n;
343 parameters[10] = ma.
sprow;
344 parameters[11] = ma.
spcol;
345 parameters[12] = mb.
sprow;
346 parameters[13] = mb.
spcol;
353 parameters[20] = mb.
m;
354 parameters[21] = mb.
n;
360 ma.
nbrow = parameters[2];
361 ma.
nbcol = parameters[3];
364 mb.
nbrow = parameters[6];
365 mb.
nbcol = parameters[7];
366 ma.
m = parameters[8];
367 ma.
n = parameters[9];
368 ma.
sprow = parameters[10];
369 ma.
spcol = parameters[11];
370 mb.
sprow = parameters[12];
371 mb.
spcol = parameters[13];
378 mb.
m = parameters[20];
379 mb.
n = parameters[21];
388 if (myprow0 >= p0 || mypcol0 >= q0)
389 myprow0 = mypcol0 = -1;
391 if (myprow1 >= p1 || mypcol1 >= q1)
392 myprow1 = mypcol1 = -1;
393 assert((myprow0 < p0 && mypcol0 < q0) || (myprow0 == -1 && mypcol0 == -1));
394 assert((myprow1 < p1 && mypcol1 < q1) || (myprow1 == -1 && mypcol1 == -1));
402 if (myprow0 >= 0 && mypcol0 >= 0) {
408 memcpy((
char *) ptrmyblockcopy, (
char *) ptrmyblock,
409 blocksize0 *
sizeof(
double));
411 for (i = 0; i < blocksize0; i++)
412 ptrmyblockvide[i] = -1;
414 if (myprow1 >= 0 && mypcol1 >= 0) {
421 ptrmyblock, ia, ja, &ma,
422 ptrsavemyblock, ib, jb, &mb, gcontext);
426 ptrsavemyblock, ib, jb, &mb,
427 ptrmyblockvide, ia, ja, &ma, gcontext);
430 if (myprow0 >= 0 && mypcol0 >= 0) {
432 for (i = 0; i < blocksize0; i++) {
442 assert(gi < ma.
m && gj < ma.
n);
445 if (gi < 0 || gj < 0 || gi >= m || gj >= n)
448 ptrmyblockcopy[i] = -1;
450 if (ptrmyblockvide[i] != ptrmyblockcopy[i]) {
452 printf(
"Proc %d : Error element number %d, value = %f , initvalue =%f \n"
454 ptrmyblockvide[i], ptrmyblockcopy[i]);
458 printf(
"Processor %d, has tested %d DOUBLE PRECISION elements,\
459Number of redistribution errors = %d \n",
460 mypnum, blocksize0, nberrors);
467 printf(
" => Total number of redistribution errors = %d \n",
470 printf(
"TEST PASSED OK\n");
472 if (myprow0 >= 0 && mypcol0 >= 0) {
478 if (myprow1 >= 0 && mypcol1 >= 0) {