elenco di oggetti di calcolo parallelo

1

Ho una lista di oggetti che richiedono tutti lo stesso filtraggio, fondamentalmente un insieme di condizionali in una funzione che emette se l'oggetto è "buono" o "cattivo". Voglio mantenere tutti i miei "buoni" oggetti nella lista. Diciamo che ho 1000 oggetti in questa lista e la funzione che voglio filtrare in scritto. Quali lingue / funzionalità massimizzerebbero il modo in cui questa operazione potrebbe essere parallela? Ho giocato con il multiprocessing di Python, che migliora le prestazioni, ma mi ha comunque lasciato insoddisfatto. Suppongo che questo sia un problema "imbarazzantemente parallelo" in quanto nessuno stato deve essere condiviso.

    
posta tonyl7126 30.04.2013 - 02:24
fonte

1 risposta

2

Non sono del tutto sicuro su cosa rispondere a questa domanda, ma mi vengono in mente due possibilità immediate:

Scala

Dato che stai già descrivendo il problema in modo funzionale e dichiari esplicitamente che non hai uno stato condiviso, l'API di raccolta parallela di Scala sembra una soluzione perfetta per il problema. Tuttavia, potrebbe non fornire le massime prestazioni (vedere sotto per quello), ma richiederà certamente solo un piccolo sforzo per l'installazione. Qualcosa di simile al seguente è tutto ciò che serve davvero:

myList.par.filter(goodBadCondition)

Il .par trasforma qualsiasi raccolta in una parallelizzata, che esegue operazioni come filter in parallelo usando il fork / join-support di JVM. Si noti che le operazioni di raccolta parallela sono stabili, ovvero l'ordine degli elementi della lista originale rimane lo stesso nel risultato (per quegli elementi che hanno superato la condizione).

basato su GPU

Se vuoi davvero spremere il massimo delle prestazioni, lasciare che la GPU esegua il filtraggio sembra la soluzione perfetta. In questo caso, la maggior parte della perdita di velocità deriva dal dover inviare dati alla / dalla GPU. Mentre l'operazione che si desidera eseguire è perfetta per qualcosa come Cuda, non sono del tutto sicuro che valga la pena. Ad esempio, se la tua condizione è molto semplice ed estremamente veloce da controllare, allora il sovraccarico di dover trasferire l'intera lista alla GPU potrebbe non ripagare su una CPU quad core che può elaborare l'intera lista nella sua memoria.

D'altra parte, se le condizioni del filtro sono costose da controllare, è possibile controllare più elementi contemporaneamente rispetto a una CPU. A seconda della carta che utilizzi, puoi eseguire decine di centinaia di core GPU per eseguire il lavoro.

Tuttavia, lo sforzo di implementazione di questo approccio è molto più alto di quello sopra. Devi anche avere molta più conoscenza sulla programmazione della GPU e avrai bisogno di molto codice per un compito apparentemente banale (i nuovi framework per semplificare questo stanno cominciando ad apparire però).

    
risposta data 30.04.2013 - 07:23
fonte

Leggi altre domande sui tag