Многоядерные и Concurrency - Языки, библиотеки и методы разработки
Архитектура архитектуры процессора изменилась, несколько ядер - это тенденция, которая изменит то, как мы должны разрабатывать программное обеспечение. Я сделал многопоточную разработку на C, С++ и Java, я сделал многопроцессорную разработку с использованием различных механизмов IPC. Традиционные подходы к использованию потоков, по-видимому, не позволяют разработчику использовать аппаратное обеспечение, поддерживающее высокую степень concurrency.
Какие языки, библиотеки и методы разработки вы знаете об этой помощи, чтобы облегчить традиционные проблемы создания параллельных приложений? Я, очевидно, думаю о таких проблемах, как тупики и условия гонки. Также интересны методы проектирования, библиотеки, инструменты и т.д., Которые помогают фактически использовать преимущества и обеспечить доступность доступных ресурсов. Простое создание надежного надежного многопоточного приложения не гарантирует, что он использует все доступные ядра.
То, что я видел до сих пор:
- Erlang: процесс основан, передача сообщений IPC," актер-модель concurrency
- Dramatis: библиотека моделей участников для Ruby и Python
- Scala: язык функционального программирования для JVM с добавленной поддержкой concurrency
- Clojure: язык функционального программирования для JVM с библиотекой участников.
- Termite: порт процесса процесса Erlang и сообщение, переходящее к Схеме
Что еще вы знаете о том, что сработало для вас и как вы думаете, интересно смотреть?
Ответы
Ответ 1
Я бы предложил два смещения парадигмы:
Программная транзакционная память
Вы можете взглянуть на концепцию Transactional Memory (STM). Идея заключается в использовании оптимистического concurrency: любая операция, выполняемая параллельно другим, пытается завершить работу в изолированной транзакции; если в какой-то момент была совершена другая транзакция, которая делает недействительными данные, на которых работает эта транзакция, транзакционная работа отбрасывается и транзакция выполняется снова.
Я думаю, что первая широко известная реализация идеи (если не доказательство концепции и первая) - такова в Haskell: Документы и презентации о транзакционной памяти в Haskell. Многие другие реализации перечислены в Статья в Википедии STM.
Циклы событий и promises
Другой очень другой способ работы с concurrency реализован на языке программирования [E] (http://en.wikipedia.org/wiki/E_(programming_language%29).
Обратите внимание, что его способ работы с concurrency, а также другими частями дизайна языка в значительной степени основан на модели Actor.
Ответ 2
Вы упомянули Java, но упоминаете только темы. Вы просматривали параллельную библиотеку Java? Он поставляется в комплекте с Java 5 и выше.
Это очень хорошая библиотека, содержащая ThreadPools, CopyOnWriteCollections, чтобы назвать очень мало. Ознакомьтесь с документацией в Java Tutorial. Или, если хотите, документы Java.
Ответ 3
Некоторые материалы на основе Scala:
Ответ 4
Я использовал обработку для 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
, и рабочие, похожие на потоки.
Gotchas
processing
основана на fork()
, который должен эмулироваться в Windows. Объекты переносятся с помощью pickle
/unpickle
, поэтому вы должны убедиться, что это работает. Форкировать процесс, который уже получил ресурсы, может не то, что вам нужно (например, соединения с базой данных), но в целом это работает. Он работает настолько хорошо, что был добавлен в Python 2.6 на ускоренном пути (см. PEP-317).
Ответ 5
Intel Threading Building Blocks для С++ выглядит очень интересно для меня. Он предлагает гораздо более высокий уровень абстракции, чем сырые потоки. У O'Reilly есть очень хорошая книга, если вам нравится документация мертвого дерева. См. Также Какие-либо опыты с модулями построения потоковых сетей?.
Ответ 6
Я бы сказал:
Модели: потоки + общее состояние, актеры + передача сообщений, транзакционная память, карта/сокращение?
Языки: Erlang, Io, Scala, Clojure, Reia
Библиотеки: Retlang, Jetlang, Kilim, Cilk ++, fork/join, MPI, Kamaelia, Terracottap >
Я поддерживаю блог ссылок concurrency о таких вещах (Erlang, Scala, Java threading, actor model и т.д.) и выставляю пару ссылок в день:
http://concurrency.tumblr.com
Ответ 7
Вопрос: Какую модель параллельного программирования вы рекомендуете сегодня, чтобы воспользоваться преимуществами многоядерных процессоров завтрашнего дня? уже был спрошен. Я тоже дал следующий ответ.
Kamaelia - это среда разработки Python для создания приложений с множеством взаимодействующих процессов.
Kamaelia - Параллелизм стал полезным, веселым
В Kamaelia вы строите системы из простых компонентов, которые взаимодействуют друг с другом. Это ускоряет разработку, значительно облегчает обслуживание, а также означает, что вы создаете естественно параллельное программное обеспечение. Он предназначен для доступа любому разработчику, включая новичков. Это также делает это забавным :)
Какие системы? Сетевые серверы, клиенты, настольные приложения, игры на основе Pygame, системы транскодирования и конвейеры, системы цифрового телевидения, средства искоренения спама, средства обучения и многое другое :)
Вот видео из Pycon 2009. Оно начинается со сравнения Kamaelia с Twisted и Parallel Python, а затем дает представление о демонстрации Kamaelia. Легкий параллелизм с Камаелией - Часть 1 (59:08)
Легкий параллелизм с Камаелией - Часть 2 (18:15)
Ответ 8
Я занимаюсь параллельным программированием в Аде уже почти 20 лет.
Сам язык (не привязанный к библиотеке) поддерживает потоки ( "задачи" ), несколько моделей планирования и несколько парадигм синхронизации. Вы даже можете создать свои собственные схемы синхронизации, используя встроенные примитивы.
Вы можете думать о Ada rendezvous как своего рода процедурно-ориентированное средство синхронизации, а защищенные объекты являются более объектно-ориентированными. Рандеву похожи на старую CS-концепцию мониторы, но гораздо более мощную. Защищенные объекты являются особыми типами с примитивами синхронизации, которые позволяют создавать вещи точно так же, как блокировки ОС, семафоры, события и т.д. Однако это достаточно мощно, что вы также можете изобретать и создавать свои собственные объекты синхронизации в зависимости от ваших точных потребностей.
Ответ 9
Я внимательно слежу за Parallel Extensions для .NET и Параллельный LINQ.
Ответ 10
Я знаю Reia - язык, основанный на Erlang, но больше похож на Python/Ruby.
Ответ 11
Этот вопрос тесно связан с, если не дубликатом Какую модель параллельного программирования вы рекомендуете сегодня, чтобы воспользоваться преимуществами многопроцессорных процессоров завтра?
Ответ 12
В Java есть библиотека действующих лиц, которую вы знаете. И знаете ли вы, что J ava - функциональный язык?;)
Ответ 13
OpenMP.
Он обрабатывает потоки для вас, поэтому вы только беспокоитесь о том, какие части вашего приложения на С++ вы хотите запускать параллельно.
например.
#pragma omp parallel for
for (int i=0; i < SIZE; i++)
{
// do something with an element
}
приведенный выше код запустит цикл for на столько потоков, сколько вы сказали во время работы OpenMP, поэтому, если SIZE равен 100, и у вас есть четырехъядерный ящик, для цикла будет выполняться 25 элементов на каждом ядро.
Есть несколько других параллельных расширений для разных языков, но те, которые мне больше всего интересны, - это те, которые запускаются на вашей видеокарте. Эта реальная параллельная обработка:) (примеры: GPU ++ и libSh)
Ответ 14
С++ 0x предоставит функции std::lock
для блокировки более одного мьютекса вместе. Это поможет устранить тупик из-за блокировки вне порядка. Кроме того, библиотека потоков С++ 0x будет иметь promises, фьючерсы и упакованные задачи, которые позволяют потоку ждать результата операции, выполняемой в другом потоке, без каких-либо блокировок на уровне пользователя.
Ответ 15
Я начал с .Net Parallel Extensions. Тем не менее, это CTP, и он меняется в каждой новой реальности. Теперь я использую С# с примерами ThreadPool, BackgroundWorker и Thread. Я переписываю несколько критических процессов в приложении среднего размера.
Я не знал, с чего начать. Тем не менее, я купил версию электронной книги книги "Программирование на языке С# 2008 и 2005", Gaston C. Hillar - Packt Publishing - http://www.packtpub.com/beginners-guide-for-C-sharp-2008-and-2005-threaded-programming/book, 7 дней назад. Я купил электронную книгу у издателей, но теперь книга доступна на Amazon.com.
Очень рекомендуется для программистов на С#.
Я загрузил код, и я начал выполнять упражнения. Книга - хороший путеводитель с большим количеством кода для практики. Я прочитал первые 6 глав. Он рассказывает истории, в то время как он объясняет самые сложные концепции. Это хорошо. Приятно читать. Я мог видеть, что Core 2 Quad Q6700 достигает 98% использования процессора в С#, используя 4 одновременных потока! Это легче, чем я думал. Я впечатлен результатами, которые вы можете достичь, используя много ядер одновременно. Я рекомендую книгу тем, кто заинтересован в начале многоядерного или многопоточного программирования с использованием С#.
Ответ 16
multiprocessing
- это библиотека python, которая упрощает многоядерное программирование, как указано в другом ответе.
Программа, написанная с помощью python multiprocessing
, может быть легко модифицирована для доставки работы в облаке, а не в локальные ядра. piCloud использует это для обеспечения большой мощности обработки по требованию в облаке: вам просто нужно изменить 2 строки вашего кода.
Итак, вот вынос: при выборе библиотеки для многоядерных, можно спросить, имеет ли смысл облачный подход.