Руководства по 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 ГБ памяти, и это работало очень хорошо. Совместно используемые массивы могут быть обработаны с помощью многопроцессорной обработки . Array или sharedctypes . Вы можете найти документацию по Python здесь - проверьтефайл library.pdf . У меня есть несколько слайдов, объясняющих некоторые из основных частей этого - напишите мне, если хотите.

Если у вас есть конфигурация кластера с распределенной памятью, я думаю, что mpi4py , вероятно, предпочтительный инструмент. Я сам этим не пользовался, но знаю, что он часто используется в параллельном программировании на Python.

Lars1
источник
3

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

И, конечно, есть mpi4py для непосредственного программирования MPI (включен в вышеупомянутую статью)

Суть в следующем: если ваш главный интерес - операции с вектором / матрицей, а параллелизм - это то, что вам «нужно», чтобы сделать это быстро, то вам следует взглянуть на экосистему NumPy / SciPy, и только если вы не найдете вещи там, что вам нужно, если вы хотите написать свои собственные библиотеки

bgschaid
источник