Guide su Python per la programmazione parallela a memoria condivisa


11

Ho esperienza nella codifica di OpenMP per macchine a memoria condivisa (sia in C che FORTRAN) per svolgere compiti semplici come l'aggiunta di matrici, la moltiplicazione ecc. (Solo per vedere come compete con LAPACK). Conosco OpenMP abbastanza per svolgere compiti semplici senza la necessità di consultare la documentazione.

Di recente, sono passato a Python per i miei progetti e non ho alcuna esperienza con Python oltre le basi assolute.

Ho 2 domande:

  • Esiste una buona guida (PDF online) per descrivere il calcolo parallelo della memoria condivisa per Python?

  • Qual è il modo migliore per raggiungerlo? Ne ho visto un po ' ctypese non sono sicuro che sia il modo migliore. (Per meglio intendo uno che ha un buon compromesso tra l'ora del programmatore e l'ora del sistema. Non dovrebbe essere troppo noioso codificare né l'esecuzione dovrebbe essere lenta)

Risposte:


8

[Questo è il mio primo post e spero di non aver frainteso del tutto l'uso di SE - in tal caso mi scuso in anticipo]

Concordo con "bgschaid" sul fatto che alla domanda è molto difficile rispondere in base alle informazioni fornite. Fa una grande differenza se si desidera che le routine di basso livello sfruttino un'architettura multi-core o se si debba sfruttare il parallelismo per problemi imbarazzantimente paralleli - o qualcosa nel mezzo. Una panoramica delle diverse possibilità di elaborazione parallela in Python è disponibile qui .

Nel primo caso, consiglio di usare strumenti come NumPy / SciPy che almeno nella versione compilata MKL di Enthought supporta architetture multi-core. Qui puoi controllare il numero di core da utilizzare tramite la variabile di ambiente "MKL_NUM_THREADS". Ciò si basa su librerie altamente ottimizzate che difficilmente possiamo aspettarci di battere per quanto riguarda le prestazioni. Credo che si consiglia generalmente di utilizzare queste librerie di alta qualità e altamente ottimizzate quando possibile.

Se si desidera sfruttare il parallelismo a un livello approssimativo, il multiprocessing dello strumento standard Python è facile da usare e supporta anche oggetti di dati condivisi. Esistono diversi strumenti da utilizzare come parte del pacchetto multiprocessing . Ho usato map_async (tipo SIMD) e apply_async (tipo MIMD) per diversi problemi con buoni risultati. Il pacchetto multiprocessing è abbastanza facile da usare ed essendo una parte standard di Python significa che puoi aspettarti che altri potenziali utenti del tuo codice possano facilmente usarlo. il multiprocessing si collega anche direttamente agli oggetti dati NumPy. Quando si utilizza il multiprocessingTi consiglio di impostare la variabile di ambiente "MKL_NUM_THREADS" su 1 in modo tale che a NumPy sia consentito un solo core per ciascun processo / lavoratore, altrimenti potresti finire in una contesa di risorse tra il parallelo NumPy e il multiprocessing che porta a un peggioramento delle prestazioni. il multiprocessing funziona bene per un'architettura multi-CPU / multi-core con lo stesso sistema operativo. Ho usato il multiprocessing su un computer con memoria condivisa con 4 CPU Xeon E7-4850 (ogni 10 core) e 512 GB di memoria e ha funzionato molto bene. Le matrici condivise possono essere gestite tramite multiprocessing.Array o sharedctypes . Puoi trovare la documentazione di Python qui - controlla ilfile library.pdf . Ho alcune diapositive che spiegano alcune delle parti fondamentali di questo - PM me se vuoi quelle.

Se hai una configurazione cluster con memoria distribuita credo che mpi4py sia probabilmente lo strumento preferito. Non l'ho usato da solo, ma so che è molto utilizzato nella programmazione parallela di Python.


3

Dipende dal livello che stai cercando di programmare in parallelo. Ad esempio per le cose matrix / vector la prima tappa con python sarebbe NumPy / SciPy (forniscono un'interfaccia alle librerie numeriche che ti dà tutta la velocità delle librerie con la comodità di Python) e da quello che scrivono sul parallelismo sembra che se le librerie sono compilate per l'uso parallelo, i programmi sfruttano i multicore per determinate operazioni. (sembra che questo articolo sia un po 'più vecchio, ma le cose potrebbero essere migliorate nel frattempo. Inoltre ci sono collegamenti ad altri mezzi di programmazione parallela.

E ovviamente c'è mpi4py per programmare direttamente MPI (incluso nell'articolo sopra)

La mia linea di fondo è: se il tuo interesse principale è il vettore / operazioni a matrice e il parallelismo è qualcosa che "solo" devi fare in fretta, allora dovresti dare un'occhiata all'ecosistema NumPy / SciPy e solo se non trovi il cose di cui hai bisogno se dovessi considerare di scrivere le tue librerie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.