concurrency - Come posso far funzionare un programma concorrente già scritto su un array GPU?




erlang cuda parallel-processing (3)

No, usare CUDA non è cosa da poco.

Il modello di programmazione CUDA utilizza fondamentalmente C (con alcune aggiunte) ma per ottenere il massimo dalle funzionalità di GPGPU è necessario assicurarsi che i propri algoritmi seguano le linee guida CUDA. (consultare la Guida alla programmazione NVidia CUDA )

Ad esempio, per ottenere le migliori prestazioni di memoria (da qualche parte intorno a 70 Gbps) è necessario accedere alla memoria in modalità streaming con coalescenza, inoltre i rami sono molto costosi sulle GPU quindi è necessario evitare il più possibile i condizionali. Controlla la guida e i campioni forniti con l'SDK, forniranno un eccellente punto di partenza

Ho una rete neurale scritta in Erlang e ho appena acquistato una scheda GeForce GTX 260 con una GPU da 240 core. È banale usare CUDA come colla per eseguirlo sulla scheda grafica?


Vorrei poterti dire come farlo con Erlang ... ;-), ma almeno Satnam Singh di MS Research ha fatto un lavoro molto interessante con Haskell (Lava) e F #. Forse questo documento può darti qualche intuito su come potrebbe essere fatto:

http://research.microsoft.com/en-us/people/satnams/


Non posso rispondere a tutto, ma provo su alcune parti:

C'è qualche ragione per cui il comportamento "più asincrono" - vale a dire, non consumare la raccolta prima di tornare, e non aspettare che ogni futuro venga completato prima di passare alla successiva - non è rappresentato qui?

Se hai calcoli dipendenti e un numero limitato di thread, puoi sperimentare deadlock. Ad esempio hai due futures che dipendono da un terzo (tutti e tre nella lista dei futures) e solo da due thread, puoi sperimentare una situazione in cui i primi due futures bloccano tutti e due i thread e il terzo non viene mai eseguito. (Ovviamente, se la dimensione del tuo pool è una, cioè se esegui un calcolo dopo l'altro, puoi ottenere situazioni simili)

Per risolvere questo, è necessario un thread per futuro, senza alcuna limitazione. Funziona per piccoli elenchi di futures, ma non per quelli grandi. Quindi, se si esegue tutto in parallelo, si otterrà una situazione in cui piccoli esempi verranno eseguiti in tutti i casi e uno più grande si bloccherà. (Esempio: i test degli sviluppatori funzionano bene, i deadlock di produzione).

Esiste un comportamento "corretto" per questa operazione su elenchi e stream?

Penso che sia impossibile con i futures. Se si conosce qualcosa di più delle dipendenze, o quando si è sicuri che i calcoli non verranno bloccati, potrebbe essere possibile una soluzione più concorrente. Ma l'esecuzione di liste di futuri mi sembra "rotta dalla progettazione". La soluzione migliore sembra una, che già fallirà per piccoli esempi di deadlock (vale a dire eseguire un futuro dopo l'altro).

Futures scalaz con liste: attendere che ogni futuro venga completato.

Penso che lo scalaz usi per le comprensioni internamente per attraversare. Con la comprensione, non è garantito che i calcoli siano indipendenti. Quindi immagino che Scalaz stia facendo la cosa giusta qui con delle comprensioni: fare un calcolo dopo l'altro. Nel caso dei futures, questo funzionerà sempre, dato che hai un numero illimitato di thread nel tuo sistema operativo.

Quindi, in altre parole: vedi solo un artefatto di come le comprensioni (devono) funzionare.

Spero che questo abbia un senso.







concurrency erlang cuda parallel-processing gpu