В чем разница между многоядерным и параллельным программированием

Может ли кто-нибудь помочь мне? Я работаю над презентацией и хотел бы немного рассказать о «Разнице между многоядерным и параллельным программированием», я немного погуглил, но не нашел много хороших описаний, любая помощь приветствуется! :)

Спасибо,

Эймонн


person Eamonn McEvoy    schedule 21.03.2011    source источник
comment


Ответы (5)


Параллельный (происходящий или существующий одновременно) подразумевает, что другой код МОГУТ выполняться в одном и том же цикле. Это означает, что что-то возможно может происходить параллельно, если доступно несколько процессоров или процессор с несколькими ядрами и программа составлена ​​правильно. Простое добавление потоков не означает параллельное выполнение.

Причина, по которой я говорю МОЖЕТ и возможно, заключается в том, что каждый раз, когда отдельные потоки программы должны совместно использовать изменчивое/изменяемое состояние, другие потоки, которым требуется доступ к этому состоянию, не могут продолжать выполнение и будут должны ждать своей очереди, чтобы получить доступ к этому состоянию, и все снова начинает происходить последовательно.

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

Правильное параллельное программирование с изменяемым общим состоянием очень сложно выполнить.

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

Вы также можете заставить однопоточные программы выглядеть параллельно в многоядерной/многопроцессорной системе, если они могут работать с независимыми диапазонами входных данных в одно и то же время. Пример: однопоточная программа 3D-рендеринга может на двухъядерном компьютере запускать 2 отдельных экземпляра: первый рендерит все нечетные кадры, а второй — все четные. Пока они не пытаются совместно использовать какие-либо изменяемые ресурсы.

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

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

person Community    schedule 21.03.2011
comment
Параллельное программирование очень сложно сделать правильно с изменяемым общим состоянием. Примеры Силка — хороший контрпример. Параллельное программирование с общим изменяемым состоянием может быть сложным, но это часто необходимо в многоядерном параллельном программировании. - person J D; 07.01.2012

Параллельное программирование более широкое — оно просто относится к написанию программного обеспечения, которое будет работать «одновременно», то есть: одновременно будет происходить более одной вещи.

«Многоядерное» программирование на самом деле относится к определенному подмножеству параллельного программирования, в котором вы ориентируетесь на несколько доступных ядер ЦП на конкретной машине. Это наиболее распространенная форма параллельного программирования (как правило, один процесс выполняется на одном компьютере), но все же это только одна из форм параллельного программирования.

person Reed Copsey    schedule 21.03.2011

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

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

person Hans Passant    schedule 21.03.2011
comment
вы не можете выполнять параллельное программирование на одноядерном ЦП, вы можете выполнять асинхронное программирование, но одноядерный ЦП может выполнять только одно действие за раз, то, что вы описываете, является квантованием времени, которое по определению не одновременно. - person ; 16.01.2015
comment
Это чепуха. Ошибки параллелизма, которые вы получаете от одного ядра, совершенно одинаковы. Потоки планируются аппаратным прерыванием, которое не дает bean-компонентов о состоянии программы. Странно, ты выглядишь достаточно старым, чтобы отлаживать такую ​​ошибку. - person Hans Passant; 16.01.2015
comment
только одно может происходить одновременно на одноядерном процессоре, это продиктовано законами физики. выполнение нескольких действий одновременно в течение очень коротких периодов времени не происходит одновременно, поскольку они не происходят одновременно. определить параллельный — прилагательное существующие, происходящие или выполняемые одновременно. вы не можете придумывать новое определение параллельности. Кроме того, concurrent также не подразумевает совместное состояние, вы, похоже, многое смешиваете. - person ; 16.01.2015

На высоком уровне многоядерность — это атрибут процессорного чипа вашего компьютера. Многоядерность означает наличие нескольких вычислительных ядер. Существует несколько типов многопроцессорных компьютеров: суперкомпьютеры старого образца с тысячами компьютеров, соединенных через Ethernet, системы с большим количеством процессоров (например, 2 Pentium 4) и современные многоядерные системы, в которых каждый пакет процессоров имеет несколько вычислительных ядер, например Интел i7). Третий тип часто называют многоядерным Chip Multiprocessor (CMP).

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

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

Таким образом, резюмируя:

Параллельное программирование — это программное обеспечение, которое может использовать несколько процессоров, если они доступны. эти процессоры могут быть на одном чипе (многоядерный или многопроцессорный чип) или на разных чипах (часто называемых SMP). У вас могут быть системы, в которых вы можете разместить два многоядерных чипа в одной системе, сделав ее CMP и SMP одновременно. Параллельное программирование также будет работать для этого.

person Aater Suleman    schedule 10.05.2011

Параллельное программирование касается операций, которые кажутся перекрывающимися, и в первую очередь связано со сложностью, возникающей из-за недетерминированного потока управления. Количественные затраты, связанные с одновременными программами, обычно связаны как с пропускной способностью, так и с задержкой. Параллельные программы часто связаны с вводом-выводом, но не всегда, например. параллельные сборщики мусора полностью выполняются на процессоре. Педагогическим примером параллельной программы является поисковый робот. Эта программа инициирует запросы на веб-страницы и одновременно принимает ответы по мере того, как становятся доступными результаты загрузки, накапливая набор уже посещенных страниц. Поток управления не является детерминированным, поскольку ответы не обязательно принимаются в одном и том же порядке при каждом запуске программы. Эта характеристика может сильно затруднить отладку параллельных программ. Некоторые приложения принципиально параллельны, например. веб-серверы должны одновременно обрабатывать клиентские соединения. Erlang, F# асинхронные рабочие процессы и библиотека Scala Akka, пожалуй, наиболее многообещающие подходы. к высокопараллельному программированию.

Многоядерное программирование — это частный случай параллельного программирования. Параллельное программирование касается операций, которые перекрываются для конкретной цели повышения пропускной способности. Трудностей параллельного программирования можно избежать, сделав поток управления детерминированным. Как правило, программы порождают наборы дочерних задач, которые выполняются параллельно, а родительская задача продолжается только после завершения каждой подзадачи. Это значительно упрощает отладку параллельных программ по сравнению с параллельными программами. Трудной частью параллельного программирования является оптимизация производительности в отношении таких вопросов, как гранулярность и обмен данными. Последнее по-прежнему является проблемой в контексте многоядерных процессоров, поскольку передача данных из одного кэша в другой сопряжена со значительными затратами. Умножение плотной матрицы на матрицу является педагогическим примером параллельного программирования, и его можно эффективно решить, используя алгоритм Страсена «разделяй и властвуй» и параллельно решая подзадачи. Cilk — это, пожалуй, наиболее многообещающий подход к высокопроизводительному параллельному программированию на многоядерных процессорах, и он был принят как в Threading Building Blocks, так и в Библиотека параллельных задач (в .NET 4).

person J D    schedule 07.01.2012