Многоядерность и параллелизм — языки, библиотеки и методы разработки [закрыто]

StackOverflow https://stackoverflow.com/questions/121674

Вопрос

Архитектура процессоров изменилась, многоядерность — это тенденция, которая изменит то, как нам приходится разрабатывать программное обеспечение.Я занимался многопоточной разработкой на C, C++ и Java, я занимался многопроцессной разработкой с использованием различных механизмов IPC.Традиционные подходы к использованию потоков, похоже, не облегчают разработчику использование оборудования, поддерживающего высокую степень параллелизма.

Какие языки, библиотеки и методы разработки, которые вам известны, помогают облегчить традиционные проблемы создания параллельных приложений?Я, очевидно, имею в виду такие проблемы, как тупики и условия гонки.Методы проектирования, библиотеки, инструменты и т. д.также интересны, которые помогают действительно воспользоваться преимуществами и гарантировать использование доступных ресурсов - простое написание безопасного и надежного многопоточного приложения не гарантирует, что оно использует все доступные ядра.

То, что я видел до сих пор:

  • Эрланг:IPC на основе процессов, передача сообщений, актерская модель параллелизма
  • Драматис:библиотека моделей актеров для Ruby и Python
  • Скала:функциональный язык программирования для JVM с некоторой дополнительной поддержкой параллелизма
  • Кложур:функциональный язык программирования для JVM с библиотекой актеров
  • Термит:порт процессного подхода Erlang и передача сообщений в Scheme

О чем еще вы знаете, что вам помогло и что, по вашему мнению, интересно посмотреть?

Это было полезно?

Решение

Я бы предложил два изменения парадигмы:

Программная транзакционная память

Возможно, вы захотите взглянуть на концепцию Программная транзакционная память (СТМ).Идея состоит в том, чтобы использовать оптимистичный параллелизм:любая операция, которая выполняется параллельно с другими, пытается завершить свою работу в изолированной транзакции;если в какой-то момент была зафиксирована другая транзакция, которая делает недействительными данные, над которыми работает эта транзакция, работа транзакции отбрасывается и транзакция запускается снова.

Я думаю, что первая широко известная реализация этой идеи (если не доказательство концепции и первая) — это реализация на Haskell: Статьи и презентации о транзакционной памяти в Haskell.Многие другие реализации перечислены на Статья STM в Википедии.

Циклы событий и обещания

Другой совершенно другой способ работы с параллелизмом реализован в [языке программирования E](http://en.wikipedia.org/wiki/E_(programming_language%29).

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

Другие советы

Вы упомянули Java, но упомянули только потоки.Вы смотрели параллельную библиотеку Java?Он поставляется в комплекте с Java 5 и выше.

Это очень хорошая библиотека, содержащая ThreadPools, CopyOnWriteCollections и многие другие.Ознакомьтесь с документацией на сайте Учебник по Java.Или, если вы предпочитаете, документация по Java.

я использовал обработка для Питона.Он имитирует API резьба модуль и поэтому довольно прост в использовании.

Если вам довелось использовать map/imap или генератор/список, преобразующий ваш код для использования processing это просто:

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

можно распараллелить с

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

который будет использовать любое количество процессоров, необходимое для вычисления результатов.Есть и ленивые(Pool.imap) и асинхронные варианты (Pool.map_async).

Существует класс очереди, который реализует Queue.Queue, и рабочие процессы, похожие на потоки.

Ошибки

processing основан на fork(), который необходимо эмулировать в Windows.Объекты передаются через pickle/unpickle, поэтому вы должны убедиться, что это работает.Формирование процесса, который уже получил ресурсы, возможно, не то, что вам нужно (например, соединения с базой данных), но в целом это работает.Он работает настолько хорошо, что был быстро добавлен в Python 2.6 (см. ПЭП-317).

Intel Потоковые строительные блоки для C++ мне кажется очень интересным.Он предлагает гораздо более высокий уровень абстракции, чем необработанные потоки.У О'Рейли очень хорошая книга если вам нравится документация о мертвых деревьях.Смотрите также, Есть ли опыт использования строительных блоков Intel Threading?.

Я бы сказал:

Модели:потоки + общее состояние, актеры + передача сообщений, транзакционная память, отображение/сокращение?Языки:Erlang, IO, Scala, Clojure, REIA Libraries:Ретланг, Джетланг, Килим, Cilk++, разветвление/объединение, MPI, Камаэлия, Терракота

Я веду блог с параллельными ссылками на подобные вещи (Erlang, Scala, многопоточная обработка Java, модель актеров и т. д.) и размещаю пару ссылок в день:

http://concurrency.tumblr.com

Я занимаюсь параллельным программированием на Ada уже почти 20 лет.

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

Вы можете вспомнить Аду рандеву как своего рода процедурно-ориентированное средство синхронизации, в то время как охраняемые объекты более объектно-ориентированы.Рандеву похожи на старую концепцию CS мониторы, но гораздо более мощный.Защищенные объекты — это специальные типы с примитивами синхронизации, которые позволяют создавать такие вещи, как блокировки ОС, семафоры, события и т. д.Однако он достаточно мощный, чтобы вы также могли изобретать и создавать свои собственные типы объектов синхронизации, в зависимости от ваших конкретных потребностей.

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

Камаэлия это фреймворк Python для создания приложений с большим количеством взаимодействующих процессов.

Камаэлия: параллелизм стал полезным и увлекательным

В Kamaelia вы строите системы из простые компоненты, которые общаются друг с другом.Это ускоряет разработку, существенно облегчает обслуживание, а также означает, что вы создавать естественно параллельное программное обеспечение.Он предназначен для доступа любой разработчик, включая новичков.Это тоже доставляет удовольствие :)

Что за системы?Сетевые серверы, клиенты, настольные приложения, игры на основе pygame, системы и конвейеры перекодирования, системы цифрового телевидения, средства борьбы со спамом, инструменты обучения и многое другое :)

Вот видео с Pycon 2009.Он начинается со сравнения Kamaelia с Twisted и Parallel Python, а затем приводится практическая демонстрация Kamaelia.

Простой параллелизм с Kamaelia — часть 1 (59:08)
Простой параллелизм с Kamaelia — часть 2 (18:15)

я знаю Рейя — язык, основанный на Erlang, но больше похожий на Python/Ruby.

OpenMP.

Он обрабатывает потоки за вас, поэтому вы беспокоитесь только о том, какие части вашего приложения C++ вы хотите запускать параллельно.

например.

#pragma omp parallel for
for (int i=0; i < SIZE; i++) 
{
// do something with an element
}

приведенный выше код запустит цикл for в таком количестве потоков, которое вы указали среде выполнения openmp, поэтому, если SIZE равен 100 и у вас четырехъядерный процессор, цикл for будет запускать 25 элементов на каждом ядре.

Существует еще несколько параллельных расширений для разных языков, но меня больше всего интересуют те, которые работают на вашей видеокарте.Это настоящая параллельная обработка :) (примеры: графический процессор++ и libSh)

C++0x предоставит std::lock функции для блокировки более одного мьютекса вместе.Это поможет устранить взаимоблокировку из-за блокировки с нарушением порядка.Кроме того, библиотека потоков C++0x будет иметь промисы, фьючерсы и пакетные задачи, которые позволят потоку ожидать результата операции, выполненной в другом потоке, без каких-либо блокировок на уровне пользователя.

multiprocessing — это библиотека Python, которая упрощает многоядерное программирование, как упоминалось в другом ответе.

Программа написана на Python multiprocessing можно легко модифицировать для работы в облаке, а не на локальных ядрах. piCloud использует это преимущество для предоставления большой вычислительной мощности по требованию в облаке:вам просто нужно изменить 2 строки вашего кода.

Итак, вот вывод:при выборе библиотеки для многоядерности можно задаться вопросом, имеет ли смысл использовать облачный подход.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top