12

Per quanto ne so, l'architettura multi-core in un processore non influisce sul programma. L'effettiva esecuzione dell'istruzione viene gestita in un livello inferiore.Programmazione per processori multi core

la mia domanda è,

Dato che si dispone di un ambiente multicore, posso usare le pratiche di programmazione di utilizzare le risorse disponibili in modo più efficace? Come dovrei cambiare il mio codice per ottenere più prestazioni in ambienti multicore?

+1

Una CPU multi-core assomiglia a più CPU per un programma, quindi se si utilizzano i thread al massimo, non c'è altro da fare. A meno che non stiate cercando suggerimenti su come migliorare il vostro codice multi-thread? –

+1

Significa che l'utilizzo di un numero maggiore di thread può migliorare le prestazioni nelle architetture multicore? –

+0

significa che un'architettura multi core può eseguire lo stesso numero di thread in quanto ha core (l'hyper-threading ha l'aspetto di due core ciascuno) allo stesso tempo. Quindi, avendo un numero di thread> 1 è consigliabile usare i core. – TomTom

risposta

13

Ciò è corretto. Il tuo programma non funzionerà più velocemente (a parte il fatto che il core sta gestendo meno altri processi, perché alcuni processi vengono eseguiti sull'altro core) a meno che non si usi la concorrenza. Se si usa la concorrenza, tuttavia, più core migliorano il parallelismo reale (con meno core, la concorrenza è interlacciata, mentre con più core si può ottenere il vero parallelismo tra i thread).

Rendere i programmi in modo efficiente simultaneo non è un compito semplice. Se fatto male, rendere il tuo programma concorrente può effettivamente renderlo più lento! Ad esempio, se passi molto tempo a generare i thread (la costruzione dei thread è molto lenta) e lavori su una dimensione molto piccola (in modo che il sovraccarico della costruzione del thread domini il lavoro effettivo) o se sincronizzi frequentemente i tuoi dati (che non solo impone alle operazioni di eseguire in serie, ma ha anche un sovraccarico molto alto su di esso), o se si scrive spesso sui dati nella stessa linea di cache tra più thread (che può portare all'intera linea della cache di essere invalidata su uno stesso dei core), quindi si può seriamente danneggiare le prestazioni con la programmazione concorrente.

È anche importante notare che se si dispone di N core, ciò NON significa che si otterrà un aumento di velocità di N. Questo è il limite teorico all'aumento della velocità. In effetti, forse con due core è due volte più veloce, ma con quattro core potrebbe essere circa tre volte più veloce, e quindi con otto core è circa tre volte e mezzo più veloce, ecc. Quanto bene il tuo programma è effettivamente in grado di sfruttare questi core è chiamata la scalabilità parallela.Spesso i sovraccarichi di comunicazione e sincronizzazione impediscono un aumento lineare, anche se, nell'ideale, se si riesce a evitare la comunicazione e la sincronizzazione il più possibile, si può sperare che si avvicini alla linearità.

Non sarebbe possibile fornire una risposta completa su come scrivere programmi paralleli efficienti su StackOverflow. Questo è davvero il tema di almeno uno (probabilmente diversi) corsi di informatica. Ti suggerisco di iscriverti a un corso del genere o di acquistare un libro. Ti consiglierei un libro se sapessi di uno buono, ma il corso sugli algoritmi di paralell che ho preso non aveva un libro di testo per il corso. Potresti anche essere interessato a scrivere una manciata di programmi usando un'implementazione seriale, un'implementazione parallela con multithreading (thread regolari, pool di thread, ecc.) E un'implementazione parallela con passaggio di messaggi (come con Hadoop, Apache Spark, Cloud Dataflow , RPC asincroni, ecc.), e quindi misurare le loro prestazioni, variando il numero di core nel caso delle implementazioni parallele. Questa è stata la maggior parte del lavoro del corso per il mio corso sugli algoritmi paralleli e può essere abbastanza perspicace. Alcuni calcoli che potresti provare per parallelizzare includono il calcolo di Pi usando il metodo Monte Carlo (questo è banalizzabile parallelamente, assumendo che tu possa creare un generatore di numeri casuali in cui i numeri casuali generati in fili diversi siano indipendenti), eseguendo la moltiplicazione di matrici, calcolando la forma di fila di righe una matrice, sommando il quadrato del numero 1 ... N per un numero molto grande di N, e sono sicuro che puoi pensare agli altri.

+0

In realtà, la legge di Ahmdal mostra che non si otterrà un aumento della velocità dei processori N per N a meno che il codice non sia al 100% in modo imbarazzante parallelo. Questo è il limite teorico. –

+0

@ San Jacinto, com'è diverso da quello che ho detto? –

+0

solo un pisolino, è tutto :). Hai detto che N è il limite teorico, ma c'è un po 'di più nella storia. Hai risposto bene, imo. –

3

Sì, semplicemente aggiungendo più core a un sistema senza alterare il software non si otterrebbe alcun risultato (con l'eccezione del sistema operativo sarebbe in grado di pianificare più processi simultanei su core separati).

Per far sì che il sistema operativo utilizzi più core, è necessario eseguire una delle seguenti operazioni: aumentare il numero di thread per processo o aumentare il numero di processi in esecuzione contemporaneamente (o entrambi!).

L'utilizzo efficace dei nuclei, tuttavia, è una bestia di un colore diverso. Se passi troppo tempo a sincronizzare l'accesso ai dati condivisi tra thread/processi, il tuo livello di concorrenza subirà un colpo mentre i thread si attendono reciprocamente. Ciò presuppone anche che si abbia un problema/computazione che può essere relativamente facilmente parallelo, poiché la versione parallela di un algoritmo è spesso molto più complessa della sua versione sequenziale.

Detto questo, soprattutto per i calcoli associati alla CPU con unità di lavoro indipendenti l'uno dall'altro, molto probabilmente si vedrà un aumento della velocità lineare mentre si lanciano più thread sul problema. Man mano che aggiungi segmenti seriali e blocchi di sincronizzazione, questa accelerazione tenderà a diminuire.

I calcoli pesanti di I/O sono in genere il peggiore in un ambiente a più thread, poiché l'accesso all'archiviazione fisica (soprattutto se si trova sullo stesso controller o sullo stesso supporto) è anche seriale, nel qual caso il threading diventa più utile nel senso che libera gli altri thread per continuare con l'interazione dell'utente o le operazioni basate sulla CPU.

2

Non so se è il miglior punto di partenza possibile, ma mi sono iscritto al feed articolo da Intel Software Network qualche tempo fa e ho trovato molte cose interessanti lì, presentato in modo piuttosto semplice. Puoi trovare alcuni articoli di base sui concetti fondamentali del calcolo parallelo, come this. Here hai una veloce immersione in openMP che è un possibile approccio per iniziare a parallelizzare le parti più lente della tua applicazione, senza cambiare il resto. (Se quelle parti presentano parallelismo, ovviamente.) Controllare anche Intel Guide for Developing Multithreaded Applications. O semplicemente vai a cercare the article section, gli articoli non sono troppo molti, quindi puoi capire rapidamente cosa ti si addice meglio. Hanno anche un forum e un settimanale webcast chiamato Parallel Programming Talk.

0

È possibile utilizzare i linguaggi di programmazione progettati per la programmazione simultanea. Erlang and Go vengono in mente.

Problemi correlati