PDA

View Full Version : Usare entrambi i core nell'esecuzione programmi


ChFl
24-05-2011, 21:10
Salve,
Possiedo un mac con core 2 duo, e ho notato che eseguendo banali programmi in C il processore lavora massimo al 50% (fonte: istat). Parlando con un mio collega ho scoperto che l'entità metafisica che esegue il programma, fa lavorare solo un core.
Mi diceva che lui su linux è riuscito a usarli entrambi "ricompilando il kernel".

Esiste una cosa del genere anche per mac?
Grazie in anticipo.

AlexSwitch
24-05-2011, 21:16
Per la verità, a partire dalla versione 10.6 di OS X, il kernel è predisposto per la gestione del multithreading attraverso un dispatcher. Forse dovresti scrivere il codice in Objective C, alias Cocoa.

M@n
25-05-2011, 11:43
secondo me i programmi devono essere (ri)scritti multithread (o come cavolo si scrive)

mad_hhatter
25-05-2011, 12:21
Per la verità, a partire dalla versione 10.6 di OS X, il kernel è predisposto per la gestione del multithreading attraverso un dispatcher. Forse dovresti scrivere il codice in Objective C, alias Cocoa.

immagino che la gestione multithreading e multiprocesso arrivi da ben prima di mac so x 10.6... direi che arriva direttamente dai sistemi timesharing e multiutente :)

e spero che anche il supporto multicore arrivi prima di snow leopard.

ovviamente per sfruttare più core il software deve essere multithread o multiprocesso. Lo scheduling è fatto dal s.o. in modo assolutamente trasparente

AlexSwitch
25-05-2011, 14:41
immagino che la gestione multithreading e multiprocesso arrivi da ben prima di mac so x 10.6... direi che arriva direttamente dai sistemi timesharing e multiutente :)



Quello a cui fai riferimento è il multitasking ( gestire più processi/applicazioni contemporaneamente ) anche su singolo core di calcolo.

Il multithreading ( distribuire più processi di più applicazioni su più core/CPU ) è supportato, a livello di processi per singola applicazione, da OS X 10.4 Tiger, o OS X 10.3, grazie al supporto di librerie apposite che gestivano il dispatching dei processi di quella applicazione. Stessa cosa accadeva con OS X 10.5 Leopard.

Con OS X 10.6 è stato introdotto in maniera nativa, a livello di kernel, il dispatching dei processi attraverso GCD ( Grand Central Dispatch ) e la ricompilazione di quasi tutti i componenti dell'OS in Cocoa 64. Inoltre GCD è capace di riconoscere anche i core " virtuali " delle Cpu Intel con tecnologia " HT ".

mad_hhatter
25-05-2011, 15:38
Quello a cui fai riferimento è il multitasking ( gestire più processi/applicazioni contemporaneamente ) anche su singolo core di calcolo.

Il multithreading ( distribuire più processi di più applicazioni su più core/CPU ) è supportato, a livello di processi per singola applicazione, da OS X 10.4 Tiger, o OS X 10.3, grazie al supporto di librerie apposite che gestivano il dispatching dei processi di quella applicazione. Stessa cosa accadeva con OS X 10.5 Leopard.

Con OS X 10.6 è stato introdotto in maniera nativa, a livello di kernel, il dispatching dei processi attraverso GCD ( Grand Central Dispatch ) e la ricompilazione di quasi tutti i componenti dell'OS in Cocoa 64. Inoltre GCD è capace di riconoscere anche i core " virtuali " delle Cpu Intel con tecnologia " HT ".

scusami, ma il multithreading (a livello di s.o., non di CPU) è la possibilità di avere più unità di esecuzione per un singolo processo. Non c'entra con la gestione di più pocessori o di più core. Tant'è vero che posso tranquillamente eseguire un'applicazione multithread su un sistema mono core. Semplicemente non potrò avere parallelismo vero e proprio.

GCD è una semplificazione e un'ottimizzazione della gestione multicore, ma il supporto, come tu stesso affermi, esisteva già prima di SL.

Ora, se il proprietario, quando parla di banali programmi C, cerca di eseguire codice non parallelizzabile su più core, questo è semplicemente impossibile.

Piuttosto, se scrivo un software che forka sè stesso, mi aspetto che il s.o. distribuisca, se opportuno, i vari processi sui vari core. Anche se non sono su SL. Ti prego di correggermi se sbaglio, perché non conosco gli internals di OSX né le versioni prima di SL.

Infine, stai dicendo che prima di SL lo scheduler del kernel non era in grado di assegnare i vari thread di uno stesso processo a core diversi? Spero di no...

AlexSwitch
25-05-2011, 16:49
scusami, ma il multithreading (a livello di s.o., non di CPU) è la possibilità di avere più unità di esecuzione per un singolo processo. Non c'entra con la gestione di più pocessori o di più core. Tant'è vero che posso tranquillamente eseguire un'applicazione multithread su un sistema mono core. Semplicemente non potrò avere parallelismo vero e proprio.

GCD è una semplificazione e un'ottimizzazione della gestione multicore, ma il supporto, come tu stesso affermi, esisteva già prima di SL.

Ora, se il proprietario, quando parla di banali programmi C, cerca di eseguire codice non parallelizzabile su più core, questo è semplicemente impossibile.

Piuttosto, se scrivo un software che forka sè stesso, mi aspetto che il s.o. distribuisca, se opportuno, i vari processi sui vari core. Anche se non sono su SL. Ti prego di correggermi se sbaglio, perché non conosco gli internals di OSX né le versioni prima di SL.

Infine, stai dicendo che prima di SL lo scheduler del kernel non era in grado di assegnare i vari thread di uno stesso processo a core diversi? Spero di no...

La capacità di un OS di svolgere più thread per processo , si chiama appunto multitasking. Il multitasking, grazie al suo scheduler e dispatcher funziona tranquillamente anche su Cpu single core, usando tecniche con o senza prelazione ( cooperative/preemptive multitasking ) a seconda di chi gestisce il " context switch ".

Il multithreading è la capacità di un processore di gestire più thread per processo, condividendo lo stesso spazio d'indirizzamento, la stessa cache e lo stesso buffer lookaside. Può ed è stato implementato anche su Cpu single core ( Pentium 4 HT ); i processori multicore ricalcano questo schema di lavoro, spalmandolo su più unità fisiche di calcolo. Il multitrheading per funzionare correttamente in maniera efficiente deve essere supportato a livello software attraverso A) la scrittura di codice specificatamente sviluppato allo scopo, B) un sistema operativo che sia capace di gestire lo scheduling dei processi verso la Cpu.

Fatta questa distinzione basilare, venendo ad OS X e alle mie precedenti risposte, ti rispondo che stiamo dicendo la stessa cosa, ma in maniera diversa. ;)
Ovviamente il supporto al multithreading ( livello di kernel, su più core ) esiste da parecchio prima di Snow Leopard, ma era limitato a come il codice era scritto dallo sviluppatore.
Con GCD Apple ha esteso e migliorato la gestione dei threads delegandone la gestione e la sincronizzazione all'OS e non al singolo programma. Ciò ha permesso un notevole risparmio di istruzioni da usare per la gestione dei processi e una semplificazione del lavoro degli sviluppatori che dovranno solamente decidere quali parti del loro codice saranno eseguite in parallelo ( blocchi di thread pool pattern ).

Discorsi di ricompilazione del kernel ( :confused: :confused: ), come paventato da ChFl per ottenere il multithreading, sono completamente sbagliati.

mad_hhatter
25-05-2011, 17:43
La capacità di un OS di svolgere più thread per processo , si chiama appunto multitasking. Il multitasking, grazie al suo scheduler e dispatcher funziona tranquillamente anche su Cpu single core, usando tecniche con o senza prelazione ( cooperative/preemptive multitasking ) a seconda di chi gestisce il " context switch ".

Il multithreading è la capacità di un processore di gestire più thread per processo, condividendo lo stesso spazio d'indirizzamento, la stessa cache e lo stesso buffer lookaside. Può ed è stato implementato anche su Cpu single core ( Pentium 4 HT ); i processori multicore ricalcano questo schema di lavoro, spalmandolo su più unità fisiche di calcolo. Il multitrheading per funzionare correttamente in maniera efficiente deve essere supportato a livello software attraverso A) la scrittura di codice specificatamente sviluppato allo scopo, B) un sistema operativo che sia capace di gestire lo scheduling dei processi verso la Cpu.

Fatta questa distinzione basilare, venendo ad OS X e alle mie precedenti risposte, ti rispondo che stiamo dicendo la stessa cosa, ma in maniera diversa. ;)
Ovviamente il supporto al multithreading ( livello di kernel, su più core ) esiste da parecchio prima di Snow Leopard, ma era limitato a come il codice era scritto dallo sviluppatore.
Con GCD Apple ha esteso e migliorato la gestione dei threads delegandone la gestione e la sincronizzazione all'OS e non al singolo programma. Ciò ha permesso un notevole risparmio di istruzioni da usare per la gestione dei processi e una semplificazione del lavoro degli sviluppatori che dovranno solamente decidere quali parti del loro codice saranno eseguite in parallelo ( blocchi di thread pool pattern ).

Discorsi di ricompilazione del kernel ( :confused: :confused: ), come paventato da ChFl per ottenere il multithreading, sono completamente sbagliati.

perdonami se insisto, ma si usa il termine multithreading sia dal punto di vista hardware che software (http://en.wikipedia.org/wiki/Multithreading; "In computer science, a thread of execution is the smallest unit of processing that can be scheduled by an operating system." cfr. http://en.wikipedia.org/wiki/Thread_(computer_science)). Infatti io posso parlare di multithreading anche in ambito di cpu con un solo core logico.

Il multitasking riguarda i processi, il multithreading riguarda i thread di un processo.

Per tutto il resto, siamo d'accordo :) grazie per le precisazioni

ChFl
26-05-2011, 12:17
Ringrazio tutti per le esaustive risposte!

Preciso: il programma è un po' meno banale di "se ha è 1, allora b è due, se ha è 2 allora b è 1", ma ha il difetto di contenere molte operazioni, dunque è lento in esecuzione. La domanda però non nasce dal non voler aspettare che la macchina se lo macini, ma quasi da una sorta di curiosità.

Credo di aver capito questo: è un po' che OSX supporta quello che cerchi, ma scordatelo per il C99.
E' corretto?

AlexSwitch
26-05-2011, 13:04
No non è corretto..... Il C " liscio " ( diciamo così ) può essere usato per scrivere un programma " multithread ", ma dovrai essere tu stesso ad inserire e gestire le chiamate verso lo scheduler e il dispatcher di OS X. Ciò significa che dovrai preventivamente progettare la struttura del codice in base ai processi e ai thread che il tuo programma richiede e che andranno parallelizzati.
Con Grand Central Dispatch tutto questo lavoro ti viene risparmiato, visto che con pochissime istruzioni ( 15 ), sarai libero di scegliere quale porzione del tuo codice andrà in multithreading e con quale tipo di priorità. Tutto il resto viene gestito in automatico da OS X.
Apple, sotto licenza Apache, ha rilasciato il sorgente del set completo di istruzioni GCD in una libreria, a cui possono puntare i linguaggi C, C++ e Objective-C.

mad_hhatter
27-05-2011, 12:10
No non è corretto..... Il C " liscio " ( diciamo così ) può essere usato per scrivere un programma " multithread ", ma dovrai essere tu stesso ad inserire e gestire le chiamate verso lo scheduler e il dispatcher di OS X. Ciò significa che dovrai preventivamente progettare la struttura del codice in base ai processi e ai thread che il tuo programma richiede e che andranno parallelizzati.
Con Grand Central Dispatch tutto questo lavoro ti viene risparmiato, visto che con pochissime istruzioni ( 15 ), sarai libero di scegliere quale porzione del tuo codice andrà in multithreading e con quale tipo di priorità. Tutto il resto viene gestito in automatico da OS X.
Apple, sotto licenza Apache, ha rilasciato il sorgente del set completo di istruzioni GCD in una libreria, a cui possono puntare i linguaggi C, C++ e Objective-C.

io onestamente non capisco perché non possa semplicemente usare la libreria pthread e usare il multithreading preempitive in modo che sia lo scheduler ad arrangiarsi a mandare i thread in esecuzione. Armeggiare con scheduler e dispatcher non seve solo nel caso in cui si voglia implementare un multithreading cooperativo?