Ci scusiamo per la vaga domanda sull'argomento, ma sto lavorando su alcune routine di elaborazione video accademiche. Gli algoritmi sono scritti in MATLAB e, sebbene sia adatto per scopi di sviluppo, ha elaborato un video a circa 60spf o circa .0166fps. Inutile dire che questo non sarà sufficiente per le demo e così via, quindi il mio lavoro estivo è convertire la routine in qualcosa che verrà eseguito drasticamente più veloce.Qual è la soluzione migliore per un problema parallelo imbarazzante?
Ho riscritto la parte più lenta del codice per CUDA, la soluzione GPGPU di nvidia. Tuttavia, c'è anche una gran parte del codice che sembra essere meglio fatto sulla CPU, in quanto è relativamente seriale. Il problema è che la macchina che mi è stata data ha 2 processori Xeon, con 8 core logici totali, e sembra essere un peccato strozzare il codice GPU codificando solo per single core. Il processo di conversione video è funzionale in quanto ogni frame non dipende da altri frame, quindi pensavo che una sorta di coda/flusso asincrono sarebbe stata la soluzione migliore.
Qui giace la mia domanda: quale sarebbe il modo migliore per ottenere questo tipo di parallelismo con il miglior rapporto tra sforzo e resa di velocità?
Alcune delle soluzioni che ho visto sono OpenMP, .net TPL e solo semplici pthreads.
Ho solo un'esposizione di base alla programmazione asincrona, quindi preferirei usare una libreria o qualcosa del genere piuttosto che andare in giro con mutex e barriere e spararmi al piede più volte. Non mi dispiace apprendere, perché questo è uno dei miei obiettivi per questa estate, ma allo stesso tempo, il parallelismo è rigido. Tuttavia, se la differenza di velocità è in realtà molto evidente, sono disposto a strapparmi i capelli per un paio di settimane. : P
Grazie in anticipo.
Se è possibile suddividere il problema in più parti su cui è possibile lavorare senza interferenze (con punti di sincronizzazione ben definiti), la "libreria" utilizzata dovrebbe essere solo zucchero ... un modo semplice è solo utilizzare un pool di thread, code simultanee (una per l'input, una per l'output) e solo l'accesso agli oggetti/dati che il thread "possiede" (questo può essere ingrandito a strutture esterne immutabili). –