Panduan tentang Python untuk Pemrograman Paralel berbagi-memori

11

Saya memiliki pengalaman dalam pengkodean OpenMP untuk mesin Memori Bersama (baik dalam C dan FORTRAN) untuk melakukan tugas-tugas sederhana seperti penambahan matriks, perkalian dll. (Hanya untuk melihat bagaimana itu bersaing dengan LAPACK). Saya tahu OpenMP cukup untuk melakukan tugas-tugas sederhana tanpa perlu melihat dokumentasi.

Baru-baru ini, saya beralih ke Python untuk proyek-proyek saya dan saya tidak punya pengalaman dengan Python di luar dasar-dasar absolut.

Saya punya 2 pertanyaan:

  • Apakah ada panduan yang baik (PDF online) untuk menjelaskan komputasi paralel paralel memori untuk Python?

  • Apa cara terbaik untuk mencapainya? Saya telah melihat sedikit ctypesdan saya tidak yakin apakah itu cara terbaik. (Yang terbaik yang saya maksud adalah yang memiliki tradeoff yang baik antara waktu programmer dan waktu sistem. Seharusnya tidak terlalu membosankan untuk kode juga eksekusi tidak boleh lambat)

Pemeriksaan resmi
sumber

Jawaban:

8

[Ini adalah posting pertama saya dan saya harap saya belum sepenuhnya salah memahami penggunaan SE - jika demikian saya minta maaf sebelumnya]

Saya setuju dengan "bgschaid" bahwa pertanyaannya sangat sulit dijawab berdasarkan informasi yang diberikan. Itu membuat perbedaan besar jika Anda ingin rutinitas tingkat rendah untuk mengeksploitasi arsitektur multi-inti atau jika Anda perlu mengeksploitasi paralelisme untuk masalah paralel yang memalukan - atau sesuatu di antaranya. Ikhtisar kemungkinan komputasi paralel yang berbeda dalam Python dapat ditemukan di sini .

Dalam kasus sebelumnya saya pasti merekomendasikan untuk menggunakan alat-alat seperti NumPy / SciPy yang setidaknya dalam versi yang dikompilasi MKL dari Enthought mendukung arsitektur multi-core. Di sini Anda dapat mengontrol jumlah inti yang akan digunakan melalui variabel lingkungan "MKL_NUM_THREADS". Hal ini bergantung pada pustaka yang sangat optimal yang hampir tidak dapat kita harapkan untuk mengalahkan kinerja secara bijaksana. Saya percaya pada umumnya disarankan untuk menggunakan perpustakaan yang berkualitas tinggi dan sangat optimal ini bila memungkinkan.

Jika Anda ingin mengeksploitasi paralelisme pada level kasar, multiprocessing alat standar Python mudah digunakan - dan juga mendukung objek data bersama. Ada beberapa alat yang berbeda untuk digunakan sebagai bagian dari paket multi - pemrosesan . Saya telah menggunakan map_async (suka SIMD) dan apply_async (suka MIMD) untuk beberapa masalah dengan hasil yang baik. The multiprocessing paket ini sangat mudah untuk digunakan dan menjadi bagian standar dari Python berarti bahwa Anda dapat mengharapkan pengguna potensial lainnya dari kode Anda untuk dengan mudah dapat menggunakannya. multiprocessing juga menghubungkan ke objek data NumPy secara langsung. Saat menggunakan multiprosesorSaya akan merekomendasikan Anda untuk mengatur variabel lingkungan "MKL_NUM_THREADS" menjadi 1 sehingga NumPy hanya diizinkan satu inti untuk setiap proses / pekerja - jika tidak, Anda dapat berakhir dalam pertentangan sumber daya antara NumPy paralel dan multiprosesor yang mengarah pada penurunan kinerja. multiprocessing berfungsi dengan baik untuk arsitektur multi-CPU / multi-core di bawah sistem operasi yang sama. Saya telah menggunakan multiprosesor pada komputer memori bersama dengan CPU 4 x Xeon E7-4850 (masing-masing 10 core) dan memori 512 GB dan itu bekerja dengan sangat baik. Array bersama dapat ditangani dengan multiprocessing . Array atau sharedctypes . Anda dapat menemukan dokumentasi Python di sini - periksafile library.pdf . Saya punya beberapa slide yang menjelaskan beberapa bagian dasar dari ini - PM saya jika Anda menginginkannya.

Jika Anda memiliki konfigurasi cluster dengan memori terdistribusi, saya yakin mpi4py kemungkinan merupakan alat yang disukai. Saya belum pernah menggunakan ini sendiri tetapi saya tahu bahwa itu banyak digunakan dalam pemrograman paralel Python.

Lars1
sumber
3

Itu tergantung pada level yang Anda coba program paralel. Sebagai contoh untuk hal-hal matriks / vektor perhentian pertama dengan python adalah NumPy / SciPy (mereka menyediakan antarmuka ke perpustakaan numerik yang memberi Anda kecepatan penuh perpustakaan dengan kenyamanan Python) dan dari apa yang mereka tulis tentang paralelisme tampaknya bahwa jika pustaka dikompilasi untuk penggunaan paralel, maka program memanfaatkan multicores untuk operasi tertentu. (sepertinya artikel ini sedikit lebih tua, sementara itu hal-hal mungkin telah membaik sementara itu. Juga ada tautan ke cara lain pemrograman paralel.

Dan tentu saja ada mpi4py untuk langsung memprogram MPI (termasuk dalam artikel di atas)

Intinya adalah: jika minat utama Anda adalah operasi vektor / matriks dan paralelisme adalah sesuatu yang "hanya" perlu Anda lakukan dengan cepat maka Anda harus melihat pada ekosistem NumPy / SciPy dan hanya jika Anda tidak menemukan hal-hal di sana yang Anda butuhkan jika Anda diminta menulis perpustakaan Anda sendiri

bgschaid
sumber