Посібники з Python для паралельного програмування спільної пам'яті


11

У мене є досвід кодування OpenMP для машин спільної пам'яті (як на C, так і на FORTRAN) для виконання простих завдань, таких як додавання матриць, множення тощо (лише для того, щоб побачити, як вона конкурує з LAPACK). Я знаю OpenMP достатньо для виконання простих завдань без необхідності переглядати документацію.

Нещодавно я перейшов на Python для своїх проектів, і я не маю досвіду роботи з Python за межами абсолютних основ.

У мене є 2 питання:

  • Чи є хороший посібник (онлайн-PDF) для опису паралельних обчислень спільної пам'яті для Python?

  • Який найкращий спосіб досягти цього? Я трохи бачив ctypesі не впевнений, чи це найкращий спосіб. (У кращому випадку я маю на увазі ту, яка має добрий компроміс між програмістським часом і системним часом. Це не повинно бути занадто стомлюючим, а також виконання не повинно бути повільним)

Відповіді:


8

[Це мій перший пост, і я сподіваюся, що я не повністю зрозумів використання SE - якщо так, я заздалегідь вибачаюся]

Я погоджуюся з "bgschaid", що на питання дуже важко відповісти на основі наданої інформації. Це має величезну різницю, якщо ви хочете, щоб підпрограми низького рівня використовували багатоядерну архітектуру або якщо вам потрібно використовувати паралелізм для бентежно паралельних проблем - чи щось середнє. Огляд різних можливостей паралельних обчислень на Python можна знайти тут .

У першому випадку я точно рекомендую використовувати такі інструменти, як NumPy / SciPy, які принаймні в MKL, зібраній версії Enthought, підтримують багатоядерні архітектури. Тут ви можете контролювати кількість ядер для використання за допомогою змінної середовища "MKL_NUM_THREADS". Це спирається на високооптимізовані бібліотеки, які ми навряд чи можемо розраховувати на ефективність. Я вважаю, що зазвичай рекомендується використовувати ці високоякісні та високооптимізовані бібліотеки, коли це можливо.

Якщо ви хочете використовувати паралелізм на грубому рівні, багатопроцесорний стандартний інструмент Python простий у використанні - він також підтримує спільні об'єкти даних. Існують різні інструменти для використання в рамках багатопроцесорного пакету. Я використовував map_async (подібний до SIMD) та apply_async (подібний MIMD) для кількох проблем з хорошими результатами. Багатопроцесорних пакет досить простий у використанні і є стандартною частиною Python означає , що ви можете очікувати , що інші потенційні користувачі вашого коду легко бути в змозі використати його. багатопроцесорне також безпосередньо посилається на об'єкти даних NumPy. При використанні багатопроцесорної обробкиЯ рекомендую вам встановити змінну середовища "MKL_NUM_THREADS" на 1 таким чином, що NumPy дозволено лише одне ядро ​​для кожного процесу / працівника - інакше ви можете опинитися в конфлікті ресурсів між паралельними і багатопроцесорними NumPy, що призводить до зниження продуктивності. багатопроцесорна робота добре працює для багатопроцесорної / багатоядерної архітектури в одній операційній системі. Я використовував мультипроцесори на комп'ютері загальної пам'яті з 4-х процесорами Xeon E7-4850 (кожні 10 ядер) та 512 Гб пам'яті, і це працювало надзвичайно добре. Спільні масиви можна обробляти за допомогою мультипроцесора. Масив або спільні типи . Ви можете знайти тут документацію Python - перевіртеФайл library.pdf . У мене є слайди, що пояснюють деякі основні частини цього, - примчайте мене, якщо ви хочете їх.

Якщо у вас є конфігурація кластера з розподіленою пам'яттю, я вважаю, що mpi4py , ймовірно, є кращим інструментом. Я сам цього не використовував, але знаю, що він багато використовується в паралельному програмуванні Python.


3

Це залежить від рівня, який ви намагаєтеся програмувати паралельно. Наприклад, для матричного / векторного матеріалу першою зупинкою з python була б NumPy / SciPy (вони забезпечують інтерфейс до числових бібліотек, який дає вам повну швидкість роботи бібліотек із зручністю Python), а з того, що вони пишуть про паралелізм, здається, що якщо бібліотеки збираються для паралельного використання, то програми використовують переваги багатоядерних певних операцій. (схоже, ця стаття трохи старша, тому що, можливо, тим часом покращилися. Також є посилання на інші засоби паралельного програмування.

І звичайно, є mpi4py, щоб безпосередньо програмувати MPI (включений у вищевказану статтю)

Моя суть полягає в тому, що якщо ваш головний інтерес - векторні / матричні операції, а паралелізм - це те, що вам потрібно «зробити» швидко, тоді ви повинні подивитися на екосистему NumPy / SciPy і лише якщо ви не знайдете речі, які вам знадобляться, якщо ви хочете писати власні бібліотеки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.