Hướng dẫn về Python để lập trình song song bộ nhớ dùng chung


11

Tôi có kinh nghiệm về mã hóa OpenMP cho các máy Bộ nhớ dùng chung (trong cả C và FORTRAN) để thực hiện các tác vụ đơn giản như cộng ma trận, nhân, v.v. (Chỉ để xem cách nó cạnh tranh với LAPACK). Tôi biết OpenMP đủ để thực hiện các tác vụ đơn giản mà không cần phải xem tài liệu.

Gần đây, tôi đã chuyển sang Python cho các dự án của mình và tôi không có bất kỳ kinh nghiệm nào với Python ngoài những điều cơ bản tuyệt đối.

Tôi có 2 câu hỏi:

  • Có một hướng dẫn tốt (PDF trực tuyến) để mô tả tính toán song song bộ nhớ cho Python không?

  • Cách tốt nhất để đạt được nó là gì? Tôi đã thấy một chút ctypesvà tôi không chắc đó có phải là cách tốt nhất không. (Theo cách tốt nhất, ý tôi là một cái có sự đánh đổi tốt giữa thời gian lập trình viên và thời gian hệ thống. Không nên quá tẻ nhạt để viết mã cũng không nên thực thi chậm)

Câu trả lời:


8

[Đây là bài viết đầu tiên của tôi và tôi hy vọng tôi đã không hoàn toàn hiểu sai về việc sử dụng SE - nếu vậy tôi xin lỗi trước]

Tôi đồng ý với "bgschaid" rằng câu hỏi rất khó trả lời dựa trên thông tin được cung cấp. Nó tạo ra sự khác biệt lớn nếu bạn muốn các thói quen cấp thấp khai thác kiến ​​trúc đa lõi hoặc nếu bạn cần khai thác song song cho các vấn đề song song lúng túng - hoặc một cái gì đó ở giữa. Tổng quan về các khả năng tính toán song song khác nhau trong Python có thể được tìm thấy ở đây .

Trong trường hợp trước, tôi chắc chắn khuyên bạn nên sử dụng các công cụ như NumPy / SciPy , ít nhất là trong phiên bản được biên dịch MKL từ Enth think hỗ trợ các kiến ​​trúc đa lõi. Tại đây, bạn có thể kiểm soát số lượng lõi để sử dụng thông qua biến môi trường "MKL_NUM_THREADS". Điều này phụ thuộc vào các thư viện được tối ưu hóa cao mà chúng ta khó có thể mong đợi để đánh bại hiệu suất một cách khôn ngoan. Tôi tin rằng thường nên sử dụng các thư viện chất lượng cao và tối ưu hóa cao này bất cứ khi nào có thể.

Nếu bạn muốn khai thác song song ở mức độ thô, thì đa xử lý công cụ tiêu chuẩn Python rất dễ sử dụng - và nó cũng hỗ trợ các đối tượng dữ liệu được chia sẻ. Có các công cụ khác nhau để sử dụng như một phần của gói đa xử lý . Tôi đã sử dụng map_async (thích SIMD) và application_async (thích MIMD) cho một số vấn đề có kết quả tốt. Các đa xử gói là khá dễ dàng để sử dụng và trở thành một phần tiêu chuẩn của Python có nghĩa là bạn có thể mong đợi người dùng tiềm năng khác của mã của bạn để dễ dàng có thể sử dụng nó. đa xử lý cũng liên kết trực tiếp đến các đối tượng dữ liệu NumPy. Khi sử dụng đa xử lýTôi khuyên bạn nên đặt biến môi trường "MKL_NUM_THREADS" thành 1 sao cho NumPy chỉ được phép một lõi cho mỗi quy trình / công nhân - nếu không, bạn có thể kết thúc một cuộc tranh chấp tài nguyên giữa NumPy song song và đa xử lý dẫn đến suy giảm hiệu suất. đa xử lý hoạt động tốt cho kiến ​​trúc đa CPU / đa lõi trong cùng một hệ điều hành. Tôi đã sử dụng đa xử lý trên máy tính dùng chung bộ nhớ với 4 x CPU Xeon E7-4850 (mỗi lõi 10) và bộ nhớ 512 GB và nó hoạt động rất tốt. Mảng chia sẻ có thể được xử lý bằng cách đa xử lý.Array hoặc sharedctypes . Bạn có thể tìm thấy tài liệu Python tại đây - kiểm trathư viện.pdf tập tin. Tôi có một số slide giải thích một số phần cơ bản của điều này - PM cho tôi nếu bạn muốn.

Nếu bạn có cấu hình cụm với bộ nhớ phân tán, tôi tin rằng mpi4py có thể là công cụ ưa thích. Tôi đã không sử dụng cái này cho mình nhưng tôi biết rằng nó đang được sử dụng rất nhiều trong lập trình song song Python.


3

Nó phụ thuộc vào mức độ bạn đang cố gắng lập trình song song. Ví dụ cho các công cụ ma trận / vector điểm dừng chân đầu tiên với python sẽ NumPy / scipy (họ cung cấp một giao diện để các thư viện số mà cung cấp cho bạn tốc độ đầy đủ của các thư viện với sự tiện lợi của Python) và từ những gì họ viết về xử lý song song có vẻ như nếu các thư viện được biên dịch để sử dụng song song thì các chương trình sẽ tận dụng lợi thế của đa lõi cho các hoạt động nhất định. (có vẻ như bài viết này cũ hơn một chút, trong khi đó, mọi thứ có thể đã được cải thiện. Ngoài ra, còn có các liên kết đến các phương tiện lập trình song song khác.

Và tất nhiên, có mpi4py để trực tiếp lập trình MPI (có trong bài viết trên)

Điểm mấu chốt của tôi là: nếu sở thích chính của bạn là hoạt động vectơ / ma trận và tính song song là thứ bạn "chỉ" cần thực hiện nhanh thì bạn nên xem hệ sinh thái NumPy / SciPy và chỉ khi bạn không tìm thấy những thứ mà bạn cần nếu bạn đồng ý viết thư viện của riêng bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.