Почему я должен знать параллельное программирование?

17

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

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

Адель
источник
3
Я думаю, что это отчасти topicky, но может стать немного topicky, если вы отредактируете все личные вещи (хотя параллельное программирование довольно сложно для всех ) и спросите о конкретных технических достоинствах концепций.
Яннис
1
Преимущества должны быть совершенно очевидны. Вы можете писать программы, которые могут воспользоваться всеми улучшениями производительности, доступными благодаря разделению работ, которое предлагает параллельное программирование. Это не легко для всех. Это очень сложная концепция сегодня.
Рог
3
Мы не можем помочь вам получить мотивацию для изучения чего-либо, но общий вопрос о том, почему нужно знать о параллелизме, достаточно актуален.
2
Я знаю параллельное программирование. Я могу сказать, что предоставленный вами слайд не помогает понять. Вместо этого идите на вечеринку с обедающими философами .
Mouviciel
1
Расслабьтесь, даже величайшим это трудно: informit.com/articles/article.aspx?p=1193856
SK-logic

Ответы:

32

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

Хотите написать для облака? Вычислительные экземпляры в облаке невелики. Вы не получаете большие, вы получаете много маленьких. Внезапно ваше маленькое веб-приложение становится параллельным. Если вы разработали это хорошо, вы можете просто добавить больше серверов, как вы получаете клиентов. Иначе вы должны узнать, как в то время как ваш экземпляр имеет среднюю нагрузку.

ОК, вы хотите писать настольные приложения? У всего есть двухъядерный процессор. За исключением наименее дорогих машин. И люди с самыми дешевыми машинами, вероятно, не собираются переходить на ваше дорогое программное обеспечение, не так ли?

Может быть, вы хотите заняться мобильной разработкой? Эй, iPhone 4S имеет двухъядерный процессор. Остальное не будет далеко позади.

Видео игры? Xbox 360 - это многопроцессорная система, а Sony PS3 - это многоядерная система.

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

Обновление 2016 года : текущая версия Raspberry Pi за 35 долларов построена вокруг четырехъядерной системы на чипе, предназначенном для мобильных телефонов. Драматические достижения в области искусственного интеллекта были достигнуты отчасти благодаря доступности высококачественных видеокарт в качестве параллельных вычислительных движков.

ObscureRobot
источник
1
Хотя я согласен в принципе, говорить об Everything has a dual-or-more-core-CPU. Except the least expensive machines.этом немного нелепо. Многие люди имеют одноядерные машины не потому, что это дешево, а потому, что они довольны тем, что у них есть, и не видят необходимости в обновлении. Тем не менее, думая , что с точки зрения параллелизма поможет планировщик на одноядерном системы , а также, так что не впустую усилий , в любом месте вы можете предположить , вытесняющей многозадачности, либо (что это о каждом многозадачной среде большинство разработчиков вступают в контакт с, эти дни).
CVn
1
хорошо - это немного преувеличение, но новое оборудование в большинстве случаев будет многоядерным. Я не вижу, чтобы это уходило. Поэтому, если вы сегодня студент и думаете о работе, которую вы будете выполнять профессионально в будущем, можно с уверенностью предположить, что вы будете работать над многоядерными системами.
ObscureRobot
Интересно, могу ли я не согласиться с вашим ответом так же, как вы не согласитесь с моим lol;)
1
То, как я это читаю, похоже на то, что мы оба говорим, @ acidzombie24. Я говорю, что разработчик должен знать, как работать с параллелизмом, потому что он будет везде. Вы говорите, что вам не нужно быть хорошим в параллельном программировании, если вы ... избегаете ловушек параллельных систем :)
ObscureRobot
Я согласен, что очень полезно знать о параллелизме, но не согласен, что от него можно уйти только ради «крошечных, простых проблем». Вы можете в значительной степени избавиться от параллелизма, даже в нетривиальных системах, например, если вы полагаетесь на существующие платформы и серверы приложений. Как только инфраструктура будет создана, я могу стать младшим разработчиком, пишущим новые сервисы для веб-приложения, и почти ничего не знаю о параллелизме или параллелизме.
Андрес Ф.
21

С 1970 по 2002 год производительность процессоров удваивалась примерно каждые 18 месяцев. Поэтому, как программисту, все, что вам нужно было сделать, это ждать, и ваша программа будет работать быстрее. Проблема в том, что примерно в 2002 году правила изменились. Теперь они не делают большие быстрые процессоры, они делают меньшие более медленные процессоры, а раздают их по группам. Компьютер, на котором я сейчас работаю, имеет 4 ядра, и существуют чипы с 8 ядрами (и 4 потоками на ядро). Достаточно скоро у нас появятся чипы с гораздо большим количеством ядер.

Так что, если вы напишите программу, которая не является одновременно параллельной, вы обнаружите, что вы используете 1 ядро ​​или поток, но остальная часть CPU сидит там и ничего не делает. Так что, если у вас 16 ядер, 1 будет запускать вашу программу, а остальные 15 будут сидеть там!

Проблема с параллелизмом заключается в том, что он недетерминирован. То есть вы не знаете точно, в каком порядке будут работать разные потоки. Традиционно программисты пытались решить эту проблему с помощью блокировок и тому подобного. Это привело к МНОГО боли. Наличие некоторой формы изменчивого состояния, к которому более чем один поток может получить свободный доступ, часто является формулой боли и неприятных ошибок!

В последнее время наблюдается тенденция к переходу на функциональные языки, которые жестко контролируют изменяемое состояние. Есть два основных способа, которыми функциональные языки обрабатывают параллелизм. Первый - с помощью передачи сообщений. Это лучше всего показывает Эрланг. В Erlang вообще нет общего состояния между процессами. Они общаются не разделяя память, а мои мимолетные сообщения. Это должно иметь смысл для вас, поскольку мы делаем это прямо сейчас. Я посылаю вам эту информацию, отправляя вам сообщение, а не вспоминая его из моего мозга! При переключении на передачу сообщений большинство блокирующих ошибок просто исчезают. Кроме того, сообщения могут передаваться как по сети, так и внутри одного узла.

Другим методом является STM, который обозначает программную транскрипционную память, которая присутствует в clojure и Haskell (и других). В STM память разделяется, но изменения могут быть сделаны только через транзакцию. Поскольку люди из базы данных выяснили все эти вещи в 1970-х годах, довольно легко убедиться, что мы правильно поняли.

На самом деле я немного упростила, Clojure и Haskell могут выполнять передачу сообщений, а Erlang может выполнять STM.

Отказ от ответственности Я являюсь автором веб-службы программирования с Erlang , которая будет выпущена в раннем выпуске в ближайшие несколько недель.

Захари К
источник
1
@ Zachary K: есть ли подходы, которые смешивают функциональные языки с родными языками так, чтобы части, требующие большого объема вычислений, были реализованы на родном языке, но они предоставляют интерфейсы, которые могут использоваться сервером, написанным на функциональном языке?
Rwong
Не уверен на 100%, но в JVM есть и Clojure, и Scala, так что я бы начал с этого. Может быть, взглянуть на рамки Akka. Я не использовал его, но некоторое время назад слушал разговор об Акке, и кажется, что это может быть довольно круто. На данный момент я делаю Erlang и Javascript, который занимает большую часть моего времени!
Захари К
1
@rwong: .NET позволяет программистам использовать C # или другие нефункциональные языки для некоторых частей своих приложений и F #, функциональный язык, для других.
Кевин
5

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

Фортран
источник
4
+10000000000000000000000000000000000000000
8
Параллелизм - это новая испанская инквизиция [/ python] [как в: никто не ожидает ...]
ObscureRobot
1
@ObscureRobot вдвойне смешно! (объяснение не требовалось :-p)
Фортран
4

Первое правило параллельного программирования - «Это сложно». Второе правило параллельного программирования - "Это. Сложно" .. !!

Если серьезно, то есть два общих подхода к параллельному программированию: многопоточность и многопроцессорность. Многопроцессорность легче всего понять, поскольку она просто означает наличие нескольких экземпляров процесса, выполняемого для выполнения задачи. Это довольно легко сделать в системах на основе Unix с помощью вызовов fork / join, но не так просто в системах Windows.

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

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

Недостатком является то, что вы должны начать думать о том, как вы будете разбивать свое приложение на маленькие части, которые можно запускать в разных потоках. Это намного сложнее, чем кажется. Кроме того, высококонкурентные решения могут быть неудобны для модульного тестирования, поскольку порядок выполнения менее детерминирован.

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

Шон
источник
1
Он получает порядки, если вы убегаете от замков как можно быстрее. Используйте СТМ или актеров, и все, что вы сказали, уходит. Конечно, это означает переход с Java на такие языки, как Scala, Erlang или Clojure. (хотя я бы сказал, что это тоже хорошо)
Захари К,
@ Захари: Это может быть хорошо, но если вы работаете в магазине .NET, например, это не практично. STM может быть вариантом в будущем, но сейчас это не вариант в основных языках.
Шон
Clojure работает на .net, и есть F #. Могу поспорить, что есть также реализации STM для C #.
Захари К
3

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

Работая с PHP, я делал все по-старому, и лучшее время, которое я получил после нескольких часов работы, привело к ~ 120 секундам для запуска определенного теста (много запросов + сетевая задержка + нет асинхронности)

Но этого было недостаточно, по сравнению с тем, что мне было нужно, и после неудачной неудачи с многопроцессорной обработкой PHP я переключился на Python.

Через несколько часов у меня был запущен многопроцессорный скрипт Python, который запускался через 20 секунд, и после небольшого перерыва с таймаутами и нет. из потоков, которые будут использоваться, я получил его до ~ 10 секунд .

Это было для веб-сайта, написанного на 100% на PHP, за исключением одного 100-строчного скрипта Python. И все это работает отлично.

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

Удачи и счастливого кодирования!

PS: я не пытаюсь разбить PHP, но PHP просто не был подходящим инструментом для работы.

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

Влад Преда
источник
2

Если вы занимаетесь веб-разработкой, в игру вступает параллелизм, по крайней мере, с большинством языков. Например, я использую Spring для веб-разработки, и каждый новый запрос поступает в виде своего собственного потока. Следовательно, если какой-либо запрос заканчивается доступом к общему объекту, где состояние переменной можно изменить, параллелизм является очень важным фактором, и его необходимо принимать во внимание. Если это не так, то данные могут быть отредактированы непредсказуемым образом, что может привести к повреждению данных. Не важно знать каждую мельчайшую деталь о параллелизме, но изучение элементов за раз важно для лучшего понимания программирования веб-приложений, если вы работаете над настольными приложениями, возможно, это не так важно, если вам не нужно запускать несколько потоков

programmx10
источник
-1

Изучите понимание операционных систем. Чтение исходного кода планировщиков и драйверов устройств поможет; они определенно совпадают.

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