Take out internal development notes.

psblas3-type-indexed
Salvatore Filippone 19 years ago
parent cd7649fd1b
commit 67684e14b9

@ -6,40 +6,41 @@
####################### Section 1 #######################
# Define your compilers and compiler flags here #
##########################################################
F90=${IFC8}/bin/ifort
FC=${IFC8}/bin/ifort
F90=/usr/local/gfortran/bin/gfortran
FC=/usr/local/gfortran/bin/gfortran
F77=$(FC)
CC=gcc
F90COPT= -O3
FCOPT=-O3
CCOPT=-O3
CC=/usr/local/gfortran/bin/gcc
F90COPT= -O3 -ffast-math -march=pentium4 -msse2 -mfpmath=sse
FCOPT=-O3 -ffast-math -march=pentium4 -msse2 -mfpmath=sse
CCOPT=-O3 -ffast-math -march=pentium4 -msse2 -mfpmath=sse
####################### Section 2 #######################
# Define your linker and linker flags here #
##########################################################
F90LINK=/usr/local/mpich-ifc80/bin/mpif90 -g -CB -no_cpprt
FLINK=/usr/local/mpich-ifc80/mpif77 -g -CB -no_cpprt
MPF90=/usr/local/mpich-ifc80/bin/mpif90 -g -CB -no_cpprt
MPCC=/usr/local/mpich-ifc80/bin/mpicc -g -CB -no_cpprt
F90LINK=/usr/local/mpich-gfortran/bin/mpif90
FLINK=/usr/local/mpich-gfortran/mpif77
MPF90=/usr/local/mpich-gfortran/bin/mpif90
MPCC=/usr/local/mpich-gfortran/bin/mpicc
####################### Section 3 #######################
# Specify paths to libraries #
##########################################################
BLAS=-lblas-intel -L$(HOME)/NUMERICAL/LIB
BLACS=-lmpiblacs-intel -L$(HOME)/NUMERICAL/LIB
BLAS=-lblas-gcc41 -L$(HOME)/LIB
BLACS=-lmpiblacs-gfortran -L$(HOME)/LIB
####################### Section 4 #######################
# Other useful tools&defines #
##########################################################
SLUDIR=/usr/local/SuperLU_3.0
SLU=-lslu_lx_ifc8 -L$(SLUDIR)
SLU=-lslu_lx_gfort -L$(SLUDIR)
SLUDEF=-DHave_SLU_ -I$(SLUDIR)
UMFDIR=$(HOME)/LIB/Umfpack_gcc41
UMF=-lumfpack -lamd -L$(UMFDIR)
UMFDEF=-DHave_UMF_ -I$(UMFDIR)
# Add -DLargeFptr for 64-bit addresses
CDEFINES=-DAdd_ $(SLUDEF) $(UMFDEF)
AR=ar -cur

@ -1,118 +0,0 @@
L'inizializzazione del sistema prevede, ora, che l'assemblaggio del
descrittore e quello della matrice possano essere eseguiti
indipendentemente.
Durante la sua vita, il descrittore può trovarsi in due differenti
stati:
1. bld: stato di build. in questo stato è possibile aggiornare il
contenuto del descrittore attraverso la routine psb_dscins.
2. asb: stato assembled. questo è lo stato della rappresentazione
finale del descrittore ed è raggiunto a valle di una chiamata alla
routine psb_dscasb.
Durante la sua vita, la matrice può trovarsi in tre differenti
stati:
1. bld: stato di build. in questo stato è possibile aggiornare il
contenuto dela matrice attraverso la routine psb_spins.
2. asb: stato assembled. questo è lo stato della rappresentazione
finale della matrice ed è raggiunto a valle di una chiamata alla
routine psb_spasb.
3. upd: stato di update. è lo stato in cui è possibile (attraverso
una chiamata alla routine psb_spasb) rigenerare la matrice.
- Assemblaggio contestuale di matrice e descrittore
Il procedimento da seguire prevede il seguente ordine di chiamate:
1. psb_dscall: allocazione del descrittore. Alla fine di questo
step lo stato del descrittore sarà bld
2. psb_spall: allocazione della matrice. Alla fine di questo
step lo stato della matrice sarà bld
3. psb_spins: in questo caso sia il descrittore che la matrice
saranno nello stato bld. Quindi la psb_spins invoca la
psb_dscins per portare il descrittore in uno stato pre-asb e
poi effettivamente inserisce i coefficienti nella
matrice (che quindi sarà anch'essa in uno stato
pre-asb). Dunque, nel caso di costruzione/assemblaggio
contestuale di matrise e descrittore, il contenuto del
descrittore è implicitamente aggiornato da questa
chiamata. (nel caso separato bisognerà esplicitamente
prevedere questa fase attraverso una chiamata alla psb_dscins)
4. psb_dscasb: il descrittore viene assemblato e quindi portato
allo stato asb.
5. psb_spasb: la matrice viene assemblata e quindi portata
allo stato asb.
- Assemblaggio di descrittore e matrice indipendenti
Il procedimento da seguire per costruire/assemblare il descrittore
prevede il seguente ordine di chiamate:
1. psb_dscall: allocazione del descrittore. Alla fine di questo
step lo stato del descrittore sarà bld
2. psb_dscins: il descrittore viene inizializzato a partire dal
pattern di sparsità della matrice e dal partizionamento. Alla
fine di questo step sarà in uno stato pre-asb
3. psb_dscasb: il descrittore viene assemblato e quindi portato
allo stato asb.
Il procedimento da seguire per costruire/assemblare la matrice
prevede il seguente ordine di chiamate:
1. psb_spall: allocazione della matrice. Alla fine di questo
step lo stato della matrice sarà bld
2. psb_spins: i coefficienti vengono effettivamente inseriti
nella matrice che sarà portata ad uno stato pre-asb.
3. psb_spasb: la matrice viene assemblata e quindi portata
allo stato asb.
- Aggiornamento della matrice
Se il pattern di sparsità della matrice non cambia, la matrice può
essere aggiornata attraverso il seguente procedimento:
1. psb_sprn: reinizializza la matrice. Alla fine di questo step
la matrice sarà nello stato upd
2. psb_spins: i coefficienti della matrice vengono reinseriti
3. psb_spasb: la matrice viene assemblata e riportata nello stato
asb.
La gestione degli errori
La nuova gestione degli errori prevede la creazione di uno stack di
messaggi di errore che possa consentire di seguire a ritroso la
sequenza di chiamate di routine fino ad arrivare a quella in cui
l'errore è stato rilevato. Tutte le nuove interfacce prevedono un
argomento "info" il quale ritorna un valore > 0 se all'interno della
routine chiamata è stato rilevato un errore. Dunque ogni volta che
si rileva una condizione di errore (o per verifica diretta o perchè
una routine chiamata ha ritornato info>0) occorre mettere l'errore
in cima allo stack per mezzo della routine
psb_errpush(info,name,i_err,a_err) in cui:
info: codice di errore (si veda SRC/F90/errormod.f90 per una
corrispondenza codice-messaggiodierrore)
name: stringa di lunghezza 20 contenente il nome della routine
che invoca la psb_errpush()
i_err: opzionale. E' un array di 5 interi contenente informazioni
aggiuntive per il messaggio di errore (si veda errormod.f90)
a_err: opzionale. E' una stringa di 20 contenente informazioni
aggiuntive per il messaggio di errore (si veda errormod.f90)
attraverso la routine psb_seterrverbosity si può impostare la
verbosità del messaggio d'errore (se =1 viene stampato solo l'errore
in cima allo stack; se >1 vengono stampati tutti)
la routine psb_error(ictxt) provoca la stampa degli (dell') errori
(errore) sullo stack ed, eventualmente, stronca il set di processi.
l'argomento ictxt è opzionale: se è assente viene semplicemente
stampato il messaggio d'errore altrimenti viene anche abortita
l'esecuzione di tutti i processi.
la routine psb_seterraction(action) determina quale azione deve essere
intrapresa a fronte del rilevamento di un errore:
action =0 : la routine in cui è stato rilevato un errore (e quindi
dopo che l'errore stesso sia stato inserito sullo stack)
semplicemente ritorna al chiamante un codice di errore
action =1 : la routine in cui è stato rilevato un errore (e quindi
dopo che l'errore stesso sia stato inserito sullo stack)
prima di ritornare invoca la psb_error (e quindi, può, eventualmente
stroncare l'esecuzione di tutti i processi).

73
notes

@ -1,73 +0,0 @@
Struttura:
psblas:
psblas/src: la directory contenente il codice sorgente
psblas/src/comm: contiene tutte le routine preposte allo scambio di
dati
psblas/src/internals: contiene una serie di routine utilizzate per
l'assemblaggio dei descrittori di comunicazione e per
lo scambio di dati (psi_dswap_data e psi_dswap_tran)
psblas/src/methd: contiene l'implementazione dei metodi iterativi
psblas/src/modules: contiene i moduli con le interfacce, le
definizioni di tipi e di costanti
psblas/src/prec: contiene tutte le routine preposte alla generazione e
applicazione dei precondizionatori
psblas/src/psblas: contiene le routine algebriche parallele
psblas/src/serial: contiene l'implementazione seriale di routine
algebriche e ausiliarie
psblas/src/serial/aux: routine ausiliarie (in realtà c'è rimasto be poco)
psblas/src/serial/coo: routine relative al formato coo
psblas/src/serial/csr: routine relative al formato csr
psblas/src/serial/dp: routine per l'assemblaggio e la conversione da
un formato all'altro
psblas/src/serial/f77: si tratta delle routine algebriche. queste
vengono chiamate all'interno delle routine in
psblas/src/psblas.
psblas/src/serial/jad: routine relative al formato jad
psblas/src/tools: tutte le routine per la generazione e rigenerazione
di descrittori e matrici
psblas/test: programmi di test
Schema di nomenclatura:
tutti i simboli (quindi routine, tipi dato, costanti, moduli etc...)
devono avere il prefisso psb_. I tipi hanno il suffisso "_type" (quindi
quello che prima era d_spmat adesso diventa psb_dspmat_type), tutti i
moduli hanno il suffisso "_mod".
Interfacce subroutine & argomenti:
l'articolo di Carney et al. richiede questa convenzione per l'ordine
degli argomenti:
1- arguments specifying options (tipo TRANS, UNITD etc...)
2- arguments specifying problem dimensions
3- input scalar associated with input matrices
4- description of sparse input matrices (che sarebbe i nostri FIDA e
DESCRA)
5- description of dense input matrices
6- input scalar associated with input-output matrices
7- description of input-output matrices
8- error processing informations
9- workspace
10- length of workspace
tutto questo va rivisto nell'ottica f90 e, quindi, con i tipi dato
user-defined e con gli argomenti opzionali.
Attualmente, in linea di massima, le interfacce delle routine
algebriche hanno sempre desc_a (il descrittore) e info (il codice di
errore riportato) nelle ultime posizioni prima dei parametri
opzionali. I parametri opzionali contengono sempre gli argomenti al
punto 1 oltre che jx, jy e k che definiscono il sottopreblema su cui
effettuare l'operazione richiesta. Per tutto il resto non c'è uno
schema ben definito e viene, generalmente seguito l'ordine con cui gli
operandi appaiono nella scrittura della formula matematica relativa
all'operazione implementata nella subroutine. si potrebbe pensare a
come risistemare la cosa ma secondo me è abbastanza chiara.
Loading…
Cancel
Save