View Full Version : [C] Multi Core
Salve a tutti, ho un piccolo problema, ho un programma con questa struttura:
for(int i=0;i<4;i++){
//fai qualcosa
}
Vorrei spezzarlo in piu' thread, ma vorrei che ogni thread venga allocato su un core diverso, si puo' fare in c? Magari con librerie posix, in modo da essere portabile..
Ovviamente le diverse istanze dell'iterazione sono indipendendo l'una dall'altra, quindi non ho problemi di sincronizzazione..
Se sei sotto Linux usa la libreria pthread.
C'è anche OpenMP (http://en.wikipedia.org/wiki/OpenMP), ma non l'ho mai usata, anche se ad una rapida occhiata sembra fatta bene.
nuovoUtente86
02-08-2010, 15:43
sia sotto linux che windows è possibile settare l' affnità con il processore. Puoi sfruttare ciò per suddividere realmente il lavoro
sia sotto linux che windows è possibile settare l' affnità con il processore. Puoi sfruttare ciò per suddividere realmente il lavoro
Confermo.. Ho chiesto prima di provare.. Semplicemente creando il thread si imposta gia' dove deve.. :D
Scusate, risolto.. :)
clockover
03-08-2010, 08:30
sia sotto linux che windows è possibile settare l' affnità con il processore
sono curioso... come si fa?
DeAndreon
03-08-2010, 12:11
Anche a me interessa... Grazie mille :)
Usa OpenMP:
#pragma omp parallel for
for(int i=0;i<4;i++)
{
//fai qualcosa
}
sono curioso... come si fa?
http://msdn.microsoft.com/en-us/library/ms684251%28VS.85%29.aspx
http://linux.die.net/man/2/sched_getaffinity
Anche se sinceramente in questo caso non credo serva a molto, basta parallelizzare il contenuto del for e l'allocazione dei thread verrà gestita direttamente dal sistema operativo.
clockover
03-08-2010, 14:11
http://linux.die.net/man/2/sched_getaffinity
Anche se sinceramente in questo caso non credo serva a molto, basta parallelizzare il contenuto del for e l'allocazione dei thread verrà gestita direttamente dal sistema operativo.
Grande... si ma la mia era più che altro curiosità...
Albitexm
03-08-2010, 19:09
Usa OpenMP:
#pragma omp parallel for
for(int i=0;i<4;i++)
{
//fai qualcosa
}
"Fai qualcosa" può essere anche unsa serie di istruzioni con richiami a funzioni? O ci sono dei limiti nel tipo d'istruzioni eseguibili in parallelo con questa sintassi?
Albitexm
03-08-2010, 19:10
Usa OpenMP:
}
E per aprire due threads in parallelo con openMP, devono essere due threads riferiti allo stesso ambito, che agiscono sulle stese variabili?
Se non ci sono dipendenze e problemi di concorrenza, ci puoi mettere qualsiasi cosa nel mezzo.
Altrimenti ti devi studiare come funziona OpenMP ;)
Albitexm
03-08-2010, 19:34
Se non ci sono dipendenze e problemi di concorrenza, ci puoi mettere qualsiasi cosa nel mezzo.
Altrimenti ti devi studiare come funziona OpenMP ;)
Per una volta mi trovo d'accordo con te, sul fatto di non usare le librerie Microsoft. Anche se principiante, mi ero già fatto un'idea che "PPL" di Microsoft avesse delle grosse lacune e limiti e che le librerire Open forse offrivano di più. Ma il problema, dal mio punto di vista di "beginner" e che
Microsoft mette a disposizione per le sue librerie, della documentazione e del
supporto, specifico e mirato. Mentre se io apro la voce openMp online,
mi trovo dananti a un'oceano d'informazioni, dove senza "dritte" e incalanazione da qualcuno, rischio di perdere giorni solo per capire cosa devo prendere in considerazione e come. Un'oceano talmente vasto da scoraggiarmi da iniziare ad esplorarlo.
nuovoUtente86
03-08-2010, 19:37
http://msdn.microsoft.com/en-us/library/ms684251%28VS.85%29.aspx
http://linux.die.net/man/2/sched_getaffinity
Anche se sinceramente in questo caso non credo serva a molto, basta parallelizzare il contenuto del for e l'allocazione dei thread verrà gestita direttamente dal sistema operativo.
Si ma lui chiede esplicitamente che i thread eseguano su processori diversi e questo, non specificando l' affinità, non è garantito.
Sei tu che hai chiesto librerie portabili :read: ;)
Il compilatore Microsoft supporta direttamente OpenMP: http://msdn.microsoft.com/en-us/library/tt15eb9t%28VS.80%29.aspx
Qui le specifiche ufficiali: http://www.openmp.org/mp-documents/cspec20.pdf
Si ma lui chiede esplicitamente che i thread eseguano su processori diversi e questo, non specificando l' affinità, non è garantito.
Per carità, ma su un for parallelo ha veramente poco senso secondo me. Sarà lo scheduler a selezionare sicuramente in maniera più efficiente l'affinità rispetto a quella che impostiamo noi.
Settare l'affinità ha senso in particolari casi, ad esempio in situazioni in cui ci sono diversi produttori e dei produttori/consumatori che devono essere eseguiti in modo sequenziale sullo stesso workset.
Per fare un esempio:
- i produttori threadPk producono i workset
- threadPC1 deve consumare un workset prodotto da threadPk
- threadPC2 deve consumare un workset prodotto da threadPC1
- threadPC3 deve consumare un workset prodotto da threadPC2 e deve produrre un risultato
In questi casi ha senso assegnare un processore a threadPC1, uno a thread PC2 e uno a thread PC3 e magari una priorità più alta.
Non ha senso invece assegnarlo ai threadPk, che di fatto si comportano come un parallel for.
Albitexm
04-08-2010, 19:46
Qui le specifiche ufficiali: http://www.openmp.org/mp-documents/cspec20.pdf
thanks ;) probabilmente a questo link ci sarei arrivato da solo, ma chissa
dopo quanto e quanti
thanks ;) probabilmente a questo link ci sarei arrivato da solo, ma chissa
dopo quanto e quanti
Nota che dice praticamente le stesse cose che ci sono su MSDN su OpenMP ;)
Mah, OpenMP mi schifa perchè è fatto col preprocessore :D
Però in effetti trattandosi di C liscio hai ben poche alternative... C++, niente?
Mah, OpenMP mi schifa perchè è fatto col preprocessore :D
Però ha di buono che è talmente semplice che lo può utilizzare chiunque, basta un minimo di logica.
Utilizzare direttamente thread, semafori, shared memory, lock etc etc richiede conoscenze nettamente superiori.
Mah, OpenMP mi schifa perchè è fatto col preprocessore :D
Però in effetti trattandosi di C liscio hai ben poche alternative... C++, niente?
Puoi usarlo anche con il C++. Anzi, con le nuove specifiche 3.0 è possibile utilizzare i task anziché direttamente i thread. (Vedi le specifiche dello standard per dettagli)
Ed è molto usato nella programmazione multithreading ;)
Come alternativa, puoi fare multithreading gestendo i pthread a mano. Più complesso ma molto più flessibile. Oppure usare una delle miriadi di librerie per il multithreading di alto livello. Se non erro, anche le QT permettono di farlo. Oppure le GLib:
http://library.gnome.org/devel/glib/stable/glib-Threads.html
Insomma, hai l'imbarazzo della scelta. Tutto dipende dal tuo livello di conoscenze sul multithreading. Ma un minimo devi averle.
Ciao ragazzi, ho un problema con openMP, ho un programma con questa struttura:
#pragma omp parallel for num_threads(cpu_libere)
for(int count = 0;count<m;count++) {
fai qualcosa;
}
vorrei spezzare il ciclo for in un numero di trheads pari al numero di 'cpu_libere' presenti sul sistema. Mi spiego meglio con un esempio: se ho un computer con 8 cpu, e 3 delle quali sono occupate, voglio che il ciclo for venga suddiviso in 5 threads. Si può fare? Esiste una funzione in C che mi permette di conoscere le cpu libere?
Grazie in anticipo
Difficilmente puoi definire istantaneamente il numero di CPU libere.
http://www.codeproject.com/KB/system/MultiCPUUsage.aspx
In ogni caso credo che abbia poco senso. Crei un numero di thread pari al numero di CPU e via ;)
In ogni caso credo che abbia poco senso. Crei un numero di thread pari al numero di CPU e via ;)
Il problema è che se creo un numero di threads maggiore del numero di cpu libere, il tempo di esecuzione del ciclo for aumenta di molto rispetto al caso in cui vengono creati solo 5 threads (facendo riferimento all'esempio precedente).
Il problema è che se creo un numero di threads maggiore del numero di cpu libere, il tempo di esecuzione del ciclo for aumenta di molto rispetto al caso in cui vengono creati solo 5 threads (facendo riferimento all'esempio precedente).
Dammi al definizione di cpu libera. La definizione è tutt'altro che banale.
Dammi al definizione di cpu libera. La definizione è tutt'altro che banale.
Sì hai ragione, però almeno c'è qualche funzione in C che mi restituisce delle informazioni sulla cpu come fa il comando top o htop sotto linux?
Ti interessa sotto linux ?
http://www.linuxforums.org/forum/linux-programming-scripting/23128-c-program-get-cpu-usage-free-total-ratio.html
Ricordati però che le CPU si possono anche liberare ;) Quindi se ne rilevi poche libere potrebbe anche essere una questione temporanea, ma tu ormai ha allocato un numero di thread insufficiente. Inoltre il cambio di contesto ci sarà sempre e comunque (dovrà portare avanti anche gli altri processi del sistema operativo). Alla fine se allochi un numero di thread pari al numero di CPU sarai sempre sicuro che avrai un utilizzo pressoché ottimale.
Alla fine se allochi un numero di thread pari al numero di CPU sarai sempre sicuro che avrai un utilizzo pressoché ottimale.
Empiricamente ho visto che arrivi ad un'efficienza quasi massima pure se i thread sono un multiplo dei core logici, dunno why.
Cmq smanettare con il threading per le prestazioni senza avere una conoscenza più che approfondita dei meccanismi che lo regolano è quantomeno insensato...
e anche usando librerie di alto livello tipo Boost/Poco/Intel TBB i risultati non saranno mai il top.
Basti vedere il problema "allocare sui core liberi" che non aveva senso alla base.
In sostanza il threading va studiato ebbasta :D
Empiricamente ho visto che arrivi ad un'efficienza quasi massima pure se i thread sono un multiplo dei core logici, dunno why.
Posso proporre come spunto di riflessione la Legge di Amdahl (http://it.wikipedia.org/wiki/Legge_di_Amdahl)?
Albitexm
18-09-2010, 00:09
.
Cmq smanettare con il threading per le prestazioni senza avere una conoscenza più che approfondita dei meccanismi che lo regolano è quantomeno insensato...
:D
Non concordo. Sperimentare qualcosa in pratica può essere anche una via
per poi capire meglio anche il principio di funzionamento teorico. Inoltre se ottengo delle prestazioni migliori, anche senza capire il perchè, non è detto che sia insensato. Dipende chi sono e cosa voglio.
Non concordo. Sperimentare qualcosa in pratica può essere anche una via
per poi capire meglio anche il principio di funzionamento teorico. Inoltre se ottengo delle prestazioni migliori, anche senza capire il perchè, non è detto che sia insensato. Dipende chi sono e cosa voglio.
Sorry ho sbagliato termini, io sono quello che non ha nemmeno un libro di informatica :D
Non intendevo certo studiare da un libro e poi mettere da parte ovvio.
Però mettiamola così, se si cerca il threading mirato alle prestazioni è necessario smanettare pure a basso livello.
Non basta appiccicare due tags di OpenMP per avere risultati lontanamente soddisfacenti...
Purtroppo più si mira alle prestazioni, più i dettagli di basso livello di un'architettura acquistano rilevanza, dettagli che farebbero esplodere la testa al tipico programmatore Java, come cache coerence, bank conflicts, memory bandwidth, SIMD e quant'altro.
Ecco, intendevo il significato primigenio di studiare, inteso come "ricercare informazioni approfondite". Di certo non quello universitario :asd:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.