Newsgroup: it.comp.os.linux.debian
Titolo: Velocizzare 2 o piu' cpu

Ho installato irqbalance per caso *, la mia domanda e': E' mai possibile
che abbia velocizzato a tal punto un eseguibile ELF (calcoli numerici) da
farlo scendere da circa 6 minuti a 4 minuti e 48 secondi?
 
Aggiungo pero' che il tempo di 6 minuti era con la wheezy, quindi forse
dipende anche dal kernel, perche' adesso sono con la jessie.
 
 
----------
* Perche' in console mi arrivavano sistematicamente questi messaggi (ma
non di errore):
 
Apr  6 01:03:52 debian kernel: [16243.253538] perf interrupt took too
 long (2503 > 2500), lowering kernel.perf_event_max_sample_rate to 50000
 
ed allora ho pensato che servisse installare linux-tools-3.16 (che
appunto dipende da irqbalance), perche' il comando perf non andava.
(e adesso vedro' se smettono di arrivare)
 
-- 
Tanti saluti
 

 dipende anche dal kernel, perche' adesso sono con la jessie.
 
Mi sa che dipende dal kernel, perche' con top ottengo cpu=100%, ma con
htop vedo che il 100% e' di cpu0 oppure (dopo un po') di cpu1, l'altra
resta sempre a zero o quasi a zero.
 
-- 
Tanti saluti
 

 resta sempre a zero o quasi a zero.
 
Speravo che qualche esperto ti rispondesse perche` trovo che l'argomento
sia molto interessante ed io ne so veramento poco o nulla.
Non credo cmq che un qualunque eseguibile possa usare la
parallelizzazione per il semplice fatto di girare su un computer con una
CPU multi core.
Credo invece che occorra scriverlo in un determinato modo e che questo
non sia neppure sempre possibile.
Da quel che ho visto provando tempo fa ad usare parallel ed anche ppss
https://code.google.com/p/ppss/
 
e` fattibile ad esempio nel caso si dia in input una lunga lista di file
ad un comando; l'esempio classico e` la compressione di una serie di
file presenti in una directory, oppure la conversione fra formati, ad
es. da MP3 a WAV.
Nel caso facessi qualche prova, posta poi per favore un resoconto che mi
interessa.
 
 

Addi' 13 apr 2015, M_M scrive: > mar, 07 apr 2015, 00:57:53, Yoda ha scritto: >> Mi sa che dipende dal kernel, perche' con top ottengo cpu=100%, ma con >> htop vedo che il 100% e' di cpu0 oppure (dopo un po') di cpu1, l'altra >> resta sempre a zero o quasi a zero. > Speravo che qualche esperto ti rispondesse perche` trovo che l'argomento > sia molto interessante ed io ne so veramento poco o nulla. Forse possiamo (posso) ripostarlo su .sys, la' c'e Leo che se gli va di rispondere spiega tutto di sicuro. > Non credo cmq che un qualunque eseguibile possa usare la > parallelizzazione per il semplice fatto di girare su un computer con una > CPU multi core. Considera al riguardo che per il kernel c'era (3-4 anni fa?) una direttiva da anteporre a make proprio per le due cpu, a quel tempo compilavo, ma non conviene (dico per me, quello compilato andava peggio di questo della deb). > Credo invece che occorra scriverlo in un determinato modo e che questo > non sia neppure sempre possibile. > Da quel che ho visto provando tempo fa ad usare parallel ed anche ppss > 
https://code.google.com/p/ppss/
 Poi lo guardo. > e` fattibile ad esempio nel caso si dia in input una lunga lista di file > ad un comando; l'esempio classico e` la compressione di una serie di > file presenti in una directory, oppure la conversione fra formati, ad > es. da MP3 a WAV. > Nel caso facessi qualche prova, posta poi per favore un resoconto che mi > interessa. Era per il problema di it.hobby.enigmi "[MAT] Fattoriali e potenze" (nell'ultimo post mio), se guardi c'e' il sorgente in C, pero' poi ci avevo aggiunto il cronometro per evitare time, lo copio (non scandalizzarti se e' molto scadente): ----------- #include <stdio.h> #include <math.h> #include <float.h> #include <limits.h> #include <stdlib.h> #include <time.h> double tot, j, n_cifre, enne, tempo; int n, k; main() printf("\n [01;33m [KScegliere 0 per uscire [K\n"); n=1; while (n != 0) printf("\n [00;36m [KIntrodurre l'esponente di 10:  [K"); scanf("%d", &n); tot=0; n_cifre=0; enne=1; for (k=1; k<=n; ++k) enne=enne*10; for (j=2; j<=enne; ++j) tot = tot + log10(j); n_cifre = tot/enne; printf("\nenne    = %.0lf\n",enne); printf("tot     = %.3lf\n",tot); printf("numero di cifre: %.3lf\n",n_cifre); printf("durata in sec.:  %.3f\n",(double)clock()/1000000-tempo); tempo=((double)clock()/1000000); printf("\n"); printf(" [01;31m [Kdurata totale:  [K%.3f\n",(double)clock()/1000000); printf("\n"); return 0; --------------------------- Per calcolare il numero esatto di cifre con esponente 10, vedi quanto ci metti. Ah... per compilarlo la riga avevo usato questa: $: gcc -Wall logfat.c -lm -o logfat e il gcc era quello della wheezy. Tanti saluti 

 non sia neppure sempre possibile.
 
infatti.
 
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?

 e il gcc era quello della wheezy.
 
il codice sopra non e' parallelo, girera' su un core solo.
tra la'ltro se gli metti un -O2 (O di otranto) gcc ottimizza il codice e
il programm gira piu' veloce.
man gcc per le altre opzioni.
 
qui:
http://mrbook.org/school/parallel/factorial_c.html
 
 
e qui:
http://stackoverflow.com/questions/20110466/non-recursive-factorial-in-c
 
 
ci sono due esempi di programm per calcolare il fattoriale parallelo.
Il primo usa MPI che e' una libreria apposta per semplificare la
scrittura di codice parallelo,
Il secondo usa i pthreads POSIX.


 Il secondo usa i pthreads POSIX.
 
Ecco: POSIX, infatti gli ha trovati. Grazie ciao
 
-- 
Tanti saluti
 

 (e adesso vedro' se smettono di arrivare)
 
Hanno smesso, mi sa che avevo visto giusto su perf.
Pero' ho visto che usa sempre la stessa cpu per tutta la durata, sulla
wheezy (se non confondo con elaborazioni piu' lunghe) alternava le cpu.
 
-- 
Tanti saluti
 

 dipende anche dal kernel, perche' adesso sono con la jessie.
 
Credo che dipenda da diversi algoritmi di switching del tempo CPU e 
dall'invalidazione di registri e cache.
 
Non lo vedo impossibile, se l'app prende pieno possesso di un core invece 
di doversi spostare o di doverlo condividere con altri processi, anche se 
molto brevi, scendere così tanto.
 
Bye.


Architecture: all
Conflicts: openmpi-common
Description-it: libreria per il passaggio di messaggi dalle alte prestazioni
- file comuni
 Open MPI è un progetto che combina tecnologie e risorse da parecchi altri
 progetti (FT-MPI, LA-MPI, LAM/MPI e PACX-MPI) per poter costruire la
 miglior libreria MPI disponibile. Open MPI è un'implementazione conforme con
 MPI-2 completamente nuova e offre vantaggi per venditori di sistemi e di
 software, sviluppatori di applicazioni e ricercatori nel campo
 dell'informatica.
 .
 Questo pacchetto contiene i file indipendenti dalla piattaforma per Open MPI.
Description-md5: 9c0f51b2af9c82590bef456d995f13d6
Homepage: 
http://www.open-mpi.org/
 
Tag: admin::cluster, field::biology, field::mathematics, role::app-data,
 role::data, use::checking
Section: net
Priority: extra
Filename: pool/main/o/openmpi/openmpi-common_1.6.5-9.1_all.deb
Size: 110488
MD5sum: 8689ef47ac67c1390e9edb073dca1848
SHA1: 8e570da420609e1f215f3abf6c682c321b48cdff
SHA256: a74226ea863bf482e2bc0d4025fd04caaa020f4bf541c5d1ed97d4e1d4578582
 
  Ti serviranno, ovviamente, i pacchetti di sviluppo.
 
 
  Ciao,
 
 
-- 
Alessandro Selli 
http://alessandro.route-add.net
 
AVVERTENZA: i messaggi inviati a "trappola" non mi arriveranno.
WARNING: messages sent to "trappola" will never reach me.


Prova con -O3, ottimizza ancora di piu !!
 

 Prova con -O3, ottimizza ancora di piu !!
 
allora esageriamo e usiamo -Ofast ;)



 
 
-Ofast
Disregard strict standards compliance. -Ofast enables all -O3 
optimizations. It also enables optimizations that are not valid for all 
standard-compliant programs. It turns on -ffast-math and the 
Fortran-specific -fno-protect-parens and -fstack-arrays.
 
 
Insomma, rischioso
Invece con -O3 se si programma bene non si hanno problemi
 
Un' altra caratteristica interessante è l' abilitazione delle 
ottimizzazioni per una cpu
Se non si è interessati alla  portabilità su cpu della stessa famiglia 
puo essere un' altra soluzione
 

 puo essere un' altra soluzione
 
si puo' ottimizzare per la specifica architettura (-march) in modo che
funzioni solo su quella, o ottimizzare per architettura in modo che
funzioni meglio su quella ma funzioni anche sulle altre (-mtune).
 
in generale:
https://gcc.gnu.org/onlinedocs/gcc-4.3.1/gcc/i386-and-x86_002d64-Options.html
 
