come gestire la programmazione parallela [chiusa]

6

So che la programmazione parallela è una grande risorsa nella computer grafica, con macchine moderate, e potrebbe essere un modello di calcolo che crescerà nel prossimo futuro (questa tendenza è vera?).

Voglio sapere qual è il modo migliore per affrontarlo. c'è qualche utilità pratica generale nello studio della mesh n-dimensionale del processore, o ordinamento bitonico in macchine p-ram o è solo una teoria per l'hardware specifico del dominio utilizzato nelle elaborazioni di segnali reali particolari di simulazioni scientifiche?

È questo il modo migliore per acquisire il know how su come familiarizzare con cuda o opencl? (sono interessato alle applicazioni di grafica per computer)

e perché la programmazione funzionale è così importante per capire il calcolo parallelo?

ps: come qualcuno mi ha consigliato ho biforcato questa discussione da link

    
posta nkint 05.02.2011 - 19:47
fonte

4 risposte

10

Sono arrivato da uno sfondo di supercalcolo (generalmente per usi scientifici e ingegneristici). I due principali stili di parallelismo sono la memoria condivisa, in cui un programma viene eseguito con più thread nello stesso spazio di indirizzi - un modo frequente per implementare OPENMP - e il passaggio di messaggi, con MPI come il software più popolare.

Se ti interessa solo utilizzare alcuni processori, ad esempio il numero che puoi ottenere su una macchina dual socket, che supporta 2 chip, inizierei con OPENMP. Di solito lo usi aggiungendo le direttive (pragma) ai loop per. A volte puoi prendere un'applicazione esistente e in modo frammentario parallelizzarla, un ciclo alla volta.

Il trasferimento dei messaggi, con MPI o qualche altro pacchetto, è solitamente più difficile, sebbene sia garantito che i processi di differenza abbiano spazi di memoria indipendenti. Tuttavia, ogni volta che i dati devono essere condivisi, devono essere memorizzati nel buffer e inviati a uno o più processi che devono effettuare chiamate per ricevere i dati. Il messaggio che passa parallelismo, di solito richiede che l'applicazione sia progettata da zero per il parallelismo. Ma data una domanda sufficientemente parallela, il numero di processori che può scalare è sostanzialmente illimitato. Cluster di centinaia o migliaia di core non sono rari.

Puoi anche mescolare i metodi, con ogni processo MPI, utilizzando diversi processori per calcolare il proprio pezzo parallelamente localizzato di un'applicazione parallela più grande.

Non ho usato OpenCL, ma non è un modo di utilizzare il chip grafico per eseguire calcoli? Cuda è attualmente utilizzato per programmare quelli che vengono chiamati GPGPU (General Purpose Graphical Processing Units), come quelli forniti da NVidia Fermi.

Personalmente, penso che gli sforzi per imparare e scrivere Cuda possano essere sprecati. Penso che il numero di core per processore vero per tutti (x86) in offerta continueranno a salire e il numero di unità in virgola mobile per core (accessibile tramite AVX) crescerà anche di più nei prossimi anni. Quindi IMHO, utilizzando GPGPU per compensare una carenza di unità in virgola mobile per chip, sarà probabilmente solo una soluzione preferita a breve termine. Potrebbero esserci dei buoni posti di lavoro disponibili per i buoni programmatori CUDA, sii pronto a cambiare drasticamente l'intero campo nel giro di pochi anni.

    
risposta data 06.02.2011 - 00:10
fonte
3

In primo luogo i linguaggi funzionali, è che aiutano solo perché le sue funzioni sono intrinsecamente rientranti (poiché non modificano alcun dato al di fuori di esse), e quindi possono essere eseguite come thread (magari in un altro processore) più facilmente di una normale funzione procedurale (o metodo orientato agli oggetti), ma puoi anche archiviarla in una lingua normale, quindi devi solo imparare le lingue funzionali se hai un reale interesse per esse. (La mia ipotesi è che non lo fai, e che hai appena appreso che Lua e altri linguaggi funzionali sono utilizzati molto nello sviluppo del gioco, e sei andato con la marea)

In secondo luogo, non è necessario imparare OpenCL per eseguire il calcolo parallelo, semplici thread nativi e altri meccanismi sono sufficienti, perché il calcolo parallelo può essere utilizzato nei giochi, se si ha un thread che fa tutto il disegno e altro thread che calcola le collisioni, i percorsi dei caratteri, ecc. in background.

    
risposta data 05.02.2011 - 23:09
fonte
2

Iniziando con l'ultima domanda, la programmazione funzionale non è necessariamente importante per comprendere il calcolo parallelo, ma può essere utile per la programmazione parallela. In particolare, la mancanza di modifiche dello stato significa che di solito è relativamente facile avere alcune funzioni x e una funzione che si eseguono isolatamente l'una dall'altra, e si assicura che entrambe funzionino nello stesso modo come farebbero se (per esempio) condividessero un spazio degli indirizzi. Significa anche che tutte le comunicazioni tra le funzioni sono facili da rilevare e generalmente ben conosciute dall'inizio.

Continuando indietro, direi che il modo migliore per capire qualcosa come Cuda o OpenCL è quello di studiarlo direttamente. La maggior parte dei modelli teorici presuppone che (ad esempio) una macchina CREW PRAM utilizzi esattamente quel modello in ogni momento, in tutte le circostanze. OpenCL, al contrario, consente di specificare quali dati sono globali e quali dati sono locali. Il suo modello di memoria è descritto in dettaglio abbastanza decente nella specifica OpenCL . Cuda è leggermente diverso, ma lo stesso vale generalmente anche per questo - - Se vuoi usare Cuda, generalmente preferisci studiarlo direttamente. Sì, non sarebbe male aver anche studiato alcuni dei modelli più teorici per avere almeno un'idea di come gli algoritmi di base vengano implementati in macchine in parallelo, ma non aspettatevi che la maggior parte di essi si applichi direttamente.

Non penso che esista un modo migliore per gestire la programmazione parallela, non più del modo migliore per gestire la programmazione seriale. Ci sono (almeno) una mezza dozzina di modelli / paradigmi / qualsiasi cosa che la programmazione seriale abbia seguito nel corso degli anni. Sono abbastanza sicuro che tutti questi e altri si applicheranno anche alla programmazione parallela.

    
risposta data 05.02.2011 - 21:03
fonte
1

Il calcolo parallelo e distribuito vanno di pari passo. Omega Centauri ha giustamente sottolineato l'architettura della memoria condivisa. Ma l'architettura condivisa di nulla basata sul modello di attore sembra essere il precursore dell'informatica generale. Se vuoi imparare la programmazione parallela in generale, dal momento che anche le CPU moltiplicano i loro core, ti suggerisco di imparare quanto segue

  1. Informatica distribuita in generale. Sistemi distribuiti: Concept and Design ti offre una visione eccellente
  2. MapReduce - solo per pensare in modo parallelo e distribuito
  3. Erlang - Programmazione attuale

Inoltre, OpenCL è indipendente dalla piattaforma mentre CUDA non lo è, ma CUDA è più maturo. E una nota finale, né MapReduce è un proiettile d'argento, né Erlang è una macchina veloce

    
risposta data 19.12.2011 - 15:35
fonte

Leggi altre domande sui tag