Tecnologie parallele disponibili in .Net

Sono nuovo alla piattaforma .Net. Ho fatto una ricerca e ho scoperto che ci sono diversi modi per fare il calcolo parallelo in. Netto:

  1. Attività parallela in Task Parallel Library, che è .Net 3.5.

  2. PLINQ, .Net 4.0

  3. Programmazione asincrona, .Net 2.0, (async è principalmente usato per eseguire compiti pesanti I / O, F # ha una syntax concisa che supporta questo). Lo elenco perché in Mono sembra non esserci TPL o PLINQ. Quindi se ho bisogno di scrivere programmi paralleli multipiattaforma, posso usare async.

  4. . Discussioni Net. Nessuna limitazione della versione.

Potresti fornire alcuni brevi commenti su questi o aggiungere altri metodi in questo elenco?

Hai bisogno di fare una discreta quantità di ricerche al fine di determinare come effettivamente multithread. Ci sono alcuni buoni articoli tecnici , parte del sito del team Microsoft Parallel Computing .

In cima alla mia testa, ci sono diversi modi per andare sul multithreading:

  1. Classe del Thread .
  2. ThreadPool , che ha anche il supporto per le operazioni con I / O e una porta di completamento I / O.
  3. Begin* / End* operazioni asincrone.
  4. Componenti di programmazione asincrona basata su eventi (o “EBAP”), che utilizzano SynchronizationContext .
  5. BackgroundWorker , che è un EBAP che definisce un’operazione asincrona.
  6. Classe di Task (Task Parallel Library) in .NET 4.
  7. LINQ parallelo. C’è un buon articolo su Parallel.ForEach (Task Parallel Library) vs. PLINQ.
  8. Rx o “LINQ to Events”, che non ha ancora una versione non beta, ma è in via di completamento e sembra promettente.
  9. (Solo F #) Flussi di lavoro asincroni.

Aggiornamento: è disponibile un articolo per la comprensione e l’applicazione di pattern paralleli con .NET Framework 4 disponibile per il download che fornisce indicazioni su quali soluzioni utilizzare per i diversi tipi di scenari paralleli (sebbene supponga .NET 4 e non copra Rx).

A rigor di termini, qui dovrebbe essere fatta la distinzione tra parallelo, asincrono e simultaneo.

Parallelo significa che un “compito” è suddiviso tra più “compiti” più piccoli che possono essere eseguiti contemporaneamente. Ciò richiede una CPU multi-core o un computer multi-CPU, in cui ogni attività ha il core o CPU dedicato. O più computer. PLINQ (parallelismo dei dati) e TPL (parallelismo delle attività) rientrano in questa categoria.

Asincrono significa che le attività vengono eseguite senza bloccarsi a vicenda. L’espressione asincrona di F #, Rx, Begin / End pattern sono tutte le API per la programmazione asincrona.

La concorrenza è un concetto più ampio della parallelizzazione e dell’asincronia. Concorrenza significa che diversi “compiti” vengono eseguiti contemporaneamente, interagendo tra loro. Ma questi “compiti” non devono essere eseguiti su unità di calcolo fisiche separate, come si intende nella parallelizzazione. Ad esempio, i sistemi operativi multitasking possono eseguire più processi contemporaneamente anche su computer single-core a singola CPU, utilizzando intervalli di tempo. La concorrenza può essere raggiunta ad esempio con il modello di attore e il passaggio di messaggi (ad esempio la casella di posta elettronica di F #, i processi di Erlang (Retlang in .Net))

I thread sono un concetto di livello relativamente basso rispetto ai concetti di cui sopra. I thread sono attività eseguite all’interno di un processo, eseguite contemporaneamente e gestite direttamente dallo scheduler del sistema operativo. È ansible implementare la parallelizzazione quando il sistema operativo associa ogni thread a un core separato o un modello di attore implementando l’accodamento dei messaggi, il routing e così via su ciascun thread.

Esistono anche alcune librerie .NET per la programmazione parallela dei dati che hanno come target l’unità di elaborazione grafica (GPU), tra cui:

Microsoft Accelerator è destinato alla programmazione parallela dei dati e può essere indirizzato alla GPU o ai processori multi-core.

Brama è per le trasformazioni di dati in stile LINQ eseguite sulla GPU.

CUDA.NET fornisce un wrapper per consentire a CUDA di essere utilizzato da programmi .NET.

C’è anche il Reactive Extensions per. NET (Rx)

Rx è fondamentalmente query linq per eventi. Permette di elaborare e combinare flussi di dati asincroni nello stesso modo in cui linq consente di lavorare con le raccolte. Quindi probabilmente lo userete in combinazione con altre tecnologie parallele come un modo per riunire i risultati delle vostre operazioni parallele senza dovervi preoccupare dei blocchi e di altre primitive di threading di basso livello.

Esperto in Esperto: Brian Beckman ed Erik Meijer – All’interno del .NET Reactive Framework (Rx) offre una buona panoramica di ciò che riguarda Rx.

EDIT: un’altra libreria degna di nota è Concurrency and Coordination Runtime (CCR), è in circolazione da molto tempo (prima del ’06) e viene fornita come parte di Microsoft Robotics Studio .

Rx ha molte delle idee interessanti che ha il CCR al suo interno, ma con una API molto più bella a mio parere. C’è ancora del roba interessante nel CCR, quindi potrebbe valerne la pena. C’è anche un framework di servizi distribuiti che funziona con il CCR che potrebbe renderlo utile a seconda di ciò che stai facendo.

Esperto di esperti: Meijer e Chrysanthakopoulos – Concorrenza, coordinamento e CCR

Un’altra è la nuova libreria Task Parallel in .NET 4.0, che è simile e sulla falsariga di ciò che hai già scoperto, ma questa potrebbe essere una lettura interessante:

Task Libreria parallela

due principali modi per fare paralleli sono i thread e la nuova libreria TPL basata su attività.

La programmazione asincrona menzionata non è altro che un nuovo thread nel threadpool.

PLINQ, Rx e altri menzionati sono in realtà delle estensioni che si trovano nella parte superiore del nuovo programmatore di attività.

il migliore articolo che spiega esattamente la nuova architettura per il nuovo task scheduler e tutte le librerie in cima, Visual Studio 2010 e il nuovo parallelismo basato su task 4.0 TPL .NET è qui (di Steve Teixeira, Product Unit Manager per Parallel Developer Tools in Microsoft ):

http://www.drdobbs.com/visualstudio/224400670

altrimenti il ​​Dr Dobbs ha dedicato la sezione di programmazione parallela qui: http://www.drdobbs.com/go-parallel/index.jhtml

La principale differenza tra i thread e la nuova programmazione parallela basata sulle attività è che non è necessario pensare più in termini di thread, come si gestiscono più i pool e il sistema operativo e l’hardware sottostante. TPL si prende cura del fatto che usi solo le attività. Questo è un enorme cambiamento nel modo in cui lo fai in parallelo a qualsiasi livello inclusa l’astrazione.

Quindi in .NET in realtà non hai molte scelte:

  1. Filo
  2. Nuovo task scheduler basato su attività.

Ovviamente il compito basato è la strada da percorrere.

evviva Valko