ScaLapack Tools rutina pdlaread.f
Select messages from
# through # FAQ
[/[Print]\]

Forum@DeGiorgi -> Paralelni algoritmi 1 i 2

#1: ScaLapack Tools rutina pdlaread.f Autor/ica: (s)VennLokacija: Velika Gorica PostPostano: 19:25 sub, 2. 2. 2013
    —
Ima li netko ideju zašto mi za ovaj kod:

Kod:

#include <mpi.h>
#include <mkl.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define gridSize 5
#define NPROC 4
#define NB 2

extern pdlaread_(const char *t, double *a, const int *desc, const int *row, const int *col, const double *work);

void ispisi_matricu(int m, int n, double a[])
{
  int i,j;

  for (i = 0; i < m; i++)
   {
    for(j=0; j < n;j++)
    {
      printf("%f  ", a[i*n+j] );
    }
    printf("\n");
   }
}

int main(int argc, char* argv[]) {
   double *A;
   int i, j, root = NPROC-1;
   int desc[9], np, myid;

   MPI_Init(&argc, &argv);
   MPI_Comm_rank(MPI_COMM_WORLD, &myid);
   MPI_Comm_size(MPI_COMM_WORLD, &np);

   if ( np != NPROC )
   {
      if ( myid == root)
         fprintf( stderr, "Broj procesa je %d, a treba biti %d!\n", np, NPROC );
      goto die;
   }

     //BLACS portion
     int ictxt, nprow, npcol, myrow, mycol, nb = NB;
     int info,itemp;
     int ZERO = 0, ONE = 1;
     nprow = 2; npcol = 2; nb = 2;

     Cblacs_pinfo(&myid,&np);
     Cblacs_get(-1,0,&ictxt);
     Cblacs_gridinit(&ictxt,"Row",nprow,npcol);
     Cblacs_gridinfo(ictxt,&nprow,&npcol,&myrow,&mycol);

     printf("proc %d - moje coords: (%d,%d)\n", myid, myrow, mycol);

   int M = gridSize;
   int mA = numroc_(&M, &nb, &myrow, &ZERO, &nprow);
   int nA = numroc_(&M, &nb, &mycol, &ZERO, &npcol);
   double dmA = M;
   //char ime[7] = {'d', 'a', 't', '.', 't', 'x', 't'};

   descinit_(desc, &M, &M, &nb, &nb, &ZERO, &ZERO, &ictxt, &mA, &info);

   A = (double*) malloc (M*M*sizeof(double));

   pdlaread_("dat.txt", A, desc, &ZERO, &ZERO, &dmA );

   if (myid == 0)
      ispisi_matricu(M,M,A);          
   
   free(A);
   
die:
   MPI_Finalize();

   return 0;
}


...kompajler prilikom run-anja nakon uspješnog kompajliranja javlja:

Kod:

proc 0 - moje coords: (0,0)
proc 1 - moje coords: (0,1)
proc 2 - moje coords: (1,0)
proc 3 - moje coords: (1,1)
{    0,    0}:  On entry to
PLAWRITE parameter number    1 had an illegal value
-nan  -nan  -nan  -nan  -nan 
-nan  -nan  -nan  -nan  -nan 
-nan  -nan  -nan  -nan  -nan 
-nan  -nan  -nan  -nan  -nan 
-nan  -nan  -nan  -nan  -nan


Dokumentacija na netu ja jako štura po pitanju ove funkcije, pogotovo nisam naišao na primjere u kojima se ista primijenjuje u C programu, tako da ću biti jako zahvalan za svaki konkretan odgovor...

#2:  Autor/ica: GinoLokacija: Pula PostPostano: 19:53 sub, 2. 2. 2013
    —
Nemam vremena sad gledat kod, ali ja sam lani imao problema s tim funkcijama. Tom i onoj za pisanje...

Rjesenje je bilo dodati jos jedan parametar na kraju, duljinu imena file-a. (I kako je meni tada receno, to je radeno na vjezbama Very Happy C-Fortran stuff...)

Dakle ja sam to ovako deklarirao:
void pdlaread_(const char *const, double *const, const int *const, const int *const, const int *const, double *const, const int);

void pdlawrite_(const char *const, const int *const, const int *const, const double *const, const int *const, const int *const, const int *const, const int \
*const, const int *const, double *const, const int);


i ovako koristio

pdlaread_( file, A_loc, DESCA, &iNULA, &iNULA, Aprod_loc, (int)strlen(file) );


Nadam se da pomaze...

#3:  Autor/ica: (s)VennLokacija: Velika Gorica PostPostano: 20:27 sub, 2. 2. 2013
    —
Problem riješen! Hvala puno, Mario! Smile

Koga zanima, program je proradio kad sam primijenio sugestiju s ekstra-parametrom, a isto tako treba uvesti promjenu kod alokacije memorije za matricu A za mA*nA elemenata, umjesto M*M...

#4:  Autor/ica: venovako PostPostano: 22:27 ned, 3. 2. 2013
    —
OK, vidim da ste se sporazumjeli.
Da, rađeno je na vježbama.
No, budući da tu činjenicu studenti svake godine iznova otkrivaju, pomalo se pitam čemu služe, bilo vježbe, bilo ove upute, koje očito nemaju nikakvu praktičnu svrhu, a kamoli veze s programskim i inim zadacima.

No, dobro, hajdemo po n-ti put prevesti Fortran u C deklaraciju:
Kod:

      SUBROUTINE PDLAREAD( FILNAM, A, DESCA, IRREAD, ICREAD, WORK )
*
*  -- ScaLAPACK tools routine (version 1.8) --
*     University of Tennessee, Knoxville, Oak Ridge National Laboratory,
*     and University of California, Berkeley.
*
*     written by Antoine Petitet, August 1995 (petitet@cs.utk.edu)
*     adapted by Julie Langou, April 2007 (julie@cs.utk.edu)
*
*     .. Scalar Arguments ..
      INTEGER            ICREAD, IRREAD
*     ..
*     .. Array Arguments ..
      CHARACTER*(*)      FILNAM
      INTEGER            DESCA( * )
      DOUBLE PRECISION   A( * ), WORK( * )
*     ..
*
*  Purpose
*  =======
*
*  PDLAREAD reads from a file named FILNAM a matrix and distribute
*  it to the process grid.
*
*  Only the process of coordinates {IRREAD, ICREAD} read the file.
*
*  WORK must be of size >= MB_ = DESCA( MB_ ).
*
*  =====================================================================


SUBROUTINE ⇒ extern void (ili extern "C" void u C++ slučaju)
PDLAREAD ⇒ pdlaread_ (na Unixu, odnosno PDLAREAD na Windowsima)
CHARACTER*(*) FILNAM je string nespecificirane duljine, koju će rutina saznati kroz "skriveni" by-value integer parametar, poslan nakon ne-"skrivenih" parametara. Kod nekih kompajlera (ali po defaultu ne ondje gdje radite zadaću) moguće je da taj "skriveni" parametar bude poslan odmah nakon odgovarajućeg stringa. Budući da rutina ne mijenja poslani string:
CHARACTER*(*) FILNAM ⇒ const char *const filnam
DOUBLE PRECISION A( * ) ⇒ double *const a (A je polje u koje će se upisivati, pa je double, a ne const double).
INTEGER DESCA( * ) ⇒ const int *const desca (DESCA je deskriptor ScaLAPACK distribuirane matrice A, iz njega se samo čita)
INTEGER IRREAD ⇒ const int *const irread
INTEGER ICREAD ⇒ const int *const icread
DOUBLE PRECISION WORK( * ) ⇒ double *const work (WORK je radno polje za internu upotrebu u rutini, mora biti duljine barem MB komponente u DESCA).
I na kraju, dodamo
const int filnam_len (to je ona duljina stringa filnam).
Sve u svemu:
Kod:

extern void pdlaread_(const char *const filnam, double *const a, const int *const desca, const int *const irread, const int *const icread, double *const work, const int filnam_len);



Forum@DeGiorgi -> Paralelni algoritmi 1 i 2


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Stranica 1 / 1.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin