Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

ScaLapack Tools rutina pdlaread.f

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Paralelni algoritmi 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
(s)Venn
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 18. 02. 2009. (17:59:25)
Postovi: (40)16
Sarma = la pohva - posuda
= 8 - 6
Lokacija: Velika Gorica

PostPostano: 19:25 sub, 2. 2. 2013    Naslov: ScaLapack Tools rutina pdlaread.f Citirajte i odgovorite

Ima li netko ideju zašto mi za ovaj kod:

[code:1]
#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;
}
[/code:1]

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

[code:1]
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
[/code:1]

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...
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...



_________________
..pišem pjesme, sviram bluz, radost i tugu na stihove lomim..
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Gino
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 11. 09. 2008. (10:54:06)
Postovi: (370)16
Sarma = la pohva - posuda
-29 = 108 - 137
Lokacija: Pula

PostPostano: 19:53 sub, 2. 2. 2013    Naslov: Citirajte i odgovorite

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 :D C-Fortran stuff...)

Dakle ja sam to ovako deklarirao:
[tt]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);
[/tt]

i ovako koristio

[tt] pdlaread_( file, A_loc, DESCA, &iNULA, &iNULA, Aprod_loc, (int)strlen(file) );
[/tt]

Nadam se da pomaze...
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...



_________________
Mario Berljafa
[Vrh]
Korisnički profil Pošaljite privatnu poruku
(s)Venn
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 18. 02. 2009. (17:59:25)
Postovi: (40)16
Sarma = la pohva - posuda
= 8 - 6
Lokacija: Velika Gorica

PostPostano: 20:27 sub, 2. 2. 2013    Naslov: Citirajte i odgovorite

Problem riješen! Hvala puno, Mario! :)

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...
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...



_________________
..pišem pjesme, sviram bluz, radost i tugu na stihove lomim..
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
venovako
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2002. (22:46:38)
Postovi: (2F9)16
Sarma = la pohva - posuda
56 = 65 - 9

PostPostano: 22:27 ned, 3. 2. 2013    Naslov: Citirajte i odgovorite

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 [url=http://titan.fsb.hr/~venovako/nastava/PMF-MO/ParAlg12/1/vj/00/00.html]ove upute[/url], 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:
[code:1]
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_ ).
*
* =====================================================================
[/code:1]

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:
[code:1]
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);
[/code:1]
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);


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Paralelni algoritmi 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan