Какие API параллельного программирования вы используете?
Попытка понять, как люди на самом деле пишут параллельный код в настоящее время, учитывая огромную важность многоядерного и многопроцессорного оборудования в наши дни. Для меня это выглядит как доминирующая парадигма pthreads (потоки POSIX), которая является родной для Linux и доступна в Windows. Люди HPC, как правило, используют OpenMP или MPI, но их почти нет на StackOverflow. Или вы полагаетесь на потоки Java, API-интерфейсы потоков Windows и т.д., А не на переносные стандарты? Каким образом, по вашему мнению, рекомендуется выполнять параллельное программирование?
Или вы используете более экзотические вещи, такие как Erlang, CUDA, RapidMind, CodePlay, Oz или даже дорогой старый Оккам?
Уточнение: я ищу решения, которые довольно переносимы и применимы к платформам, таким как Linux, различные unixes, на разных архитектурах хоста. Windows - редкий случай, который приятно поддерживать. Таким образом, С# и .net на самом деле слишком узкие, CLR - это классная технология, но они могут ПОДАВАТЬ ее для хоста Linux, чтобы она была такой же распространенной, как JVM, Python, Erlang или любой другой переносимый язык.
С++ или JVM-based: возможно, С++, поскольку JVM имеют тенденцию скрывать производительность.
MPI: Я бы согласился с тем, что даже люди HPC считают это сложным в использовании инструментом, но для работы на 128000 процессорах это единственное масштабируемое решение проблем, при которых карта/сокращение не применяется. Передача сообщений имеет большую элегантность, хотя, поскольку это единственный стиль программирования, который, по-видимому, очень хорошо масштабируется в локальной памяти /AMP, общей памяти /SMP, распределенных средах времени выполнения.
Интересным новым соперником является MCAPI. но я не думаю, что у кого-то было время для практического опыта.
В целом, похоже, ситуация в том, что есть много интересных проектов Microsoft, о которых я не знал, и что Windows API или pthreads являются наиболее распространенными реализациями на практике.
Ответы
Ответ 1
MPI не так сложно, как кажется. В настоящее время я считаю, что подход с несколькими парадигмами лучше всего подходит для параллельных и распределенных приложений. Используйте MPI для связи node и node и синхронизации, а также OpenMP или PThreads для более подробного распараллеливания. Подумайте, MPI для каждой машины, и OpenMP или PThreads для каждого ядра. Казалось бы, это немного лучше, чем создание нового MPI Proc для каждого ядра в ближайшем будущем.
Возможно, для двойного или четырехъядерного ядра прямо сейчас, для создания ядра для каждого ядра на машине не будет слишком много накладных расходов, но по мере того, как мы приближаемся к большему количеству ядер на машину, где кеш и память памяти не масштабируются как много, было бы более целесообразно использовать общую модель памяти.
Ответ 2
Я бы рекомендовал OpenMP. Microsoft поместила его в компилятор Visual С++ 2005, поэтому он хорошо поддерживается, и вам не нужно ничего делать, кроме компиляции с директивой /omp.
Прост в использовании, хотя, очевидно, он не делает все для вас, но тогда ничего не делает. Я использую его для параллельной работы для циклов вообще без каких-либо проблем, для более сложных вещей, которые я склонен сворачивать самостоятельно (например, у меня есть код от давних времен, который я вырезал, вставлял и изменял).
Вы можете попробовать Cilk ++, который выглядит хорошо, и имеет электронную книгу "Как выжить в многоядерной версии программного обеспечения" .
Оба эти типа системы пытаются распараллелить серийный код - т.е. взять цикл for и запустить его на всех ядрах одновременно как можно проще. Они, как правило, не являются библиотеками потоков общего назначения. (например, исследовательский документ (pdf) описал производительность различных типов пулов потоков, реализованных в openMP, и предложил добавить к ним две новые операции - урожай и сон. Я думаю, что они немного теряют смысл OpenMP)
Как вы упомянули OpenMP, я предполагаю, что вы говорите о родном С++, а не о С# или .NET.
Кроме того, если люди HPC (которые, как я полагаю, являются экспертами в этом виде домена), похоже, используют OpenMP или MPI, то это то, что вы должны использовать, а не то, что читатели SO!
Ответ 3
Мы начали смотреть на параллельные расширения от Microsoft - его еще нет в выпуске, но, безусловно, показывает потенциал.
Ответ 4
Я использовал ACE, чтобы позволить разработчикам использовать потоки стиля POSIX (или windows) на любой платформе.
Ответ 5
Parallel FX Library (PFX) - управляемая библиотека concurrency, разработанная в сотрудничестве с Microsoft Research и командой CLR в Microsoft для включения в будущую ревизию .NET Framework. Он состоит из двух частей: параллельной LINQ (PLINQ) и параллельной библиотеки задач (TPL). Он также состоит из набора структур координационных данных (CDS) - набора структур данных, используемых для синхронизации и координации выполнения параллельных задач. Библиотека была выпущена как CTP 29 ноября 2007 года и обновилась снова в декабре 2007 года и в июне 2008 года.
Не очень много опыта, хотя...
Ответ 6
Помните, что ответы здесь не будут статистически репрезентативным ответом на "фактическое использование". Я уже вижу несколько ответов "X - это хорошо".
Я лично использовал потоки Windows во многих проектах. Другим API, который я видел в широком использовании, является pthreads. На фронте HPC MPI по-прежнему воспринимается всерьез людьми, использующими его <subjective>
Я этого не делаю - он сочетает в себе все элегантность С++ с производительностью Javascript. Он выживает, потому что нет достойной альтернативы. Он потеряет подсоединенные аппараты NUMA с одной стороны, а с другой - уменьшит карту Google. </subjective>
Ответ 7
Подробнее Data Parallel Haskell было бы неплохо, но даже без него GHC > 6.6 обладает некоторой впечатляющей способностью легко распараллеливать алгоритмы через Control.Parallel . Стратегии.
Ответ 8
Для .Net я с большим успехом использовал RetLang. Для JVM Scale отлично.
Ответ 9
Как насчет Открыть CL?
Ответ 10
Очень многое зависит от вашей среды.
Для палина старого C ничто не сравнится с POSIX.
Для С++ существует очень хорошая библиотека потоков из BOOST.ORG бесплатно.
Java просто использует собственную поточную java-потоков.
Вы также можете посмотреть другие способы достижения parallelism, отличных от потоков, например, деление приложения на клиентские и серверные процессы и использование асинхронного обмена сообщениями для связи. Выполнено правильно, это может масштабироваться до тысяч пользователей на десятках серверов.
Также стоит подумать, что если вы используете среду Windows MFC, Gnome или Qt, вы автоматически включаете многопоточную среду. Если вы используете Apache ISS или J2EE, ваше приложение уже запущено в многопоточной многопроцессорной среде.
Ответ 11
Большинство параллельных программ, которые я написал, были в Ada, который полностью поддерживает parallelism изначально на языке. Одним из приятных преимуществ этого является то, что ваш параллельный код переносится в любую систему с помощью компилятора Ada. Никакой специальной библиотеки не требуется.
Ответ 12
+1 для PLINQ
Win32 Threads, Threadpool и Fibers, объекты синхронизации
Ответ 13
Я поддерживаю блог ссылок concurrency, который покрыл кучу этих данных со временем (и будет продолжать делать это):
http://concurrency.tumblr.com
Ответ 14
Я знаю только Java, многопоточная поддержка там работала хорошо для меня.
Ответ 15
Я использовал OpenMP alot в основном благодаря своей простоте, мобильности и гибкости. Он поддерживает многоязычные языки, даже всемогущий С++/Cli:)
Ответ 16
Я использую MPI и очень люблю его. Это заставляет вас думать об иерархии памяти, но, по моему опыту, думать о таких вещах важно для высокой производительности в любом случае. Во многих случаях MPI может в значительной степени скрываться за предметными объектами, связанными с доменом (например, PETSc для решения линейных и нелинейных уравнений).
Ответ 17
pycuda... ничего, как 25000 активных нитей:) [warp запланировано с табло]. cuda 2 поддерживает поток, поэтому я не уверен, что принесет поток. Расширения CUDA Matlab выглядят аккуратно, как и PLUTO и ближайшие PetaBricks из MIT.
поскольку другие, потоки python отсутствуют; MPI и т.д. Сложны, и у меня нет кластера, но я полагаю, что они достигают того, для чего они созданы; Я прекратил программирование на С# до того, как я добрался до нитей квартир (вероятно, хорошо).
Ответ 18
Он не является параллельным и не имеет распределенной модели, но вы можете написать очень параллельный код на JVM с помощью Clojure. Впоследствии вы получите доступное множество библиотек Java. Вам нужно будет реализовать собственный параллельный алгоритм поверх clojure, но это должно быть относительно легко. Я повторяю, что он еще не имеет распределенной модели.
Ответ 19
gthreads из библиотеки glibc http://library.gnome.org/devel/glib/stable/glib-Threads.html скомпилировать до pthreads, так что вы не потеряете какую-либо производительность. Они также дают вам очень мощные пулы потоков и очереди сообщений между потоками. Я использовал их успешно несколько раз и был очень доволен доступными функциями.
Ответ 20
Я использую open cl.I думаю, что его довольно просто использовать по сравнению с mpi.I также использовал mpi раньше как требование для моего параллельного и распределенного курса, но я думаю, что вам нужно делать слишком много ручного труда. собираюсь начать работу в CUDA через несколько дней. CUDA очень похожа на open cl, но проблемы - это CUDA только для продуктов nvidia.