Guías en Python para la programación paralela de memoria compartida

11

Tengo experiencia en la codificación de OpenMP para máquinas de memoria compartida (tanto en C como en FORTRAN) para llevar a cabo tareas simples como la suma de matrices, la multiplicación, etc. (Solo para ver cómo compite con LAPACK). Conozco OpenMP lo suficiente como para llevar a cabo tareas simples sin la necesidad de consultar la documentación.

Recientemente, cambié a Python para mis proyectos y no tengo ninguna experiencia con Python más allá de lo básico absoluto.

Tengo 2 preguntas:

  • ¿Existe una buena guía (PDF en línea) para describir la computación paralela de memoria compartida para Python?

  • ¿Cuál es la mejor manera de lograrlo? He visto un poco ctypesy no estoy seguro si esa es la mejor manera. (Por mejor quiero decir uno que tiene un buen equilibrio entre el tiempo del programador y el tiempo del sistema. No debería ser demasiado tedioso para codificar ni la ejecución debería ser lenta)

Encuesta
fuente

Respuestas:

8

[Esta es mi primera publicación y espero no haber entendido completamente mal el uso de SE; si es así, me disculpo de antemano]

Estoy de acuerdo con "bgschaid" en que la pregunta es muy difícil de responder según la información proporcionada. Hace una gran diferencia si desea que las rutinas de bajo nivel exploten una arquitectura multinúcleo o si necesita explotar el paralelismo para problemas vergonzosamente paralelos, o algo intermedio. Aquí se puede encontrar una descripción general de las diferentes posibilidades de computación paralela en Python .

En el primer caso, de seguro recomiendo usar herramientas como NumPy / SciPy, que al menos en la versión compilada de MKL de Enthought admite arquitecturas de múltiples núcleos. Aquí puede controlar el número de núcleos a utilizar a través de la variable de entorno "MKL_NUM_THREADS". Esto se basa en bibliotecas altamente optimizadas que difícilmente podemos esperar que superen el rendimiento inteligente. Creo que generalmente se recomienda utilizar estas bibliotecas de alta calidad y altamente optimizadas siempre que sea posible.

Si desea explotar el paralelismo en un nivel aproximado, el multiprocesamiento de la herramienta estándar de Python es fácil de usar, y también admite objetos de datos compartidos. Hay diferentes herramientas para usar como parte del paquete de multiprocesamiento . He usado map_async (como SIMD) y apply_async (como MIMD) para varios problemas con buenos resultados. El paquete de multiprocesamiento es bastante fácil de usar y ser parte estándar de Python significa que puede esperar que otros usuarios potenciales de su código puedan usarlo fácilmente. el multiprocesamiento también se vincula a los objetos de datos NumPy directamente. Cuando se usa multiprocesamientoLe recomendaría que establezca la variable de entorno "MKL_NUM_THREADS" en 1 para que NumPy solo tenga permitido un núcleo para cada proceso / trabajador; de lo contrario, podría terminar en una contención de recursos entre NumPy paralelo y multiprocesamiento que conduce a una degradación del rendimiento. el multiprocesamiento funciona bien para una arquitectura multi-CPU / multi-core bajo el mismo sistema operativo. He utilizado el multiprocesamiento en una computadora con memoria compartida con 4 CPU Xeon E7-4850 (cada 10 núcleos) y 512 GB de memoria y funcionó extremadamente bien. Las matrices compartidas se pueden manejar mediante multiprocesamiento, matriz o tipos compartidos . Puede encontrar la documentación de Python aquí : consulte elarchivo library.pdf . Tengo algunas diapositivas que explican algunas de las partes básicas de esto: envíame un PM si quieres.

Si tiene una configuración de clúster con memoria distribuida, creo que mpi4py es probablemente la herramienta preferida. No lo he usado yo mismo, pero sé que se está usando mucho en la programación paralela de Python.

Lars1
fuente
3

Depende del nivel que esté intentando programar en paralelo. Por ejemplo, para cosas de matriz / vector, la primera parada con python sería NumPy / SciPy (proporcionan una interfaz para bibliotecas numéricas que le brinda la velocidad total de las bibliotecas con la comodidad de Python) y, según lo que escriben sobre el paralelismo , parece que Si las bibliotecas se compilan para uso paralelo, los programas aprovechan los núcleos múltiples para ciertas operaciones. (Parece que este artículo es un poco más antiguo, mientras tanto, las cosas podrían haber mejorado. También hay enlaces a otros medios de programación paralela.

Y, por supuesto, hay mpi4py para programar directamente MPI (incluido en el artículo anterior)

Mi conclusión es: si su interés principal son las operaciones vectoriales / matriciales y el paralelismo es algo que "solo" necesita hacer rápido, entonces debe echar un vistazo al ecosistema NumPy / SciPy y solo si no encuentra el cosas allí que necesita en caso de que tenga que escribir sus propias bibliotecas

bgschaid
fuente