Отсутствует «Сравнение API параллельной обработки». Как выбрать многопоточную библиотеку? - PullRequest
6 голосов
/ 26 февраля 2010

Я использую фразы Parallel Processing & Multi Threading взаимозаменяемо, потому что я чувствую, что между ними нет никакой разницы. Если я ошибаюсь, поправьте меня.

Я не профессионал в параллельной обработке / многопоточности. Я знаком с & использовал потоки .NET & POSIX. Ничего больше.

Я просто просматривал архивы SO по многопоточности и удивился, увидев так много библиотек для многопоточности.

http://en.wikipedia.org/wiki/Template:Parallel_computing перечисляет API-интерфейсы хорошо известных (я не уверен, существуют ли другие) многопоточных библиотек.

  1. Темы POSIX
  2. OpenMP
  3. PVM
  4. MPI
  5. UPC
  6. Строительные блоки Intel Threading
  7. Boost.Thread
  8. Глобальные массивы
  9. Charm ++
  10. Cilk
  11. Co-массив Фортран
  12. 1037 * CUDA *

Кроме того, я удивлен, что http://en.wikipedia.org/wiki/Comparison_of_Parallel_Computing_Libraries_(API) отсутствует.

До сих пор у меня никогда не было ситуации, когда мне нужно выбирать между этими библиотеками. Но, если я столкнусь с одной из таких ситуаций.

  1. Как мне выбрать один?
  2. Какие плюсы и минусы у этих библиотек?
  3. Почему у нас так много библиотек для атаки на одну проблему?
  4. Какой из них лучший?

Ответы [ 6 ]

9 голосов
/ 26 февраля 2010

[1] Правильный выбор параллельной библиотеки зависит от типа целевой параллельной машины : (1) машина с общей памятью (т.е. многоядерные) и (2) машина с распределенной памятью (то есть Cell) , Grid-вычисления, CUDA). Вам также необходимо подумать, какую модель параллельного программирования вы хотите: (1) универсальные многопоточные приложения, (2) параллелизм на уровне цикла, (3) расширенный параллелизм, такой как конвейер, (4) данные параллелизм.

Во-первых, модель разделяемой памяти - это просто многопоточное программирование, поскольку адресное пространство по всем вычислительным ядрам (например, многопроцессорным чипам и симметричным многопроцессорным процессам) совместно используется. Нет необходимости явно обмениваться данными между потоками и процессами. OpenMP, Cilk, TBB - все для этого домена.

Модель распределенной памяти раньше была моделью основного параллельного программирования для суперкомпьютеров, где каждая отдельная машина (т. Е. Адресное пространство не используется совместно) подключена через ограниченную сеть. MPI - самая известная модель программирования для него. Однако эта модель все еще существует, особенно для программирования на основе CUDA и Cell, где адресное пространство памяти не используется совместно. Например, CUDA разделяет память CPU и память GPU. Вам явно необходимо передавать данные между памятью процессора и памятью графического процессора.

Далее необходимо рассмотреть модель параллельного программирования . Потоки POSIX предназначены для многопоточного программирования общего назначения (например, многопоточных веб-серверов). Тем не менее, OpenMP очень специализирован для параллелизма на уровне цикла, чем обычный API потока POSIX / Win32. Это упрощает нить форк и соединение. Intel TBB поддерживает различный параллелизм на уровне задач, включая циклы и конвейеры. Существует еще один параллелизм, который вы можете использовать: параллелизм на уровне данных. Для этой проблемы GPGU будет лучше, чем CPU, поскольку GPGPU специализируется для параллельных рабочих нагрузок. Есть также модель программирования, называемая потоковой обработкой.

[2] Я уже ответил выше.

[3] Просто. Существует много разных параллельных / параллельных моделей программирования и разных параллельных машин. Итак, это не единственная проблема; В параллельном / параллельном программировании так много подзадач, которые на данный момент не могут быть решены с помощью супер-единой модели программирования.

[4] Это зависит. Серьезно.

3 голосов
/ 26 февраля 2010
  • mpi - это передача сообщений, а не многопоточный интерфейс

  • pvm заменяется mpi для большинства целей

  • cilkв большинстве случаев не работает

  • UPC, Co-массив Fortran, глобальные массивы не являются многопоточными библиотеками, они предназначены для работы с распределенной памятью

  • Cuda для устройств, сильно отличающихся от обычных процессоров.

  • OpenMP может быть ограничением, если вы работаете вне вычислительной алгебры / приложений

  • Потоки POSIXде-факто стандарт в UNIX, я не уверен насчет Windows

  • boost.thread - это универсальная объектно-ориентированная оболочка для базовых библиотек

  • прелестьне широко используется за пределами вычислительной химии / биологии

  • Блоки Intel имеют много функций, но это сложная библиотека для использования

Я думаюНить буста - хорошая середина.окончательный выбор зависит от того, что вы пытаетесь сделать.

2 голосов
/ 26 февраля 2010

Многопоточность - это способ достижения «параллельной обработки» на подходящем компьютере (с несколькими процессорами / ядрами) и современной операционной системой. Но «параллельная обработка» также может быть осуществлена ​​на кластере «без разделения ресурсов», который взаимодействует через какую-то сеть (ethernet для копеек и myrinet или дельфин для богатых исследовательских групп / компаний), где на каждом компьютере может быть один ЦП и большую часть времени запускает один пользовательский поток.

1 голос
/ 26 февраля 2010

Правильный выбор зависит от выбранной вами архитектуры.

MPI и PVM - это интерфейсы передачи сообщений, которые обычно используются для координации работы между узлами в системах кластерного типа (то есть несколькими независимыми вычислительными узлами с сетевыми соединениями). Потоки в их многочисленных формах используются для распределения работы между несколькими ядрами или процессорами в рамках одного образа системы (т. Е. С общей памятью).

Также обратите внимание, что выбор не обязательно является взаимоисключающим. В аспирантуре я написал программу, которая использовала MPI для связи между узлами суперкомпьютера и использовал pthreads, чтобы использовать преимущества SMP на каждом узле. Это не редкий подход в научных вычислениях.

1 голос
/ 26 февраля 2010

Вы можете использовать присущий вашему процессу параллелизм, организовав работу в потоки. Однако, действительно ли работа выполняется параллельно или нет, зависит от базового аппаратного обеспечения (один против нескольких процессоров, ядер или ядер).

Существуют также модели потоков, которые связываются с системной задачей или потоком, и другие были потоками, разделяющими основные задачи. На мультипроцессоре базовые задачи могут выполняться параллельно.

Если вы правильно абстрагируете код и он может использовать потоки, он будет нормально работать на одном или нескольких процессорах, используя несколько механизмов, когда / если доступно.

0 голосов
/ 26 февраля 2010

.NET 4.0 будет иметь некоторую поддержку параллельной сборки: http://code.msdn.microsoft.com/ParExtSamples

...