Каковы все различные типы параллелизма?

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

Примечание:
это не вопрос о параллелизме, а выходит за рамки "простого" вопроса: "что такое параллелизм?", хотя может потребоваться уточняющее определение.

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

Чтобы внести ясность в мой вопрос, вот список найденных мною терминов, связанных с параллелизмом: параллельные вычисления, параллельная обработка, многопоточность, многопроцессорность, многоядерное программирование, гиперпоточность (Intel) 2, одновременная многопоточность (SMT) 3, Многопоточность с включением события 3. (Если возможно, также приветствуются определения или ссылки на определения для каждого из этих терминов).

Мой очень конкретный вопрос: в чем разница между параллелизмом на уровне потоков, параллелизмом на уровне инструкций и параллелизмом на уровне процессов? (и любой другой параллелизм x-уровня)?

В многоядерном процессоре может ли происходить параллелизм внутри одного ядра? Это и есть Hyper-threading, и требуется ли для этого одно ядро, имеющее, например, два ALU, которые можно использовать параллельно?

И последнее: есть ли разница между аппаратным и программным параллелизмом, помимо очевидного различия, что одно происходит в аппаратном обеспечении, а другое - в программном?

Связанные ресурсы:
 — Process vs Thread,
- Параллелизм на графическом процессоре,
 – Гиперпоточность,
 – Параллелизм и параллелизм,
Hyper-threading и игры.


person JWAspin    schedule 19.12.2017    source источник
comment
В общих чертах все они означают одно и то же, но разные авторы имеют разные значения для разных терминов, а разные авторы имеют разные значения для одних и тех же терминов. Все это означает, что вам нужно обратить внимание на контекст.   -  person Chris Dodd    schedule 19.12.2017
comment
Вы пропустили SIMD.   -  person Mark Setchell    schedule 19.12.2017


Ответы (2)


Вопрос:
В чем разница между
параллелизмом на уровне потоков,
параллелизмом на уровне инструкций
и параллелизмом на уровне процессов?

Несмотря на то, что тема действительно очень широка, я бы попытался придерживаться этой точки зрения, даже рискуя заставить многих оппонентов представить свои возражения по поводу упрощения темы (но формат StackOverflow не заменяет другие источники полных ссылок, не так ли?) :


A:
главное различие заключается в том, ЧТО/КТО/КАК
отвечает за то, чтобы все выполнялось в true-[PARALLEL]

  • Параллелизм на уровне инструкций — ILP — самый простой случай, архитектура ЦП спроектировала и «запрограммировала» эту конкретную форму аппаратного параллелизма. Имея процессоры с ILP4 (одновременное выполнение 4 инструкций) или процессоры с шириной, основанной на каждой инструкции, для этой формы параллельного выполнения инструкций, будь то ILP2 для одних инструкций и ILP1 для некоторых других, снова кремниевая архитектура решает, что может происходят действительно параллельно на уровне инструкций. Некоторые неловкие сюрпризы могут возникнуть из-за дополнительных деталей, поскольку каналы контроллера памяти могут блокировать режим ILP в случаях, когда операции REG/MEMORY должны будут ждать свободного канала для доступа к указанной ПАМЯТИ.

  • аппаратные потоки — это следующий уровень детализации. Учитывая, что процессорное ядро ​​объявлено для поддержки двух аппаратных потоков, это единственные потоки выполнения кода, которые могут выполняться параллельно (если не поступает запрос O/S для создания экземпляра и планирования другого потока для выполнения, сопоставленного с одним потоком). доступных аппаратных потоков процессорного ядра). С точки зрения пользователя, существуют инструменты операционной системы, которые позволяют явно «привязать» привязку PID уровня процесса / PID уровня потока к конкретному процессорному ядру (ядрам) и, таким образом, ограничить или даже устранить любые «помехи», чтобы перейти от потока "just"-[CONCURRENT] выполнения кода ближе к true-[PARALLEL].

Мы намеренно пропустим все скопления потоков, которые являются всего лишь инструментом для маскировки задержки (будь то на SIMT/SMX warp-wide GPU-планировщике, или более спокойной многопоточности, управляемой ядром MIMT O/S).


 – MIMT: Несколько потоков инструкций, неограниченная структура/политика выполнения потоков, где любой поток может и действительно выдает процессору другую инструкцию для выполнения, в отличие от SIMT< br> - SIMT: одна инструкция, несколько потоков, обычно многопроцессорная архитектура выполнения кода с потоковой передачей на графическом процессоре
- SMX: модуль выполнения потокового многопроцессорного выполнения, обычно структурный блок SIMT на графическом процессоре. , на которые могут быть направлены (адресованы) кодовые единицы ядра графического процессора для планирования с помощью TaskQueeue и последующего выполнения в соответствии с координируемым планировщиком SIMT-кода в рамках WARP

person user3666197    schedule 19.12.2017
comment
Ваш ответ был бы более полезным, если бы вы объясняли аббревиатуры либо при их вводе, либо в конце... SIMT? SMX? MIMT? ILP4? - person Mark Setchell; 19.12.2017
comment
Правильно, извините, слишком долго в предметной области, чтобы ожидать как терминологии, так и ясности. - person user3666197; 19.12.2017

в чем разница между параллелизмом на уровне потоков, параллелизмом на уровне инструкций и параллелизмом на уровне процессов?

В 1 разные ядра ЦП выполняют разные потоки инструкций.

В 2 одно ядро ​​​​ЦП выполняет разные инструкции из одного потока инструкций параллельно (эти инструкции либо являются последовательными инструкциями в потоке, либо иным образом очень близки друг к другу).

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

и любой другой параллелизм x-уровня

Другим важным является параллелизм на уровне SIMD. Для этого ЦП применяет одну и ту же инструкцию к нескольким операндам, хранящимся в специальных широких регистрах. С SSE у нас есть регистры шириной 128 бит, и мы можем, например. умножьте вектор из 4 чисел с плавающей запятой одинарной точности в одном регистре на 4 других значения в другом регистре, получив 4 произведения параллельно, с помощью одной инструкции mulps. ARM NEON аналогичен, также 128-битные регистры, инструкция умножения 4 чисел с плавающей запятой на 4 числа с плавающей запятой — vmul.f32. AVX работает с 256-битными регистрами, поэтому он может одновременно умножать 8 чисел с плавающей запятой с помощью одной инструкции vmulps.

может ли параллелизм происходить в пределах одного ядра?

да.

Это и есть Hyper-Threading?

Да, это и есть параллелизм на уровне инструкций, а также SIMD-параллелизм.

требуется ли для этого одно ядро, имеющее, например, два ALU, которые можно использовать параллельно?

Современные ЦП имеют более двух на ядро, но HT был представлен в P4, и это не является обязательным требованием. Преимущество HT заключается не только в загрузке нескольких ALU, но и в использовании ядра, пока поток ожидает поступления данных из кэшей или из системной оперативной памяти. А также использование ядра, пока оно зависает из-за зависимости данных между соседними инструкциями. HT позволяет ядру ЦП выполнять какие-то другие вычисления в другом аппаратном потоке во время ожидания, тем самым улучшая использование ALU. Без HT ядро, скорее всего, просто сидело бы и ждало сотни циклов в случае задержки оперативной памяти или десятки циклов в случае задержки зависимости данных.

есть ли разница между аппаратным и программным параллелизмом

Когда у вас есть один аппаратный поток и несколько потоков ОС, которые выполняют вычисления, в любой момент времени будет работать только один поток. Остальные темы будут ждать. ОС будет периодически (часто ~ 50-100 Гц) переключаться на то, какой из них запущен, с целью предоставить всем потокам справедливую долю процессорного времени. Вы можете назвать это программным параллелизмом, если хотите, но я бы вообще не назвал это параллельным.

person Soonts    schedule 19.12.2017
comment
Вы также можете помочь прояснить влияние HT на маскировку задержки в отношении суперскалярных ЦП-архитектур с нарушением порядка по сравнению с его отсутствием в архитектурах с порядком. Утверждение только 1 поток будет выполняться параллельно кажется странным - параллельно с чем? - ИМХО соло не ни в каком смысле не параллельно ничему другому, оно остается принципиально просто соло. - person user3666197; 19.12.2017
comment
При всем уважении, пересмотр не был улучшением - одновременная работа (с чем?) по-прежнему сбивает с толку. - person user3666197; 19.12.2017
comment
@ user3666197 хорошо, надеюсь, это лучше - person Soonts; 19.12.2017
comment
Что ж, оставьте так, как вы это чувствуете - все же только 1 поток будет работать в любой момент времени остается наиболее точной формулировкой, соответствующей реальности выполнения на уровне кремния. - person user3666197; 19.12.2017
comment
Так будет ли правильно сказать, что программный параллелизм — это на самом деле просто концепция многопоточности, тогда как аппаратный параллелизм — это либо уровень потоков (многоядерность), либо уровень инструкций (гиперпоточность или SIMD)? - person JWAspin; 20.12.2017
comment
@JWAspin Я бы сказал, что гиперпоточность также находится на уровне потоков. Для HT одно ядро ​​​​ЦП выполняет два независимых потока инструкций с независимыми блоками выборки и декодирования инструкций и независимыми наборами регистров. Вот почему для ОС ядро ​​HT выглядит как 2 ядра. Кроме того, SIMD не является параллелизмом на уровне инструкций, инструкции не идут параллельно. Вместо этого инструкция SIMD применяет одну и ту же операцию к нескольким значениям. Иногда эти множественные значения в широком регистре называются «дорожками SIMD». Я обновил свой ответ, добавив более подробную информацию о SIMD. - person Soonts; 20.12.2017