Подтвердить что ты не робот

Многоядерные и Concurrency - Языки, библиотеки и методы разработки

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

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

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

  • Erlang: процесс основан, передача сообщений IPC," актер-модель concurrency
  • Dramatis: библиотека моделей участников для Ruby и Python
  • Scala: язык функционального программирования для JVM с добавленной поддержкой concurrency
  • Clojure: язык функционального программирования для JVM с библиотекой участников.
  • Termite: порт процесса процесса Erlang и сообщение, переходящее к Схеме

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

4b9b3361

Ответ 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, Terracotta​​p >

Я поддерживаю блог ссылок concurrency о таких вещах (Erlang, Scala, Java threading, actor model и т.д.) и выставляю пару ссылок в день:

http://concurrency.tumblr.com

Ответ 7

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

Kamaelia - это среда разработки Python для создания приложений с множеством взаимодействующих процессов.

KVtRN.png Kamaelia - Параллелизм стал полезным, веселым

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

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

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

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

Ответ 8

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

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

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

Ответ 10

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

Ответ 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 строки вашего кода.

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