View Full Version : matrici enormi...
Ciao,
sono sempre qua con le mie matrici....
Mi nasce un dubbio... Se tratto matrici enormi, supponiamo 100kx100k reali (float o meglio double) è ovvio che un paio di c@zzi li avrò... Se programmo in fortran, posso dire di allocare e disallocare memoria, ma serve a poco. Il C forse è migliore, forse Visual C++ è ancora meglio con la classe __gc.... ma avrò sempre e cmq c@zzi...
Avete idee in merito?
Come funzionano i programmi di simulazione fluidodinamica che fanno un casino di conti? O forse non usano contemporaneamente, come serve a me, 1e+8 ... 1e+10 float o double?
Mmmm, si ma tu cosa vuoi usare?
Hai fatto il discorso dell'allocare/liberare memoria...
Vuoi farlo con matlab?
Mi sembra di ricordare che con Matlab per liberare la memoria occupata da una variabile si usi il comando "clear"...ma è + di un anno che non lo tocco quindi potrei sbagliarmi.
Per allocare invece non c'è problema, lo fa in automatico quando definisci la variabile...
Per quanto riguarda le dimensioni...100k*100k = 10M
Se double occupa diciamo 4 byte, allora saranno 40 i Mb riservati per tale matrice... nemmeno tanti se consideriamo quanta ram monta in generale un pc oggi. Poi considera anche la memoria di massa alla quale il s.o. va ad attingere e quindi non dovresti avere problemi particolari a gestire tali matrici se non per l'aumento del tempo di esecuzione: accedere a disco è infinitamente + lento...
Swap swap swap swap swap :D
no,no,scusa... non mi sono spiegato... intendevo matrici di 100000 righe x 100000 colonne di float o double... Fa circa 10 MILIARDI di float allocati contemporaneamente... :eek: :eek: :eek:
Con matlab non ci penso neanche ad avventurarmi... Diciamo che posso usare o fortran o C o C++ o Visual C++ .NET....
Cerco un metodo che sia lento ma che mi consenta di fare i calcoli su un pc con, diciamo, 1 Gb di RAM...
Idee?
Dipende dai calcoli che ci devi fare, ma in generale potresti applicare una suddivisione della matrice...ad esempio matrice 6x6:
1 0 1 0 0 1
1 1 1 1 1 0
1 0 0 0 0 1
0 1 1 0 0 0
1 1 0 0 0 1
0 0 0 1 1 1
a =
1 0
1 1
b =
1 0
1 1
c = e così via a sottomatrici di 2x2
alla fine avresti una matrice 3x3
a b c
d e f
g h i
Per operazioni quali addizioni e moltiplicazioni puoi prendere le sotto matrici ed elaborarle in modo da dover lavorare con matrici di dimensioni più ridotte.
Quindi puoi utilizzare il disco rigido come memoria dove salvare dati temporanei e dati finali mentre la ram per effettuare i calcoli con le sottomatrici di dimensioni più contenute.
Aloha!
proverò a vedere.... effettivamente quella delle sottomatrici non l'avevo pensata; mentre avevo già pensato a scrivere i dati su file... sarà un casino lento ma.... se non ci sono alternative...
Perchè non ci sono, vero?
;)
in 3D ogni nodo "vede" quelli vicini (per i volumi finiti ogni nodo vede i sei Est, Ovest, Nord, Sud, Top, Bottom)
==> matrici sparse (per i volumi finiti sistemi di equazioni lineari eptadiagonali)
==> algoritmi per matrici sparse a propagazione (per vol.finiti p.es. algoritmo di Thomas a direzioni alternate)
questo riduce di molto il numero dei coefficienti da memorizzare (non N² ma per.es. 7*N)
poi certo a un certo punto si deve swappare su HD ma mooooolto più i là di quanto verrebbe da pensare: vedi algoritmi multigrid.
Il testo introduttivo per eccellenza è:
S.V.Patankar – Numerical Heat Transfer and Fluid Flow – McGraw Hill
Patankar e Spalding sono gli autori del metodo di integrazione ai volumi finiti di Navier-Stokes, Fourier, Fick implementato in Fluent ...
lombardp
06-11-2003, 14:38
Originariamente inviato da cipi
no,no,scusa... non mi sono spiegato... intendevo matrici di 100000 righe x 100000 colonne di float o double... Fa circa 10 MILIARDI di float allocati
Secondo me non hai la "macchina adatta" per trattare queste grandezze:
Il float occupa 4 byte, il double 8 byte, fanno in totale 80GB per una matrice, ben oltre le capacita delle macchine "comuni".
Non puoi allocare 80GB ... semplicemente perché in Windows 32-bit (parlo di 2k/XP) un processo può vedere al massimo 4GB di memoria di indirizzamento virtuale.
Potresti lavorare su disco, però un disco da 80GB per ogni matrice non è molto comodo, neanche con le sotto-matrici.
con l'algoritmo di Patankar-Spalding si possono effettuare calcoli di 50*50*25 = 62500 nodi con solo 640 kB di RAM (era il limite del vecchio DOS)
Ora ti puoi sbizzarrire, e con i metodi multigrid arrivare un bel pezzo in là prima di swappare su HD.
Naturalmente le matrici vanno swappate in formato binario.
Naturalmente ti consiglio vivamente il Fortran90/95 come linguaggio che ti permette sintetiche scritture per le operazioni termine a termine tra matrici, per l'estrazione di matrici da matrici con criteri assolutamente arbitrari ecc.
tieni conto inoltre che i metodi a volumi finiti nella loro versione multigrid, pur derivando dalla discretizzazione e linearizzazione di equazioni differenziali alle derivate parziali, sono metodi intrinsecamente integrali e paralleli e si prestano quindi all'elaborazione contemporanea su cluster di computer.
e questo sposta ancora più in là lo swapping intensivo su HD.
scusa se insisto... ma visto che sei ferrato... :D :D
non devo fare calcoli fluido/termodinamici, anzi tutt'altro. Le matrici che devo trattare non sono sparse, non sono diagonali, non sono simmetriche... insomma non sono un ç@§§0!!! Questi metodi di cui mi parli vanno bene cmq?:confused:
Altra domanda... dici che il C non va bene? Gestisce meglio la memoria il Fortran del C?
grazie ancora...;) ;) ;)
Originariamente inviato da a2000
tieni conto inoltre che i metodi a volumi finiti nella loro versione multigrid, pur derivando dalla discretizzazione e linearizzazione di equazioni differenziali alle derivate parziali, sono metodi intrinsecamente integrali e paralleli e si prestano quindi all'elaborazione contemporanea su cluster di computer.
e questo sposta ancora più in là lo swapping intensivo su HD.
Se è così... dispongo di un cluster linux di 6 macchine biprocessore nuove nuove...:D
ferrato sarai tu visto che sei meccanico, io sono gasato (ing. chimico) :D :D :D
sei sicuro che non siano sparse ?
da quale problema fisico derivano ?
comunque un problema con n nodi con n² coefficienti <> 0 è quasi sicuramente mal posto, probabilmente con soluzioni instabili, probabilmente caotiche.
poi ci sono alcune cosine che bisogna sapere prima di avventurarsi, per esempio:
stabilità delle soluzioni iterative per matrici a diagonale dominante
buon condizionamento di una matrice
....
senno' al caos (eventuale) del sistema fisico descritto aggiungi il caos (garantito) delle soluzioni numeriche ottenute (ma buone per il gioco del lotto) :D
Originariamente inviato da cipi
Se è così... dispongo di un cluster linux di 6 macchine biprocessore nuove nuove...:D
beh, quasi come al Centro Meteo Epson ... :D
così ti puoi fare le previsioni del tempo dalla tua stanzetta a quella dela tua ragazza (80 anni) per non far prendere freddo al vettorino :oink:
Originariamente inviato da a2000
sei sicuro che non siano sparse ?
da quale problema fisico derivano ?
prooontoooo ?
scusa ma il mio acer ha deciso di prendersela con me oggi...:incazzed: :bsod:
Sto facendo delle analisi non fisiche: sono nuovi algoritmi decisionali che sto studiando... Sono robusti, testati e testati ma producono un sacco di informazioni (allo scopo di produrre una scelta appunto!)
Ogni singolo misero e miserabile numerino è importante e maledettamente diverso da zero...
Originariamente inviato da a2000
ferrato sarai tu visto che sei meccanico, io sono gasato (ing. chimico) :D :D :D
....
:eheh:
Gasato = ti scureggia il cervello? :D :D :D
PS
Quella di 80 anni mi ha lasciato... non le stavo dietro!!! :D :D :D
Comunque dove li allochi 80 Gb ? Secondo me non puoi lavorare su tutta la matrice contemporaneamente...
Io ti consiglio di fare una bel livello di astrazione che ti bufferizza varie aree delle matrici intorno ad ogni valore richiesto...poi il resto della matrice va su file...
Inoltre conoscendo a priori l'algoritmo puoi fare una bufferizzazione ad hoc che ti limita l'accesso al disco...
...spiegati un po' meglio... bufferizzare le matrici?
Una sola matrice...
Un esempio molto semplice...sai che la tua matrice lavora sequenzialmente su una colonna della matrice...carichi tutta la colonna dal file...la colonna successiva la carichi al momento in cui viene richiesto un elemento della colonna successiva...
Oppure sai che il tuo algoritmo lavora per N cicli in una zona di distanza massima 100 dal punto richiesto... Carichi in una matrice 200x200 i dati dal file... Quando il tuo algoritmo richiederà un dato al di fuori di questa zona la nuova zona verrà caricata dal file e la vecchia zona verrà sovrascritta da quella in memoria (se modificata)...
Ecco come potrebbe essere una classe di questo tipo:
#define SIZE 200
class vect {
double buffer[SIZE][SIZE];
int rbuf, cbuf; //riga e colonna dell'elemento [0][0] del buffer
void bufferizzazione(int riga, int col);
public:
vect();
double &get(int riga, int colonna);
};
vect::vect()
{
rbuf = cbuf = 0;
bufferizzazione(0, 0);
}
double &vect::get(int riga, int col)
{
if(riga < rbuf || riga >= rbuf + SIZE || col < cbuf || col >= cbuf + SIZE)
bufferizzazione(riga, col);
return buffer[riga - rbuf][col - c buf];
}
void vect::bufferizzazione(int riga, int col)
{
//carico dal file i dati della matrice realtivi alla posizione riga e col
//ad esempio potrei caricare tutti i dati da [riga][col] a [riga+SIZE-1][col+SIZE-1]
}
fico!!!!
Ci penso su, intanto grazie... ;)
Il problema di come trattare con la macchina matrici grandi è se vogliamo secondario:
-La domanda che devi farti è se linearizzare in questo modo il tuo problema sia la soluzione migliore(solo tu o chi conosce la problematica può dirlo).
-Trattare problemi che coinvolgono 100k x 100k è pericoloso se non si ha un minimo di base teorica.
-Una trattazione naive del problema (gauss-jordan) come ti ha detto a2000 ti da semplicemente numeri al lotto.Nel senso che si mangiano tutta la precisione double.Il solo pensiero di usare float poi ti porterebbe dritto al burrone(6 macchine 0 60 sono la stesa cosa:soluzione velocemente sbagliata ma sempre sbagliata).
quindi comincerei con una attento studio del secondo capitolo di numerical recipes (io lo sto facendo nei "ritagli");vedere se ti basta ed eventualmente "approfondire" (a2000 docet).
ps io mi sto ponendo il problema per delle 1000x1000.
A proposito a2000, fino a che ordine di sistemi si possono maneggiare in double senza procedure iterative di minimizzazione di errore?(lo so che forse non si può dire in assoluto)
Originariamente inviato da cipi
fico!!!!
Ci penso su, intanto grazie... ;)
se l'acqua calda ti sembra fica vuol dire che sei ancora all'abc :p
bravo verloc. guarda voglio accondiscendere la tua passione per il C++: per i problemi di buon condizionamento dei s.l. guardati l'ottimo
G.Buzzi-Ferraris – Metodi Numerici in C++ - Addison-Wesley
cionci mi fa piacere che ti ricordi del nostro esercizio sul prodotto righe per colonne :D
lombardp
07-11-2003, 09:50
Originariamente inviato da cionci
Comunque dove li allochi 80 Gb ? Secondo me non puoi lavorare su tutta la matrice contemporaneamente...
Io ti consiglio di fare una bel livello di astrazione che ti bufferizza varie aree delle matrici intorno ad ogni valore richiesto...poi il resto della matrice va su file...
Un unico file da 80GB? :eek:
IMHO :
Forse mi sbaglio, ma un problema di queste dimensioni (matrice 100kx100k) non è proprio fattibile con queste risorse, chissà forse lo affrontano al Sandia o al Lawrence Livermore con QUESTI (http://www.top500.org) aggeggini.
Mi sembra quindi assurdo disquisire sul "metodo migliore" per affrontarlo. Sarebbe molto più costruttivo cercare di ridurlo in complessità. Se da O(n^2) riesci in qualche modo a passare a O(NlogN), il problema da 80GigaQualcosa ti si riduce in un baleno a 4 MegaQualcosa... magari ce la fa anche Excel !
comunque cipi non ti preoccupare si fa tutto: devi solo venire a trovarmi e preparare 5000 €. :cool:
Originariamente inviato da a2000
bravo verloc. guarda voglio accondiscendere la tua passione per il C++:
Ti voglio stupire:
se qualcuno mi dicesse come linkare le librerie blas e lapack
per farle funzionare con il mio borland in windows sposerei la soluzione
C++ && Fortran (che secondo me è la migliore in assoluto)
Ho gia letto articoli su come mixarli, il problema sono le blas per windows (parliamoci chiaro:nel mio campo(ing civ italia) chi ca@@o
è che tiene linux nello studio professionale?)
quando avrò la possibiltà di farlo ti chiederò un po di "materiale fortran".
fra l'altro quando quegli stronzi dello standard c++ hanno ricevuto la proposta da quelli del F di definire un'interfaccia standard fra i 2 linguaggi,gli hanno risposto che se no sai quanti linguaggi avrebbero fatto la stessa richiesta?
strunz! :mad:
Appurato che con le expression templates (secondo lo standard c++ )è stato provato che si può fare codice veloce quanto il fortran;c'è solo un ca@@o di compilatore in grado di farlo: KAI-Intel-che-cost'-nu-sakk-e-sold perckè tutti gli altri non rispettano lo standard.
Quindi io,che ho la mente aperta vedo di trovare tutte le strade (fortran) :)
pubblicizzano Mathematica5 come capace di risolvere sistemi sparsi 100k * 100k in meno di 1 secondo con PentiumIV 1.8GHz, 1 GB RAM, Windows XP.
e direi che si può fare anche meglio.
http://www.wolfram.com/products/mathematica/images/large-spikey-fp.gif
cipì non ti sarai mica offeso.
o ti si sono scaricate le batterie dell'amplifon ?
[QUOTE]Originariamente inviato da lombardp
Un unico file da 80GB? :eek:
Anche più di un file...sempre organizzati oculatamente...
sull'oculatamente sono d'accordo
Originariamente inviato da a2000
cipì non ti sarai mica offeso.
o ti si sono scaricate le batterie dell'amplifon ?
cipiiiiiiiiii, iuuuuuu, c'è nessunoooo ????
o è l'amplifon o è l'acer PII 350 della nonna che ha squarrato al 4° prodotto scalare 1a riga per 4a colonna :rotfl:
Originariamente inviato da a2000
sull'oculatamente sono d'accordo
Mi stai dando ragione su qualcosa ? Cavolo...è una novità :D
ma guarda che io ti do ragione su tutto ad eccezione della sfumatura di colore della feluca.
Originariamente inviato da a2000
se l'acqua calda ti sembra fica vuol dire che sei ancora all'abc :p
L'importante è non restare all'abc della fica, vero a2000?:D :D
Originariamente inviato da a2000
comunque cipi non ti preoccupare si fa tutto: devi solo venire a trovarmi e preparare 5000 €.
Sogna!!!!!!
Originariamente inviato da a2000
cipì non ti sarai mica offeso.
o ti si sono scaricate le batterie dell'amplifon ?
Figurati, non mi sono offeso...
E' vero... sono, per alcuni versi, all'abc... soprattutto nella programmazione in Visual C++ (alla quale si riferiva il mio... "fico")
Inoltre mediamente mi occupo di creare algoritmi matematici, non di studiare le gabole di programmazione...
E poi, se avessi saputo risolvere il problema non avrei postato sul forum... ;)
Ciao a2000,
più modestia la prox volta... ;) ;) ;) ;)
Originariamente inviato da cipi
...
Inoltre mediamente mi occupo di creare algoritmi matematici, non di studiare le gabole di programmazione...
...
o ti occupi, mediamente, di utilizzare software commerciali ?
comunque ho apprezzato il tuo lavoro di tesi.
anche se non è necessario un algoritmo genetico per determinare che è necessario "riempire" dove ci sono turbolenze, distacchi di vena e depressioni.
/\/\@®¢Ø
11-11-2003, 02:01
Originariamente inviato da verloc
C++ && Fortran (che secondo me è la migliore in assoluto)
Ho gia letto articoli su come mixarli, il problema sono le blas per windows (parliamoci chiaro:nel mio campo(ing civ italia) chi ca@@o
è che tiene linux nello studio professionale?)
che problemi hai nel linkare Fortran e C++ (in altri termini, che compilatore Fortran stai usando ?)
fra l'altro quando quegli stronzi dello standard c++ hanno ricevuto la proposta da quelli del F di definire un'interfaccia standard fra i 2 linguaggi,gli hanno risposto che se no sai quanti linguaggi avrebbero fatto la stessa richiesta?
Non hanno tutti i torti, comunque se non ricordo male ci sono solo 4-5 modi diversi di chiamare funzioni fortran da C, a seconda del compilatore Fortran utilizzato, di solito si tratta di provarle tutte e 'smanacciare a caso' con gli switch del compilatore C++ :D
(Al piu' puoi chiedere ad a2000 un programma VB che ti genera tutte le possibili alternative senza dovertele scrivere a mano ;) :D)
Appurato che con le expression templates (secondo lo standard c++ )è stato provato che si può fare codice veloce quanto il fortran;c'è solo un ca@@o di compilatore in grado di farlo: KAI-Intel-che-cost'-nu-sakk-e-sold perckè tutti gli altri non rispettano lo standard.
Il gcc 3.x non dovrebbe essere malaccio in questo, hai gia provato ed ottenuto risultati negativi ?
Ah,ciao Marco :)
No fin'ora non ho fatto nulla,ho scoperto da poco che si potevano mixare F e C-C++ e ho raccolto materiale "didattico".Per ora non ho neanche il compilatore.
Sono impegnato al momento a prendere il pezzo di carta...
Dopo 12 mesi di lavoro il prof mi ha detto:non si potrebbe rendere + semplice il programma? :muro:
(lui capisce di comp e soft come io so andare in deltaplano)
Torniamo a noi,si hai ragione non penso ci saranno problemi nel chiamare le funzioni.
Non ho provato il gcc semplicemente perchè voglio mantenere i BCB5 come framework (senza la comodità grafica non andrei molto lontano dato che il tipo di problemi che tratto involgono la creazione di mesh graficamente etc).
Scusa l'ignoranza ma gcc funziona sic et simpliciter su windows o devo usare (non mi ricordo come si chiamano) quelle librerie che trasformano windows in linux?
Il problema è la Blitz che è quanto di più veloce esista in c++ (provala)
http://www.oonumerics.org/blitz/
Lo so che darò un colpo al cuore del mio amico a2000 :cry:
http://www.oonumerics.org/blitz/benchmarks/
http://www.oonumerics.org/blitz/benchmarks/daxpy.html
(In teoria)
"Will C++ be faster than Fortran? "
http://osl.iu.edu/~tveldhui/papers/iscope97/index.html
(in pratica:meglio linkare lapack)
Per ora l'unica che mi funziona senza problemi è la TNT (veramente facile da usare)
ma con tutte le ottimizzazioni sul mio PII 350 nel famoso test 1000x1000 ci metteva 150 secondi :cry:
e non ha un sistema di fattorizzazione per matrici sparse(almeno così mi pare)
http://math.nist.gov/tnt/index.html
qualcuno la può provare con un altro compilatore?
Ci vogliono davvero 10 minuti credetemi!
(forse sono io scemo che non setto bene i flag del compilatore,eppure le ho provate tutte per far andare il test + veloce)
Domanda : può influire l'avere il processore con le istruzioni SSE sulla velocità di un prodotto di matrici?
sono solo brevi estratti di quello che c'è nella guida in linea di MSFortranPowerStation 4.0
Programming with Mixed Languages
Mixed-language programming is the process of building programs in which the source code is written in two or more languages. It is frequently worthwhile because it enables you to:
· Call existing code that is written in another language
· Use procedures which may be difficult to implement in a particular language
· Gain advantages in processing speeds
Microsoft provides 32-bit versions of Fortran, Visual C++, Visual Basic, and MASM; mixed-language programming is possible among all these languages. Mixed-language programming in Win32 is different from that in 16-bit environments, but in many respects it is easier.
Mixed-language programming is the process of establishing rules for naming variables and procedures, for stack use, and for argument passing among routines written in different languages. These rules, as a whole, are the calling convention.
A calling convention includes:
· Stack considerations
· Does a routine receive a varying or fixed number of arguments?
· Which routine clears the stack after a call?
· Naming conventions
· Is lowercase or uppercase significant or not significant?
· Are names decorated (as in Visual C++)?
· Argument passing protocol
· Are arguments passed by value or by reference?
· What are the equivalent data types and data structures among languages?
This section gives you the information you need to establish a calling convention among routines written in Fortran, C, Visual C++, Visual Basic, and assembly language. It is organized into the following sections:
· Overview of Mixed-Language Issues
· Exchanging and Accessing Data
· Handling Data Types
· Fortran/Visual C++ Mixed-Language Programs
· Fortran/Visual Basic Mixed-Language Programs
· Fortran/MASM Mixed-Language Programs
Fortran PowerStation/Visual C++ Mixed-Language Programs
After you have understood and reconciled the calling, naming and argument passing conventions between Fortran and C, you are ready to build an application. If you are using Visual C/C++ you can edit, compile and debug your code within Microsoft Developer Studio. If you are using another C compiler, you can edit your code within Microsoft Developer Studio by selecting File/New and choosing Visual C/C++ source or by selecting Edit/Properties and choosing Visual C/C++ in the General Style. However, if you are not using Visual C/C++, you must compile your code outside Microsoft Developer Studio and either build the Fortran/C program on the command line or add the compiled C .OBJ file to your Fortran project in Microsoft Developer Studio.
As an example of building from the command line, if you have a main C program CMAIN.C that calls Fortran subroutines contained in FORSUBS.Fortran 90, you can create the CMAIN application with the following commands:
cl /c cmain.c
fl32 cmain.obj forsubs.f90
The Fortran compiler accepts a main program written in C and compiled by the C compiler. The FL32 compiler compiles the .F90 file and then has the linker create an executable file under the name CMAIN.EXE using the two object files.
Either compiler can do the linking, regardless of which language the main program is written in; however, if you use the FL32 compiler first, you must include LIBF.LIB with the C compiler, and you might experience some difficulty with the version of LIBC.LIB used by the C compiler. For these reasons, you might prefer to use the C compiler first.
If you are using Microsoft Visual C/C++, Microsoft Developer Studio creates mixed Fortran/C applications transparently, with no special directives or steps on your part. You can edit and browse your C and Fortran programs with appropriate syntax coloring for the language. You can add C source files to your Fortran project or Fortran source files to a C project, and they will be compiled and linked automatically. When you debug a mixed Visual C/Fortran application, the debugger will adjust to the code type as it steps through: the C or Fortran expression evaluator will be selected automatically based on the code being debugged, and the stack window will show Fortran data types for Fortran procedures and C data types for C procedures.
When printing from Visual C++ programs while calling Fortran subprograms that also print, the output may not appear in the order you expect. In Visual C++, the output buffer contents are not written immediately, but written when the buffer is full, the I/O stream is closed or the program terminates normally. The buffer is said to be “flushed” when this occurs. To make sure interleaving Visual C++ and Fortran program units print in the order expected, you can explicitly flush the Visual C++ buffers after an output command with the flushall, fflush, fclose, setbuf, or setvbuf Visual C++ library calls.
Multithreaded applications should have full multithread support, so if you use LIBFMT.LIB, be sure LIBCMT.LIB is specified as a default library.
ancora un pezzettino:
Overview of Mixed-Language Issues
Mixed-language programming involves a call from a routine written in one language to a function, procedure, or subroutine written in another language. For example, a Fortran main program may need to execute a specific task that you want to program separately in an assembly-language procedure, or you may need to call an existing DLL or system procedure.
Mixed-language programming is possible with Microsoft languages because each language implements functions, subroutines, and procedures in approximately the same way. Table 22.1 shows how different kinds of routines from each language correspond to each other. For example, a C main program could call an external void function, which is actually implemented as a Fortran subroutine.
Table 22.1 Language Equivalents for Calls to Routines
Language Call with return value Call with no return value
Fortran FUNCTION SUBROUTINE
C and Visual C++ function (void) function
Visual Basic Function Sub
Assembly language Procedure Procedure
There are some important differences in the way languages implement routines. Argument passing, naming conventions and other interface issues must be thoughtfully and consistently reconciled between any two languages to prevent program failure and indeterminate results. But the advantages of mixed-language programming often make the extra effort worthwhile. A summary of a few mixed-language advantages and restrictions follows:
· Fortran/Assembly Language
Assembly-language routines are small and execute very quickly because they don’t require initialization as do high-level languages like Fortran and C. Also, they allow access to hardware instructions unavailable to the high-level language user. In a Fortran/assembly-language program, compiling the main routine in Fortran gives the assembly code access to Fortran high-level procedures and library functions, yet allows freedom to tune the assembly-language routines for maximum speed and efficiency. The main program can also be an assembly-language program.
· Fortran/Visual Basic
A mix of Fortran and Visual Basic 4.0 (32-bit) allows you to use the easy-to-implement user-interface features of Visual Basic, yet do all your computation, especially floating-point math, in Fortran routines. In a Fortran/Visual Basic program, the main routine must be Visual Basic. It is not possible to call Basic routines from Fortran.
· Fortran/C
Generally, Fortran/C programs are mixed to allow one to use existing code written in the other language. Either Fortran or C can call the other, so the main routine can be in either language.
This section presents an explanation of the keywords, attributes, and techniques you can use to reconcile differences between Fortran and other languages. Adjusting calling conventions, adjusting naming conventions and writing interface procedures are discussed in the next sections:
· Adjusting Calling Conventions
· Adjusting Naming Conventions
· Prototyping a Procedure in Fortran
After establishing a consistent interface between mixed-language procedures, you then need to reconcile any differences in the treatment of individual data types (strings, arrays, and so on). This is discussed after conventions and prototyping in the section Exchanging and Accessing Data.
Note This section uses the term “routine” in a generic way, to refer to functions, subroutines, and procedures from different languages.
Grazie!!! :)
Mi sa tanto che vuoi dire che aspiro al suicidio! :D
E mi sa pure che la fattorizzazione sulle sparse me la devo fare da solo.
Originariamente inviato da a2000
o ti occupi, mediamente, di utilizzare software commerciali ?
Non è così.... Algoritmi di ottimizzazione multiobiettivo non ce ne son molti in commercio... e forse lavoro in uno dei due unici posti al mondo dove si sviluppano :D :D :D
Originariamente inviato da a2000
comunque ho apprezzato il tuo lavoro di tesi.
anche se non è necessario un algoritmo genetico per determinare che è necessario "riempire" dove ci sono turbolenze, distacchi di vena e depressioni.
:confused:
Scusa ma mi sembra un po' riduttivo come commento ad una tesi di 14 mesi!!!:eek: :eek:
Inoltre lo scopo non era quello unico di ottimizzare una macchina, già buona in partenza, ma confrontare i risultati numerici con quelli sperimentali e le conclusioni.... sono da pubblicazione internazionale....
Lascia stare che non sarò un bravo programmatore, ma nel mio campo....
PS
Cmq, grazie anche alle tue osservazioni, sto portando il problema da n^3 a 3*n.... ;)
Originariamente inviato da cipi
Cmq, grazie anche alle tue osservazioni, sto portando il problema da n^3 a 3*n.... ;)
Una bella differenza direi ;)
Originariamente inviato da cionci
Una bella differenza direi ;)
Direi di si.... Prima avevo bisogno del cluster della nasa... ora mi basta il mio XP2200+.... Godo.... :D :D :D
PS
Grazie anche a te, al solito... :ave:
;)
Uzi[WNCT]
11-11-2003, 16:07
Scusa, perchè dicevi:
Originariamente inviato da cipi
Con matlab non ci penso neanche ad avventurarmi...
La mia è solo una domanda: dato che da poco (per il corso di calcolo numerico :rolleyes: ) sto usando Matlab, vorrei sapere se non è adatto a trattare matrici del genere. Ho provato a fare una 2500x2500 (con numeri random float all'interno) e ci ha messo circa 50secondi col mio XP 1800. Ammetto cmq che l' occupazione di ram era esagerata..... di 330 mb liberi, al momento dell'esecuzione ne restavano circa 60 ....:muro:
Originariamente inviato da cipi
Grazie anche a te, al solito... :ave:
;)
Ma di niente....figurati !!! :)
/\/\@®¢Ø
11-11-2003, 17:41
Originariamente inviato da verloc
Ah,ciao Marco :)
Torniamo a noi,si hai ragione non penso ci saranno problemi nel chiamare le funzioni.
Non ho provato il gcc semplicemente perchè voglio mantenere i BCB5 come framework (senza la comodità grafica non andrei molto lontano dato che il tipo di problemi che tratto involgono la creazione di mesh graficamente etc).
Se usi ATLAS (http://www.netlib.org/atlas) non dovresti avere alcun problema, l'interfaccia C la compili senza usare il Fortran ed esistono versioni precompilate per diversi tipi di processori.
Scusa l'ignoranza ma gcc funziona sic et simpliciter su windows o devo usare (non mi ricordo come si chiamano) quelle librerie che trasformano windows in linux?
Non programmo sotto windows, pero' se non sbaglio ci sono due 'incarnazioni' diverse del gcc, il cygwin che praticamente e' un ambiente unix sotto windows ed un altro (argh... i nomi !!! :muro: ) che invece e' un compilatore "normale" (se ti scarichi Dev-C++ dovresti avere il secondo); qualcuno piu' ferrato ti sapra' dire di piu'.
Domanda : può influire l'avere il processore con le istruzioni SSE sulla velocità di un prodotto di matrici?
Si'; con le SSE si possono fare operazioni con quattro valori in singola precisione; con le SSE2 (P4) con due valori in doppia precisione. ATLAS riconosce automaticamente tali caratteristiche e le sfrutta.
Per la fattorizzazione di matrici sparse: esistono alcune librerie gratuite in giro, perlopiu' in Fortran, ma trovi anche le interfacce C++, e le ho usate con successo un po' di tempo fa per lavoro (matrici sparse 200000x50000).
Purtroppo ora non ricordo i nomi :cry: , l'unica che mi viene in mente e' SuperLU (per la decomposizione LU appunto), le altre sono in un cassetto a qualche migliaio di chilometri da dove mi trovo :muro: :D. In questo caso pero' devi avere l'interfaccia Fortran per le BLAS, ma ancora, se usi ATLAS non dovresti avere (grossi) problemi, (Oddio... meglio se chiedo a mio fratello i Makefiles, c'ho messo piu' di una settimana a trovare il modo giusto per linkare... :D :D :D ).
ma guardatevi le librerie in C++ pronte per l'uso nel CD allegato all'ottimo:
G. Buzzi-Ferraris, Metodi Numerici e Software in C++, Addison-Wesley
Originariamente inviato da cipi
Direi di si.... Prima avevo bisogno del cluster della nasa... ora mi basta il mio XP2200+.... Godo.... :D :D :D
PS
...
;)
e vuoi scommettere che se me lo passi ti basta il Commodore128 :D :D :cool:
che ho conservato insieme al "disco rigido" su cassette audio :)
ma a te non servirà: tanto, per il tuo problema, dovrai digitare ogni volta non più di 7 righe di codice ! :D :D
Originariamente inviato da a2000
ma guardatevi le librerie in C++ pronte per l'uso nel CD allegato all'ottimo:
G. Buzzi-Ferraris, Metodi Numerici e Software in C++, Addison-Wesley
Le ho viste Gia,la classe per le matrici è proprio naive.
sembrerà un eresia ma se te lo dico io "che non sono un c..."che ha uno stile di programmazione da mani nei capelli....Pensa che non ottimizza neanche memorizzando la matrice in solo vettore.
Meglio quella di Barton-Nackmann.
di Buzzi,forse posso sfruttare il materiale sulle sparse.
Originariamente inviato da verloc
Le ho viste Gia, la classe per le matrici è proprio naive.
sembrerà un eresia ma se te lo dico io "che non sono un c..."che ha uno stile di programmazione da mani nei capelli....Pensa che non ottimizza neanche memorizzando la matrice in solo vettore.
Meglio quella di Barton-Nackmann.
di Buzzi,forse posso sfruttare il materiale sulle sparse.
può essere che abbia distribuito quelle per uso "didattico" in cui evita un'ottimizzazione di alcuni aspetti, per esempio le risorse di memoria, che andrebbero a discapito della "corrispondenza" tra codice e algoritmo algebrico.
comunque le sue procedure, pardon classi, sono rinomate per essere molto robuste e veloci, in particolare quelle per la soluzione di sistemi di equazioni algebrico-differenziali.
P.S.
può anche darsi che quando può (didattica) abbia un rifiuto psicologico a utilizzare "un solo vettore" perchè quando programmava in Fortran77 memorizzava tutte le variabili in un solo vettore e le andava a cercare non con il nome, ma con un puntatore numerico ! :eek:
Quindi Marco per riepilogare:
1)scarico Atlas
2)scarico le Blas (già precompilate?)
Atlas mi fornisce l'interfaccia alle librerie Blas senza che devo compilarle in Fortran?
ps Miezzeca:se ci hai messo tu una settimana,io arrivo alla pensione!!!
Cmq adesso sono solo ad uno stadio di intenzione.All'occcorrenza ti posso contattare?(No te preocupe,non ti assillerò :D)
Cmq era così bella la MTL (se a2000 vede i bench si incazza :oink: )
(non c'è stato verso di farla andare)
http://www.osl.iu.edu/research/mtl/performance.php3
ma la decomposizione LU è un piacere che non ti puoi negare ! :D
/\/\@®¢Ø
11-11-2003, 21:27
Originariamente inviato da verloc
Quindi Marco per riepilogare:
1)scarico Atlas
2)scarico le Blas (già precompilate?)
Atlas mi fornisce l'interfaccia alle librerie Blas senza che devo compilarle in Fortran?
no, le Atlas sono una "versione" delle Blas che fa l'auto-tuning del codice in base alla piattaforma sottostante (in modo da sfruttare SSE ad esempio, ma anche di individuare e utilizzare correttamente la cache L1 presente e cose del genere). Forniscono sia l'interfaccia C che quella Fortran (a seconda di quel che vuoi). All'indirizzo che ti ho indicato sopra dovrebbero essere presenti comunque delle versioni precompilate per specifici processori.
ps Miezzeca:se ci hai messo tu una settimana,io arrivo alla pensione!!!
Beh, se usi l'interfaccia C e' facile, si tratta di includere l'header; diverso se usi librerie di piu' alto livello: anche se scritte in C/C++ spesso si appoggiano all'interfaccia Fortran ed e' qui che ho avuto un po' di intoppi (tieni presente che non avevo mai linkato codice di diversi linguaggi in precedenza).
Risolto questo pero' tutto viaggia alla perfezione, si tratta solo di fare l'abitudine ai nomi delle funzioni e all'elenco interminabile di parametri (o perdere un po' di tempo e farsi una classe wrapper).
Cmq adesso sono solo ad uno stadio di intenzione.All'occcorrenza ti posso contattare?(No te preocupe,non ti assillerò :D)
No problem, tieni pero' presente che fino a meta' dicembre sono un po' a zonzo e magari potresti aspettare un po' per una risposta :).
In bocca al lupo per la tesi !
Grazie!
Come al solito sei paziente e gentile! :)
...crepi!
che bo' fa' : Fortran rulez ! :D
a /\/\@®¢Ø ma che ci fai in sardegna d'inverno ?! :D :D
Originariamente inviato da Uzi[WNCT]
Ho provato a fare una 2500x2500 (con numeri random float all'interno) e ci ha messo circa 50secondi col mio XP 1800. Ammetto cmq che l' occupazione di ram era esagerata..... di 330 mb liberi, al momento dell'esecuzione ne restavano circa 60 ....:muro:
Appunto... ti sei risposto da solo. Matlab è potente ma... mamma mia.... La ram!!!!!:( :( :(
ciao ;)
Originariamente inviato da a2000
ma a te non servirà: tanto, per il tuo problema, dovrai digitare ogni volta non più di 7 righe di codice ! :D :D
Può essere... 7 righe di codice che valgono un bel po'.... :D :D :D
Originariamente inviato da /\/\@®¢Ø
Non programmo sotto windows, pero' se non sbaglio ci sono due 'incarnazioni' diverse del gcc, il cygwin che praticamente e' un ambiente unix sotto windows ed un altro (argh... i nomi !!! :muro: ) che invece e' un compilatore "normale" (se ti scarichi Dev-C++ dovresti avere il secondo); qualcuno piu' ferrato ti sapra' dire di piu'.
Anch'io, solitamente, programmo in Linux ma ti assicuro che cygwin è una valida alternativa quando sei costretto a portarti il lavoro a casa nel portatile (e lavorare sotto winzoz...).
Sempre però che tu sia stato attento a scaricare tutti i pacchetti che sono necessari alla compilazione....
ciao ;)
Originariamente inviato da cipi
Può essere... 7 righe di codice che valgono un bel po'.... :D :D :D
sette delle mie. :cool:
vuoi vedere che il tuo problema te lo risolvo analiticamente ?
o analiticamente "a tratti".
Originariamente inviato da a2000
o analiticamente "a tratti".
Finiscila di sparare c***ate e invece spiegami come mai nel debug del mio programma in VC++NET, alla prima riga di un file header.h dove c'è scritto #using <mscorlib.dll>, mi dice
fatal error C1190: il codice gestito interessato richiede "#using <mscorlib.dll>" e l'opzione "/clr"
Il file del main program inizia con:
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include "header.h"
#using <mscorlib.dll>
#include <tchar.h>
using namespace System;
using namespace std;
Nota che non ho ottimizzato la compilazione ed uso quella di default.
ma guarda, io per pulire il cesso non uso VC++NET ma Drago Pulisan ! :D
per programmare invece uso CompaqVisualFortran e non uso mai librerie standard.
se mi esponi il tuo problema te lo risolvo.
...è quello scritto sopra il problema... non capisco l'errore segnalato dal debugger...
Cmq sposto il problema su un'altra discussione, perché qui è... :ot:
no, il tuo problema non è quello scritto sopra. quelle sono solo incrostazioni di calcare !
il tuo problema in termini matematici (ammesso che tu l'abbia formulato compiutamente).
non ti preoccupare sarò il tuo Cyprianò de Bergerac ! :friend: :sborone:
grazie... a parte la battutaccia ;)
Discussione spostata qui (http://forum.hwupgrade.it/showthread.php?s=&threadid=558830)
Ciao:friend:
/\/\@®¢Ø
12-11-2003, 17:09
Originariamente inviato da a2000
a /\/\@®¢Ø ma che ci fai in sardegna d'inverno ?! :D :D
Inverno ? :confused:
Giusto ieri sera abbiamo mangiato un po' di melone in giardino, in maglietta e pantaloncini (fa molto caldo in inverno a Cagliari :D;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.