bene, dipende davvero da cosa stai sviluppando. la risposta, a seconda di ciò che si sta sviluppando, può variare da "è insignificante" a "è assolutamente fondamentale, e ci aspettiamo che tutti nel team abbiano una buona comprensione e l'uso di implementazioni parallele".
per la maggior parte dei casi, una solida comprensione e l'uso di lock, thread e task e pool di attività sarà un buon inizio quando è necessario il parallelismo. (varia da lang / lib)
aggiungi a ciò le differenze nei disegni che devi fare - per un multiprocessing non banale, devi spesso imparare diversi nuovi modelli di programmazione o strategie di parallelizzazione. in quel caso, il tempo di imparare, di fallire abbastanza volte per avere una solida comprensione e di aggiornare i programmi esistenti può prendere una squadra un anno (o più). una volta raggiunto quel punto, si spera (non si spera!) di non percepire o affrontare problemi / implementazioni come si fa oggi (a patto di non aver ancora effettuato quella transizione).
Un altro ostacolo è che stai effettivamente ottimizzando un programma per una certa esecuzione. se non ti viene dato molto tempo per ottimizzare i programmi, in realtà non ne trarrai vantaggio quanto dovresti. la parallelizzazione di alto livello (o ovvia) può migliorare la velocità percepita del programma con un piccolo sforzo, e questo è quanto molti team andranno oggi: "Abbiamo parallelizzato le parti più ovvie dell'app" - in alcuni casi va bene. il vantaggio di prendere il frutto basso appeso e utilizzando la semplice parallelizzazione sarà proporzionato al numero di nuclei? spesso, quando ci sono da due a quattro core logici ma non così spesso oltre. in molti casi, questo è un rendimento accettabile, considerato l'investimento nel tempo. questo modello parallelo è l'introduzione di molte persone per implementare buoni usi del parallelismo. è comunemente implementato usando iterazione in parallelo, attività esplicite, thread semplici o multitasking.
ciò che apprendi utilizzando questi banali modelli paralleli non sarà l'ideale in tutti i complessi scenari paralleli; applicare in modo efficace progetti paralleli complessi richiede una comprensione e un approccio molto diversi. questi semplici modelli sono spesso distaccati o hanno un'interazione banale con altri componenti del sistema. allo stesso modo, molte implementazioni di questi modelli banali non si adattano bene a sistemi paralleli complessi in modo efficace: un cattivo progetto parallelo complesso può impiegare il tempo necessario per eseguire il modello semplice. ill: esegue due volte più velocemente del modello a thread singolo, mentre utilizza 8 core logici durante l'esecuzione. gli esempi più comuni stanno usando / creando troppi thread e alti livelli di interferenza di sincronizzazione. in generale, questo è chiamato rallentamento parallelo. è abbastanza facile da incontrare se si affrontano tutti i problemi paralleli come semplici problemi.
quindi, diciamo che veramente dovrebbe utilizzare un multithreading efficiente nei tuoi programmi (la minoranza, nel clima di oggi): dovrai impiegare il modello semplice in modo efficace per apprendere il modello complesso e poi reimparare come ti avvicini al flusso del programma e all'interazione. il modello complesso è quello in cui dovrebbe essere in definitiva il tuo programma poiché è lì che si trova l'hardware oggi e dove verranno apportati i miglioramenti più importanti.
l'esecuzione di modelli semplici può essere immaginata come una forcella e i modelli complessi funzionano come un ecosistema complesso. Penso che la comprensione di modelli semplici, incluso il blocco generale e il threading, dovrebbe essere o sarà presto prevista dagli sviluppatori intermedi quando il dominio (in cui lo sviluppate) lo utilizza. la comprensione di modelli complessi è ancora un po 'insolita oggi (nella maggior parte dei domini), ma penso che la domanda aumenterà abbastanza rapidamente. come sviluppatori, molto più dei nostri programmi dovrebbero supportare questi modelli, e la maggior parte dell'uso è piuttosto indietro nella comprensione e nell'implementazione di questi concetti. Poiché i conteggi dei processori logici sono una delle aree più importanti del miglioramento dell'hardware, la richiesta di persone che comprendono e possono implementare sistemi complessi aumenterà sicuramente.
infine, ci sono molte persone che pensano che la soluzione sia solo "aggiungere la parallelizzazione". spesso è meglio rendere più veloce l'implementazione esistente. è molto più semplice e molto più semplice in molti casi. molti programmi in natura non sono mai stati ottimizzati; alcune persone hanno appena avuto l'impressione che la versione non ottimizzata sarebbe presto eclissata dall'hardware. migliorare la progettazione o le alghe di programmi esistenti è anche un'importante abilità se le prestazioni sono importanti - il ricorso a più core ai problemi non è necessariamente la soluzione migliore o più semplice.
quando si prendono di mira i PC moderni, la maggior parte di noi che ha bisogno di implementare buoni sistemi paralleli non dovrà andare oltre il multithreading, il locking, le librerie parallele, la lettura di un libro e un sacco di esperienza nella scrittura e test dei programmi (sostanzialmente, ristrutturazione di come ti avvicini ai programmi di scrittura).