Guias no Python para programação paralela de memória compartilhada

11

Tenho experiência em codificar OpenMP para máquinas de memória compartilhada (em C e FORTRAN) para realizar tarefas simples como adição de matriz, multiplicação etc. (Apenas para ver como ele compete com o LAPACK). Conheço o OpenMP o suficiente para realizar tarefas simples sem a necessidade de consultar a documentação.

Recentemente, mudei para o Python para meus projetos e não tenho nenhuma experiência com o Python além do básico absoluto.

Eu tenho 2 perguntas:

  • Existe um bom guia (PDF online) para descrever a computação paralela de memória compartilhada para Python?

  • Qual é a melhor maneira de alcançá-lo? Eu já vi um pouco ctypese não tenho certeza se essa é a melhor maneira. (Na melhor das hipóteses, quero dizer um que tenha uma boa relação entre o tempo do programador e o tempo do sistema. Não deve ser muito entediante de codificar, nem a execução deve ser lenta)

Inquérito
fonte

Respostas:

8

[Este é meu primeiro post e espero não ter entendido completamente o uso do SE - se assim for, peço desculpas antecipadamente]

Eu concordo com "bgschaid" que a pergunta é muito difícil de responder com base nas informações fornecidas. Faz uma enorme diferença se você deseja que rotinas de baixo nível explorem uma arquitetura de vários núcleos ou se você precisa explorar o paralelismo para problemas embaraçosamente paralelos - ou algo intermediário. Uma visão geral das diferentes possibilidades de computação paralela no Python pode ser encontrada aqui .

No primeiro caso, com certeza recomendo usar ferramentas como o NumPy / SciPy que, pelo menos na versão compilada MKL da Enthought, suporta arquiteturas de vários núcleos. Aqui você pode controlar o número de núcleos a serem usados ​​através da variável de ambiente "MKL_NUM_THREADS". Isso depende de bibliotecas altamente otimizadas que dificilmente podemos esperar que superem o desempenho. Eu acredito que geralmente é aconselhável usar essas bibliotecas de alta qualidade e altamente otimizadas sempre que possível.

Se você deseja explorar o paralelismo em um nível aproximado, o multiprocessamento padrão da ferramenta Python é fácil de usar - e também suporta objetos de dados compartilhados. Existem diferentes ferramentas para usar como parte do pacote de multiprocessamento . Eu usei map_async (como SIMD) e apply_async (como MIMD) para vários problemas com bons resultados. O pacote de multiprocessamento é bastante fácil de usar e, como parte padrão do Python, significa que você pode esperar que outros usuários em potencial do seu código possam utilizá-lo facilmente. o multiprocessamento também vincula diretamente aos objetos de dados NumPy. Ao usar o multiprocessamentoEu recomendo que você defina a variável de ambiente "MKL_NUM_THREADS" como 1, de modo que o NumPy seja permitido apenas um núcleo para cada processo / trabalhador - caso contrário, você poderá acabar em uma contenção de recursos entre o NumPy e o multiprocessamento, o que leva a uma degradação no desempenho. O multiprocessamento funciona bem para uma arquitetura com várias CPUs / núcleos no mesmo sistema operacional. Usei o multiprocessamento em um computador com memória compartilhada com 4 CPUs Xeon E7-4850 (cada 10 núcleos) e 512 GB de memória e funcionou extremamente bem. Matrizes compartilhadas podem ser manipuladas por multiprocessing.Array ou sharedctypes . Você pode encontrar a documentação do Python aqui - verifique oarquivo library.pdf . Eu tenho alguns slides explicando algumas das partes básicas disso - PM me, se você quiser.

Se você tiver uma configuração de cluster com memória distribuída, acredito que o mpi4py seja provavelmente a ferramenta preferida. Eu não usei isso sozinho, mas sei que ele está sendo muito usado na programação paralela do Python.

Lars1
fonte
3

Depende do nível que você está tentando programar em paralelo. Por exemplo, para itens de matriz / vetor, a primeira parada com python seria NumPy / SciPy (eles fornecem uma interface para bibliotecas numéricas que fornece a velocidade total das bibliotecas com a conveniência do Python) e, pelo que eles escrevem sobre paralelismo , parece que se as bibliotecas são compiladas para uso paralelo, os programas aproveitam os multicores para determinadas operações. (parece que este artigo é um pouco mais antigo, por isso as coisas podem ter melhorado nesse meio tempo. Também há links para outros meios de programação paralela.

E é claro que há mpi4py para programar diretamente o MPI (incluído no artigo acima)

Meu ponto principal é: se seu principal interesse é operações vetoriais / matriciais e o paralelismo é algo que você "apenas" precisa fazer rápido, então deve dar uma olhada no ecossistema NumPy / SciPy e somente se você não encontrar o coisas que você precisa, caso você precise escrever suas próprias bibliotecas

bgschaid
fonte