Newsgroup: it.comp.lang.c++
Titolo: Il linguaggio più veloce del West

Ciao,
devo fare un programma che effettua dei calcoli che prendono tantissimo
tempo, molto semplici ma molto numerosi (essenzialmente una serie
lunghissima di sottrazioni e moltiplicazioni). Tuttavia il flusso del
programma non sarà elementare, ci saranno molti cicli nidificati.
Premesso che so programmare in Fortran e in C++ (oltre che in Basic che
scarterei a priori) e che quindi credo di poter facilmente passare anche al
C senza il ++, vi chiedo: essendo la priorità assoluta del mio compito
scrivere un programma veloce, quale di questi linguaggi mi conviene usare?
Grazie molte per i suggerimenti. Anche se so già che questo messaggio
scatenerà un putiferio di dibattiti :)))
Ciao e grazie ancora.
Hem


Assembler, o C
E spero non ne scatenera', dato che sei OT.
-- 
Mattia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311   - email: 
mbel...@cs.unibo.it
IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
Linux registered user 299762 @ Linux registered machine 213003

...

Dipende fondamentalmente dalle tue capacita' di astrazione e dalle
caratteristiche del problema, nel senso che e' necessario capire se
l'uso della forza bruta e' indispensabile, nel qul caso e'
probabilmente difficile superare del Fortran ben scritto, oppure se e'
possibile ricorrere alla "lazy evaluation" per assicurarsi di
effettuare esclusivamente i calcoli indispensabili, nel qual caso un
uso avanzato dei template C++ puo' risultare vantaggioso.
Un esempio del secondo caso puo' essere la necessita' di calcolare
grandi equazioni matriciali, delle quali si utilizzano solo pochi
elementi. In entrambe i casi una discriminante importante e' la
possibilita' di ricorrere a librerie di efficenza provata.
Ciao,
Nicola

"Hemingway" <a@b.c> wrote

Per prima cosa io mi concentrerei sull'algoritmo piu' che sul linguaggio...
i vantaggi di un linguaggio rispetto ad un altro sono spesso minimi rispetto
ai vantaggi offerti da un algoritmo migliore.
Detto questo, per quello che devi fare il Fortran e' probabilmente la scelta
"piu' veloce", ma non per questo migliore, come ho detto la differenza (se
presente) spesso e' minima e quindi dovresti guardare anche ad altri
fattori.
Tommy


"sottrazioni e moltiplicazioni" ? Curioso !
Di solito si parla di addizioni e moltiplicazioni.
Posso chiederti che tipo di problema stai affrontando ?
Comunque, senza conoscere la natura del problema, direi
che per prima cosa controllerei se esistono delle librerie
"ben assestate" che ti possono aiutare. In FORTRAN ne esistono
molte, specialmente di algebra lineare.
Se il tuo problema e' prettamente matematico e non
hai particolari complicazioni di strutture dati
dinamiche ma ti bastano dei buoni vecchi array, allora
punterei sul FORTRAN perche' (almeno un tempo) i
compilatori riuscivano ad ottimizzarlo meglio perche'
era un linguaggio piu' semplice.
Comunque non e' detto che risulti piu' veloce dello
stesso programma scritto in C o in C++. Dipende
molto anche da come lo scrivi. Se punti sulla velocita'
cercherei in ogni caso di mantenerlo semplice,
evitando magari astrazioni troppo spinte.
Ma in ogni caso la prima cosa da fare e' studiare bene
l'algoritmo. Vedere per esempio se puoi fare qualche
tipo di pre-processing che poi possa accelerare i calcoli,
etc.etc.
Non sono sicurissimo, ma mi sembra di ricordare che
il FORTRAN e il C quando memorizzano matrici usano
un diverso ordine degli elementi. Quindi lavorando
su una matrice di medio-grandi dimensioni (non so se e' il
tuo caso) bisogna stare attenti all'ordine al quale
si accede agli elementi per migliorare le prestazioni
della cache, che puo' incidere molto sul tempo finale.
(E appunto l'ordine migliore potrebbe essere diverso in C e in FORTRAN).
Sinceramente l'uso dell'assembler lo eviterei a meno che tu non
lo conosca gia' molto bene. E' vero che in alcuni casi
puo' portare dei benefici, ma se fai essenzialmente operazioni
aritmetiche allora e' probabile che il compilatore sappia
gia' bene come fare per produrre un eseguibile veloce,
e spesso trova delle "scorciatoie" che solo un umano molto
scafato puo' eguagliare.
ciao,
g.

 (E appunto l'ordine migliore potrebbe essere diverso in C e in FORTRAN).
Non userň matrici a due dimensioni, bensě le ridurrň ad array ad una sola
dimensione nei quali mi muoverň con l'uso di puntatori (questo almeno in
C/C++).
Grazie ancora!
Mauro

 appunto, a risolvere i sistemi lineari.
Beh, 3000 non direi che è proprio un ordine "elevatissimo"...
tuttavia, in questi casi, la prima domanda da porsi, forse, è
più che altro sul tipo delle matrici: sono sparse o no?
Se sono sparse il metodo di Gauss è spesso "molto peggiore assai di più"
:-) di un metodo iterativo.
Prima di partire "a testa bassa" su una qualsiasi implementazione, a meno
di "forza maggiore" - leggi: classico progettino per l'esame X - pensa
per bene prima all'algoritmo da usare.
Io devo studiare gli algoritmi di paginazione e prefetching su sistemi
iterativi "grandi" (*ben* più grossi di 3000 :-) e mi avvalgo di una
libreria di algebra lineare sviluppata da terzi in C (per esigenze di
"ufficialità") che usa metodi di impacchettamento per le matrici sparse.
Buon lavoro.
SiMoStro

Hemingway wrote:
ma io punterei molto al compilatore, se usi sistemi intel dai un 
occhiata ai loro compilatori, ti offrono anche gią routeine ottimizzate 
in asm per compiti specifici, sia per C che per fortran

...

Ciao.
Il linguaggio c'entra ben poco dipende tutto dall'implementazione del
compilatore.
Cioè se vuoi avere la massima velocità possibile devi trovare un
compilatore molto ottimizzato che in genere non va d'accordo con
freeware.
Non so i benchmark ma probabilmente quelli della Intel vanno 'forte' e
li trovi anche in versione per uso personale (anche se rischia che
quella per uso professionale abbia più cose per l'ottimizzazione....):
http://www.intel.com/software/products/global/eval.htm#compilers
Comunque da come descrivi il problema, probabilmente l'ordine di
preferenza è: fortran, c, c++, ma va provato, soprattutto se lavori
con macchine dall'architettura particolare ad esempio su alpha tra
usare il fortran Digital e quello Gnu può passarci un fattore 10, se
vuoi usare Gnu meglio il C (altro che sintassi del linguaggio).
Bye

 Bye
Non avevo pensato che ci potesse essere differenza tra un compilatore e
l'altro.
Grazie per i suggerimenti.
Ciao
Hem

 SiMoStro
Effettivamente la matrice dei coefficienti è sparsa, ma per motivi che qui
sarebbe troppo lungo spiegare avrei lo stesso intenzione di provare con la
triangolarizzazione. Comunque, ci sono routine freeware (ad esempio in C)
che svolgono operazioni tra matrici sparse con la notazione "compressa"?
I sistemi che devi risolvere tu di che ordine sono, così per avere un'idea?
Ciao
Hem

 che svolgono operazioni tra matrici sparse con la notazione "compressa"?
Darei un occhio a questa:
http://www.osl.iu.edu/research/mtl/
-- 
Gerolamo
www.overweb.it

 freeware.
Affermazione discutibile. L'ottimizzazione fornita dal compilatore
potra' al massimo darti un miglioramento lineare. Quello che conta
veramente e' la scelta dell'algoritmo, che deve sfruttare al massimo
eventuali caratteristiche specifiche del problema.
Nel caso specifico conviene utilizzare librerie di algebra lineare che
sfruttino le peculiarita' delle matrici su cui operano. Un esempio
potrebbe essere uBLAS, che fa parte delle librerie Boost:
http://www.boost.org/libs/numeric/ublas/doc/index.htm
Ciao,
Nicola

 un'idea?
Scusa per il ritardo della risposta, periodo
un po' incasinato questo!
Non ho particolari "limitazioni" sulla dimensione,
diciamo che globalmente dovrei lavorare su _grosse_
dimensioni "in pagine", dunque diciamo anche sopra
il milione di elementi.
A puro scopo "accademico", uso Laspack, č in C
ed usa la notazione compressa per le matrici sparse.
SiMoStro