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.
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? –
Significa che l'utilizzo di un numero maggiore di thread può migliorare le prestazioni nelle architetture multicore? –
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