Архитектура ЦП изменилась, многоядерность - это тенденция, которая изменит то, как мы должны разрабатывать программное обеспечение. Я занимался многопоточной разработкой на C, C++ и Java, я занимался многопроцессорной разработкой с использованием различных механизмов IPC. Традиционные подходы к использованию потоков, похоже, не упрощают для разработчика использование оборудования, поддерживающего высокую степень параллелизма.
Какие языки, библиотеки и методы разработки, которые вам известны, помогают решить традиционные проблемы создания параллельных приложений? Я, очевидно, думаю о таких проблемах, как тупиковые ситуации и условия гонки. Также интересны методы проектирования, библиотеки, инструменты и т. д., Которые помогают реально использовать и гарантировать использование доступных ресурсов - простое написание безопасного, надежного многопоточного приложения не гарантирует, что оно использует все доступные ядра.
Что я видел до сих пор:
Что еще вы знаете, что сработало для вас и что, по вашему мнению, интересно посмотреть?
Я думаю, что говорить о том, что Clojure имеет «библиотеку участников», несколько неточно - на самом деле, весь язык эффективно спроектирован вокруг параллелизма и неизменности. Стоит посмотреть infoq.com/presentations/Value-Identity-State-Rich-Hickey, чтобы лучше понять философию.
+1 микера .... Clojure поддерживает агентов, а не актеров. С помощью акторов вы отправляете данные сущности, чтобы сообщить этой сущности, что нужно изменить некоторые другие данные. С помощью агентов вы отправляете функции сущности для изменения состояния этой сущности.



Вы упомянули Java, но упоминаете только потоки. Вы смотрели параллельную библиотеку Java? Он поставляется в комплекте с Java 5 и выше.
Это очень хорошая библиотека, содержащая ThreadPools, CopyOnWriteCollections и многие другие. Ознакомьтесь с документацией на Учебник по Java. Или, если хотите, документы Java.
Я знаю Reia - язык, основанный на Erlang, но больше похожий на Python / Ruby.
Я внимательно слежу за Параллельные расширения для .NET и Параллельный LINQ.
Я использовал обработка для 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).
Спасибо, это полезно - похоже, что идеями можно поделиться с Драматисом.
Также неплохо было бы упомянуть его потомка - модуль multiprocessing 2.6.
Мне очень интересен Intel Заправка строительных блоков для C++. Он предлагает гораздо более высокий уровень абстракции, чем необработанные потоки. У O'Reilly очень хорошая книга, если вам нравится документация по мертвому дереву. См. Также Есть ли опыт работы с блоками Intel Threading Building Blocks?.
Этот вопрос тесно связан, если не дублирует, Какую модель параллельного программирования вы рекомендуете сегодня, чтобы воспользоваться преимуществами многоядерных процессоров завтрашнего дня?
Это хорошая ветка - я не видел ее, когда искал перед публикацией.
Я думаю, что вопрос, о котором вы говорите, является более теоретическим, в то время как этот вопрос касается существующего решения, которое можно использовать сегодня, а не завтра. Просто мои 2 цента.
Я бы сказал:
Модели: потоки + общее состояние, субъекты + передача сообщений, транзакционная память, отображение / уменьшение? Языки: Erlang, Io, Scala, Clojure, Reia Библиотеки: Retlang, Jetlang, Kilim, Cilk ++, fork / join, MPI, Kamaelia, Terracotta
Я веду блог с ссылками на параллелизм о таких вещах (Erlang, Scala, потоки Java, модель акторов и т. д.) И размещаю пару ссылок в день:
Стоит отметить, что Kamaelia там НЕ ХОРОШАЯ с точки зрения поддержки многоядерности. Это все еще очень экспериментально, если не сказать больше.
Я бы предложил две смены парадигмы:
Вы можете взглянуть на концепцию Программная транзакционная память (STM). Идея состоит в том, чтобы использовать оптимистичный параллелизм: любая операция, которая выполняется параллельно с другими, пытается завершить свою работу в изолированной транзакции; если в какой-то момент была зафиксирована другая транзакция, которая делает недействительными данные, с которыми эта транзакция работает, работа транзакции отбрасывается, и транзакция запускается снова.
Я думаю, что первая широко известная реализация идеи (если не доказательство концепции и первая) - это реализация в Haskell: Статьи и презентации о транзакционной памяти в Haskell. Многие другие реализации перечислены на Статья Википедии о STM.
Другой совсем другой способ работы с параллелизмом реализован в [языке программирования E] (http://en.wikipedia.org/wiki/E_(programming_language%29).
Обратите внимание, что его способ работы с параллелизмом, как и другие части языкового дизайна, в значительной степени основан на модели акторов.
Вопрос Какую модель параллельного программирования вы рекомендуете сегодня, чтобы воспользоваться преимуществами многоядерных процессоров завтрашнего дня? уже задавался. Там я тоже дал такой ответ.
Камаэлия - это фреймворк python для создания приложений с большим количеством взаимодействующих процессов.
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.
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 :)
Легкий параллелизм с Камаэлией - Часть 1 (59:08)
Легкий параллелизм с Камаэлией - Часть 2 (18:15)
Как вы знаете, в Java есть библиотека актеров. А знаете ли вы, что Jава это функциональный язык?;)
Некоторые вещи на основе Scala:
Он обрабатывает потоки за вас, поэтому вы беспокоитесь только о том, какие части вашего приложения 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 строки вашего кода.
Итак, вывод: выбирая библиотеку для многоядерных процессоров, можно спросить, имеет ли смысл облачный подход.
Вы смешиваете параллелизм и параллелизм.