240{
241
242
243
244
245 FILE *fp;
247
249 q0;
250
252
253#define nbparameter 24
254
259 Int ia, ja, ib, jb, m, n;
260 Int gcontext, context0, context1;
261 Int myprow1, myprow0, mypcol0, mypcol1;
264 float *ptrmyblock, *ptrsavemyblock, *ptrmyblockcopy, *ptrmyblockvide;
265#ifdef UsingMpiBlacs
266 MPI_Init(&argc, &argv);
267#endif
268 setvbuf(stdout, NULL, _IOLBF, 0);
269 setvbuf(stderr, NULL, _IOLBF, 0);
270#ifdef T3D
271 free(malloc(14000000));
272#endif
274
276
280 if (mypnum == 0) {
281 if ((fp = fopen("GEMR2D.dat", "r")) == NULL) {
282 fprintf(stderr, "Can't open GEMR2D.dat\n");
283 exit(1);
284 };
285 printf("\n// SGEMR2D TESTER for REAL //\n");
286 getparam(fp, &nbre, NULL);
287 printf("////////// %d tests \n\n", nbre);
288 parameters[0] = nbre;
290 } else {
292 nbre = parameters[0];
293 };
294 if (mypnum == 0) {
295 printf("\n m n m0 n0 sr0 sc0 i0 j0 p0 q0 nbr0 nbc0 \
296m1 n1 sr1 sc1 i1 j1 p1 q1 nbr1 nbc1\n\n");
297 };
298
299
300 nbremax = nbre;
301#ifdef DEBUG
302 fprintf(stderr, "bonjour,je suis le noeud %d\n", mypnum);
303#endif
304 while (nbre-- != 0) {
305
306
307
308 if (mypnum == 0) {
310 getparam(fp,
311 &m, &n,
316 NULL);
317 printf("\t\t************* TEST # %d **********\n",
318 nbremax - nbre);
319 printf(" %3d %3d %3d %3d %3d %3d %3d %3d \
320%3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d",
321 m, n,
326 printf("\n");
327 if (p0 * q0 > nprocs || p1 * q1 > nprocs) {
328 fprintf(stderr, "not enough nodes:%d processors required\n",
329 max(p0 * q0, p1 * q1));
330 exit(1);
331 }
332 parameters[0] = p0;
333 parameters[1] = q0;
334 parameters[2] = ma.
nbrow;
335 parameters[3] = ma.
nbcol;
336 parameters[4] = p1;
337 parameters[5] = q1;
338 parameters[6] = mb.
nbrow;
339 parameters[7] = mb.
nbcol;
340 parameters[8] = ma.
m;
341 parameters[9] = ma.
n;
342 parameters[10] = ma.
sprow;
343 parameters[11] = ma.
spcol;
344 parameters[12] = mb.
sprow;
345 parameters[13] = mb.
spcol;
346 parameters[14] = ia;
347 parameters[15] = ja;
348 parameters[16] = ib;
349 parameters[17] = jb;
350 parameters[18] = m;
351 parameters[19] = n;
352 parameters[20] = mb.
m;
353 parameters[21] = mb.
n;
355 } else {
357 p0 = parameters[0];
358 q0 = parameters[1];
359 ma.
nbrow = parameters[2];
360 ma.
nbcol = parameters[3];
361 p1 = parameters[4];
362 q1 = parameters[5];
363 mb.
nbrow = parameters[6];
364 mb.
nbcol = parameters[7];
365 ma.
m = parameters[8];
366 ma.
n = parameters[9];
367 ma.
sprow = parameters[10];
368 ma.
spcol = parameters[11];
369 mb.
sprow = parameters[12];
370 mb.
spcol = parameters[13];
371 ia = parameters[14];
372 ja = parameters[15];
373 ib = parameters[16];
374 jb = parameters[17];
375 m = parameters[18];
376 n = parameters[19];
377 mb.
m = parameters[20];
378 mb.
n = parameters[21];
381 };
387 if (myprow0 >= p0 || mypcol0 >= q0)
388 myprow0 = mypcol0 = -1;
390 if (myprow1 >= p1 || mypcol1 >= q1)
391 myprow1 = mypcol1 = -1;
392 assert((myprow0 < p0 && mypcol0 < q0) || (myprow0 == -1 && mypcol0 == -1));
393 assert((myprow1 < p1 && mypcol1 < q1) || (myprow1 == -1 && mypcol1 == -1));
396
397
398
399
400
401 if (myprow0 >= 0 && mypcol0 >= 0) {
407 memcpy((char *) ptrmyblockcopy, (char *) ptrmyblock,
408 blocksize0 * sizeof(float));
410 for (i = 0; i < blocksize0; i++)
411 ptrmyblockvide[i] = -1;
412 };
413 if (myprow1 >= 0 && mypcol1 >= 0) {
416 };
417
418
420 ptrmyblock, ia, ja, &ma,
421 ptrsavemyblock, ib, jb, &mb, gcontext);
422
423
425 ptrsavemyblock, ib, jb, &mb,
426 ptrmyblockvide, ia, ja, &ma, gcontext);
427
428 nberrors = 0;
429 if (myprow0 >= 0 && mypcol0 >= 0) {
430
431 for (i = 0; i < blocksize0; i++) {
434 in = 1;
441 assert(gi < ma.
m && gj < ma.
n);
442 gi -= (ia - 1);
443 gj -= (ja - 1);
444 if (gi < 0 || gj < 0 || gi >= m || gj >= n)
445 in = 0;
446 if (!in) {
447 ptrmyblockcopy[i] = -1;
448 }
449 if (ptrmyblockvide[i] != ptrmyblockcopy[i]) {
450 nberrors++;
451 };
452 };
453 if (nberrors > 0) {
454 printf("Processor %d, has tested %d REAL elements,\
455Number of redistribution errors = %d \n",
456 mypnum, blocksize0, nberrors);
457 }
458 }
459
461 if (mypnum == 0)
462 if (nberrors)
463 printf(" => Total number of redistribution errors = %d \n",
464 nberrors);
465 else
466 printf("TEST PASSED OK\n");
467
468 if (myprow0 >= 0 && mypcol0 >= 0) {
472 };
473
474 if (myprow1 >= 0 && mypcol1 >= 0) {
476 };
477 if (myprow0 >= 0)
479 if (myprow1 >= 0)
481 };
482 if (mypnum == 0) {
483 fclose(fp);
484 };
486 return 0;
487}
static2 void initblock(float *block, Int m, Int n)
#define SHIFT(row, sprow, nbrow)
void initforpvm(Int argc, char *argv[])