Domanda

Ho creato un'applicazione in C # che vorrei ottimizzare per più core. Ho dei thread, dovrei fare di più?

Aggiornato per maggiori dettagli

  • C # 2.0
  • Esegui su Windows Vista e Windows Server 2003

Aggiornato di nuovo

  • Questo codice è in esecuzione come servizio
  • Non voglio avere il codice completo ... il mio obiettivo qui è quello di ottenere la tua esperienza e come iniziare. Come ho detto, ho già usato i thread. Cos'altro posso fare?
È stato utile?

Soluzione

Generalizzerei che scrivere un processo multi-thread altamente ottimizzato è molto più difficile che lanciare alcuni thread nel mix.

Consiglio di iniziare con i seguenti passi:

  1. Suddividi i tuoi carichi di lavoro in unità eseguibili parallele discrete
  2. Misura e caratterizza i tipi di carico di lavoro - Intensivo della rete, I / O intensivo, Intensivo della CPU ecc. - Questi diventano la base per le strategie di pooling del tuo lavoratore. per esempio. puoi avere gruppi di lavoratori piuttosto grandi per applicazioni ad alta intensità di rete, ma non ha senso avere più lavoratori di thread hardware per attività che richiedono molta CPU.
  3. Pensa all'accodamento / array o ThreadWorkerPool per gestire pool di thread. Ex più finegrain controllato di quest'ultimo.
  4. Se possibile, impara a preferire i pattern I / O asincroni rispetto ai pattern di sincronizzazione: libera più tempo CPU per eseguire altre attività.
  5. Lavori per eliminare o almeno ridurre la serializzazione attorno a risorse contese come il disco.
  6. Riduci al minimo l'I / O, acquisisci e mantieni il livello minimo di blocchi per il periodo minimo possibile. (I blocchi Reader / Writer sono tuoi amici)
    5.Combella attraverso quel codice per garantire che le risorse siano bloccate in sequenza coerente per ridurre al minimo l'abbraccio mortale.
  7. Prova come un matto: le condizioni di razza e i bug nelle applicazioni multithread sono di gran lunga facili da risolvere - spesso vedi solo le conseguenze forensi del massacro.

Tieni presente che è del tutto possibile che una versione multi-thread potrebbe funzionare peggio di una versione single-thread della stessa app. Non ci sono scuse per una buona misurazione ingegneristica.

Altri suggerimenti

Potresti dare un'occhiata alle estensioni parallele per .NET

http://msdn.com/concurrency

Potresti leggere la colonna di Herb Sutter "Concorrenza effettiva". Troverai questi articoli qui , con altri.

Per essere in grado di utilizzare più core in modo più efficiente, è necessario dividere il lavoro in parti che possono essere eseguite in parallelo e utilizzare i thread per dividere il lavoro sui core. È possibile utilizzare thread, operatori in background, pool di thread, ecc.

Per C #, inizia a imparare il modo LINQ di fare le cose, quindi usa il Parallel LINQ e la sua estensione .AsParallel ().

Comprendere il parallelismo (o il potenziale per il parallelismo) nei problemi che si sta tentando di risolvere, l'applicazione e i suoi algoritmi è molto più importante di qualsiasi dettaglio di sincronizzazione dei thread, librerie, ecc.

Inizia leggendo Schemi per la programmazione parallela (che si concentra sulla ricerca concorrenza "e problemi di progettazione di livello superiore), quindi passa a The Art of Multiprocessor Programming (dettagli pratici a partire da una base teorica).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top