Przewodniki po języku Python dotyczące programowania równoległego w pamięci współużytkowanej

11

Mam doświadczenie w kodowaniu OpenMP dla maszyn z pamięcią współużytkowaną (zarówno w C, jak i FORTRAN), aby wykonywać proste zadania, takie jak dodawanie macierzy, mnożenie itp. (Aby zobaczyć, jak konkuruje z LAPACK). Wiem, że OpenMP wystarcza do wykonywania prostych zadań bez konieczności przeglądania dokumentacji.

Ostatnio przeszedłem na Python dla moich projektów i nie mam żadnego doświadczenia z Pythonem poza absolutnymi podstawami.

Mam 2 pytania:

  • Czy istnieje dobry przewodnik (online PDF) opisujący równoległe przetwarzanie pamięci współdzielonej dla Pythona?

  • Jaki jest najlepszy sposób na osiągnięcie tego? Widziałem trochę ctypesi nie jestem pewien, czy to najlepszy sposób. (Mówiąc najlepiej, mam na myśli taki, który ma dobry kompromis między czasem programisty a czasem systemowym. Nie powinno to być zbyt żmudne do kodowania, a także powolne wykonywanie)

Śledztwo
źródło

Odpowiedzi:

8

[To jest mój pierwszy post i mam nadzieję, że całkowicie nie zrozumiałem użycia SE - jeśli tak, z góry przepraszam]

Zgadzam się z „bgschaid”, że na pytanie bardzo trudno odpowiedzieć na podstawie dostarczonych informacji. To ogromna różnica, jeśli chcesz, aby procedury niskiego poziomu wykorzystywały architekturę wielordzeniową lub jeśli potrzebujesz równoległości w przypadku kłopotliwych równoległych problemów - lub czegoś pośredniego. Przegląd różnych możliwości obliczeń równoległych w Pythonie można znaleźć tutaj .

W pierwszym przypadku z pewnością polecam korzystanie z narzędzi takich jak NumPy / SciPy, które przynajmniej w skompilowanej wersji MKL od Enthought obsługuje architektury wielordzeniowe. Tutaj możesz kontrolować liczbę rdzeni do użycia za pomocą zmiennej środowiskowej „MKL_NUM_THREADS”. Opiera się to na wysoce zoptymalizowanych bibliotekach, których nie możemy oczekiwać pod względem wydajności. Uważam, że zaleca się korzystanie z tych wysokiej jakości i wysoce zoptymalizowanych bibliotek, gdy tylko jest to możliwe.

Jeśli chcesz wykorzystać równoległość na zgrubnym poziomie, standardowe wieloprzetwarzanie narzędzi w języku Python jest łatwe w użyciu - i obsługuje również współdzielone obiekty danych. Istnieją różne narzędzia do wykorzystania jako część pakietu wieloprocesowego . Użyłem map_async (podobny do SIMD) i apply_async (podobny do MIMD) dla kilku problemów z dobrymi wynikami. Wieloprocesorowe Pakiet jest bardzo prosty w obsłudze i jest standardową częścią Pythona oznacza, że można się spodziewać inni potencjalni użytkownicy swój kod łatwo móc go używać. Multiprocessing prowadzi również bezpośrednio do obiektów danych NumPy. Podczas korzystania z wielu procesówPolecam ustawić zmienną środowiskową „MKL_NUM_THREADS” na 1, tak aby NumPy był dozwolony tylko jeden rdzeń dla każdego procesu / procesu roboczego - w przeciwnym razie możesz skończyć z rywalizacją o zasoby między NumPy równoległym a wieloprocesowym, co prowadzi do obniżenia wydajności. Multiprocessing działa dobrze dla architektury wieloprocesorowej / wielordzeniowej w tym samym systemie operacyjnym. Użyłem przetwarzania wieloprocesorowego na komputerze z pamięcią współdzieloną z 4 procesorami Xeon E7-4850 (każdy 10 rdzeni) i 512 GB pamięci i działało to bardzo dobrze. Tablice współdzielone mogą być obsługiwane przez proces wieloprocesowy . Tablica lub typy współdzielone . Dokumentację Pythona można znaleźć tutaj - sprawdźplik biblioteki.pdf . Mam kilka slajdów wyjaśniających niektóre podstawowe części tego - napisz do mnie, jeśli chcesz.

Jeśli masz konfigurację klastra z pamięcią rozproszoną, uważam, że mpi4py jest prawdopodobnie preferowanym narzędziem. Nie używałem tego sam, ale wiem, że jest on często używany w programowaniu równoległym w Pythonie.

Lars1
źródło
3

To zależy od poziomu, który próbujesz zaprogramować równolegle. Na przykład dla macierzy / wektorów pierwszym przystankiem dla Pythona byłoby NumPy / SciPy (zapewniają one interfejs do bibliotek numerycznych, co daje pełną prędkość bibliotek z wygodą Pythona) i z tego, co piszą o równoległości , wydaje się, że jeśli biblioteki są skompilowane do użytku równoległego, wówczas programy wykorzystują multikresy do niektórych operacji. (wygląda na to, że ten artykuł jest nieco starszy, w międzyczasie rzeczy mogły się poprawić. Są też linki do innych metod programowania równoległego.

I oczywiście istnieje mpi4py do bezpośredniego programowania MPI (zawarte w powyższym artykule)

Moja podstawowa kwestia: jeśli twoim głównym zainteresowaniem są operacje wektorowe / macierzowe, a równoległość jest czymś, co „tylko” musisz zrobić to szybko, powinieneś spojrzeć na ekosystem NumPy / SciPy i tylko jeśli nie znajdziesz rzeczy, których potrzebujesz, jeśli powinieneś rozważyć napisanie własnych bibliotek

bgschaid
źródło