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

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

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

Что я видел до сих пор:

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

Что еще вы знаете, что сработало для вас и что, по вашему мнению, интересно посмотреть?

Вы смешиваете параллелизм и параллелизм.

J D 26.06.2010 15:47

Я думаю, что говорить о том, что Clojure имеет «библиотеку участников», несколько неточно - на самом деле, весь язык эффективно спроектирован вокруг параллелизма и неизменности. Стоит посмотреть infoq.com/presentations/Value-Identity-State-Rich-Hickey, чтобы лучше понять философию.

mikera 08.03.2011 19:37

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

Timothy Baldridge 21.09.2011 19:00
HTML, CSS dan JS
HTML, CSS dan JS
HTML (HyperText Markup Language) - это язык разметки, используемый для создания и оформления веб-страниц. HTML описывает структуру и содержание...
Каковы некоторые из продвинутых концепций языков программирования?
Каковы некоторые из продвинутых концепций языков программирования?
В языках программирования существует множество продвинутых концепций, но некоторые из них являются наиболее важными:
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
35
3
5 980
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

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

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

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

Я использовал обработка для Python. Он имитирует 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 в ускоренном порядке (см. PEP-317).

Спасибо, это полезно - похоже, что идеями можно поделиться с Драматисом.

Kyle Burton 23.09.2008 19:37

Также неплохо было бы упомянуть его потомка - модуль multiprocessing 2.6.

Constantin 06.10.2008 02:10

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

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

Это хорошая ветка - я не видел ее, когда искал перед публикацией.

Kyle Burton 23.09.2008 19:43

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

Torsten Marek 23.09.2008 19:44

Я бы сказал:

Модели: потоки + общее состояние, субъекты + передача сообщений, транзакционная память, отображение / уменьшение? Языки: Erlang, Io, Scala, Clojure, Reia Библиотеки: Retlang, Jetlang, Kilim, Cilk ++, fork / join, MPI, Kamaelia, Terracotta

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

http://concurrency.tumblr.com

Стоит отметить, что Kamaelia там НЕ ХОРОШАЯ с точки зрения поддержки многоядерности. Это все еще очень экспериментально, если не сказать больше.

Jason Baker 25.09.2008 04:14
Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

Kamaelia - Concurrency made useful, fun

In Kamaelia you build systems from simple components that talk to each other. This speeds development, massively aids maintenance and also means you build naturally concurrent software. It's intended to be accessible by any developer, including novices. It also makes it fun :)

What sort of systems? Network servers, clients, desktop applications, pygame based games, transcode systems and pipelines, digital TV systems, spam eradicators, teaching tools, and a fair amount more :)

Here's a video from Pycon 2009. It starts by comparing Kamaelia to Twisted and Parallel Python and then gives a hands on demonstration of Kamaelia.

Легкий параллелизм с Камаэлией - Часть 1 (59:08)
Легкий параллелизм с Камаэлией - Часть 2 (18:15)

OpenMP.

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

например.

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

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

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

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

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

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

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

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

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

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

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