Вопрос или проблема
Это из старого экзамена по моему курсу компьютерных технологий:
Правда или ложь? Аппаратное многопоточие приводит к конкурентности, а не к параллелизму.
Согласно ключу ответов, ответ “Правда”.
Однако я не понимаю почему. Курс определяет параллелизм следующим образом:
“Параллелизм заключается в
выполнении
множества задач
одновременно. Параллелизм
можно рассматривать с
точки зрения
аппаратного обеспечения.”
(Более детального объяснения не приводилось).
Может быть, я путаюсь в том, как работает аппаратное многопоточие, или как определяется параллелизм. Я думал, что аппаратное многопоточие реализуется с использованием процессоров с несколькими конвейерными линиями, в основном из-за этого слайда лекции:
Слайд лекции
Разве это не означает, что несколько инструкций из одного потока (и из разных потоков в многопоточности) могут выполняться одновременно, что приводит к выполнению различных задач одновременно?
Я думаю, нужно вернуться и прочитать заметки по курсу, а не вопросы экзамена, так как заметки дадут контекст и значение.
Обычно параллелизм относится к уровню инструкций, а конкурентность относится к параллельным процессам или потокам, а не инструкциям.
Это означает, что если у вас есть только слова “параллелизм” и “конкурентность”, то они теряют большую часть своего значения, поскольку определение этих слов в словаре имеет некоторую грубую схожесть в значении.
Современные ядра процессоров действительно обладают значительным уровнем параллелизма инструкций, поскольку они разработаны как суперскалярные движки внеочередного выполнения. У них есть множество исполнительных блоков в ядре и планировщик, который может определять зависимости данных и, таким образом, выполнять несколько инструкций одновременно, если эти инструкции не зависят от результатов друг друга. Например, если у вас есть одна инструкция, добавляющая значения A и B, и другая, добавляющая значения C и D, то эти инструкции могут выполняться параллельно.
Это не меняет того, что видит поток или процесс, который поставляет ядру процессора поток инструкций. К тому времени, как поток видит выполненные инструкции, они эффективно перестроены обратно в исходный порядок. С точки зрения потока вне ядра, поток инструкций остается таким же при входе и выходе. Весь параллелизм происходит “под капотом”.
Множественные потоки на процессоре, однако, не позволяют разбить один процесс на несколько параллельных потоков инструкций, без работы, проделанной программистом.
Что позволяет делать несколько потоков, так это выполнять два потока инструкций конкурентно, т.е. одновременно. Это не позволяет процессору произвольно разбивать один поток программы на два отдельных потока, это то, что делает параллелизм внутри ядра, поскольку он имеет гораздо больше непосредственной информации о текущем и предстоящем состоянии, чем поток.
Программист может разделить свою программу на отдельные потоки, что опять же позволяет лучше использовать конкурентность, но это требует от него знания того, какая работа может быть разделена на каждый параллельный поток, и принятия соответствующих действий.
.
Ответ или решение
Аппаратное многопотоковое выполнение позволяет обрабатывать задачи параллельно, однако важно отметить различие между терминами «параллелизм» и «конкурентность». Вопрос, вынесенный на изучение, сводится к следующему: почему аппаратное многопоточность приводит к конкурентности, а не к параллельности? Ответ заложен в понимании того, как работают эти концепции на уровне аппаратуры и программирования.
Параллелизм vs. Конкурентность
Параллелизм подразумевает выполнение нескольких задач одновременно в буквальном смысле, используя несколько ресурсов. В компьютерах это обычно означает, что несколько процессоров или ядер одновременно выполняют различные задачи, обеспечивая выполнение нескольких процессов параллельно. Такое распределение возможно за счёт использования аппаратных возможностей, например, нескольких независимых вычислительных блоков.
Конкурентность, напротив, больше касается логической структуры программ, когда несколько задач могут выполняться как будто одновременно, но на самом деле они могут переключаться между друг другом, что создает иллюзию одновременного выполнения. Конкурентность не требует наличия нескольких процессоров и зачастую зависит от наличия одного или нескольких потоков исполнения на уровне программного обеспечения.
Аппаратное Многопотоковое Выполнение
Аппаратное многопотоковое выполнение – это механизм, позволяющий процессору переключаться между различными потоками. Это означает, что в любой момент времени процессор может переключаться с одного потока на другой, уменьшая время простаивания из-за ожидания операций ввода-вывода или свободных вычислительных ресурсов. Тем не менее, это не то же самое, что параллелизм в чистом виде. Здесь больше подходит определение конкурентности, поскольку на одном ядре физически выполняется только один поток в любой момент времени, даже если переключение между потоками происходит очень быстро.
Многопоточность действительно позволяет программам работать эффективнее за счёт лучшего использования доступных ресурсов процессора, но сам поток исполняет инструкции последовательно, по одному за раз.
Реализация в Суперскалярных Архитектурах
Современные процессоры, оснащенные суперскалярными архитектурами, обладают возможностью исполнять несколько инструкций одновременно за счёт внутриядерного параллелизма. Однако этот уровень параллелизма не виден на уровне внешнего оператора программ. Инструкции внутри ядра могут исполняться параллельно, но вывод обрабатывается так, чтобы всё выглядело как последовательное исполнение.
Вывод
Таким образом, ключевое различие заключается в том, что аппаратное многопотоковое выполнение позволяет достичь конкурентности, но не параллелизма в том специфическом понимании, которое предполагает использование нескольких физических процессоров, исполняющих различные потоки или процессы одновременно. Параллелизм достигается посредством распределения работы между несколькими процессорными единицами, а конкурентность – за счёт того, что операционная система переключает исполнение между потоками, чтобы максимально задействовать процессорное время.
Этот нюанс, возможно, кажется тонким, но он имеет основополагающее значение и часто требует дополнительного уточнения и понимания в контексте компьютерных архитектур и программных моделей разработки.