Что такое векторные команды процессора

Векторный процессор

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

Резюме

Игра-инструкция

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

Инструкции по расчету вектора

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

Рассматриваемые операции могут быть:

Некоторые аналогичные инструкции доступны на некоторых не векторных процессорах. Например, все современные процессоры x86 содержат расширения для своего набора команд, такие как MMX или SSE, которые предоставляют такие инструкции для вычисления векторов.

Инструкции по доступу к памяти

Любой векторный процессор имеет различные инструкции доступа к памяти, включая по крайней мере одну инструкцию для чтения векторов и другую для записи. В старых векторных процессорах векторы считываются или записываются непосредственно в память. Такой векторный процессор называется памятью-памятью. Это имя подчеркивает тот факт, что векторы считываются и записываются непосредственно в оперативную память компьютера, при этом промежуточное хранилище не отображается в наборе команд. Но этот режим работы создает некоторые проблемы с производительностью, учитывая медленность доступа к памяти и бесполезность кешей в этом типе архитектуры. Для решения этой проблемы были изобретены векторные процессоры типа Load-Store. У них есть векторные регистры, которые позволяют хранить векторы целиком. Программист может решить поместить определенные векторы в эти регистры: промежуточные результаты вычислений записываются и доступны из этих регистров, что быстрее, чем их запись и манипулирование ими в оперативной памяти. Чтобы использовать эти векторные регистры эффективно, процессор должен иметь возможность обмениваться векторами между памятью RAM и этими регистрами.

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

Непрерывный доступ к памяти

В режиме абсолютной адресации инструкции могут указывать адрес в памяти вектора, который в таком случае является только непрерывным пакетом данных в памяти. Например, если процессор обрабатывает 8-байтовые векторы, каждая инструкция доступа к памяти, использующая режим абсолютной адресации, будет читать или записывать 8-байтовые блоки. На начальный адрес этих блоков не накладываются никакие ограничения по выравниванию, чего нет в современных процессорах, использующих наборы команд, такие как SSE, MMX и т. Д. Причина этого в том, что обработка невыровненных обращений к памяти усложняет схемы чтения / записи памяти. С другой стороны, эти ограничения усложняют использование векторных инструкций. Например, компилятору будет труднее использовать инструкции вычисления векторов при наличии ограничений выравнивания.

Доступ к Stride и Scatter-Gather

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

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

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

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

Регистры векторного процессора

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

Как описано выше, на некоторых процессорах векторы сохраняются в векторных регистрах для повышения эффективности. Все эти регистры имеют фиксированный размер. Эти регистры имеют размер, который варьируется от 64 до 256 бит для наиболее распространенных размеров.

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

Векторизация

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

Размотка петли

Например, возьмем этот цикл, написанный на языке C:

Это можно сделать следующим образом:

Если компилятор реплицирует эти инструкции столько раз, сколько инструкция может обрабатывать элементы одновременно, векторизация цикла становится тривиальной. В нашем примере, если в процессоре когда-либо есть инструкция умножения, способная обрабатывать 4 элемента массива a или b одновременно, развернутый цикл можно очень просто векторизовать.

Открытая добыча

Например, если мы хотим перебрать массив фиксированного размера, содержащий 102 элемента, цикл должен быть описан следующим образом:

Подключения

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

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

Микроархитектура

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

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

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

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

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

Доступ к памяти

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

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

Блок вычисления вектора

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

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

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

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

Время запуска

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

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

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

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

Цепочка

В некоторых особых случаях этот конвейерный метод может быть дополнительно улучшен. Представим, что у нас есть три вектора: A, B и C. Для каждого элемента i этих векторов предположим, что мы хотим выполнить вычисление A i + (B i * C i ). Поскольку у процессора нет инструкции, позволяющей выполнять все эти вычисления одновременно, программист должен использовать две векторные инструкции: одну для сложения, а другую для умножения. Можно подумать, что сначала нужно произвести умножение пакетов B и C, сохранить результат во временном пакете и выполнить сложение этого массива с пакетом A.

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

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

Бренды и модели

Эти бренды производят или производили компьютеры на базе векторных процессоров или содержащие их:

Это не векторные процессоры, а SIMD :

Источник

Высокопроизводительные вычисления: проблемы и решения

Компьютеры, даже персональные, становятся все сложнее. Не так уж давно в гудящем на столе ящике все было просто — чем больше частота, тем больше производительность. Теперь же системы стали многоядерными, многопроцессорными, в них появились специализированные ускорители, компьютеры все чаще объединяются в кластеры.
Зачем? Как во всем этом многообразии разобраться?
Что значит SIMD, SMP, GPGPU и другие страшные слова, которые встречаются все чаще?
Каковы границы применимости существующих технологий повышения производительности?

Введение

Откуда такие сложности?
Формула производительности

Возьмем самую общую формулу производительности:

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

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

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

Первая часть полученного произведения — количество инструкций, выполняемых за один такт (IPC, Instruction Per Clock), вторая — количество тактов процессора в единицу времени, тактовая частота.
Таким образом, для увеличения производительности нужно или поднимать тактовую частоту или увеличивать количество инструкций, выполняемых за один такт.
Т.к. рост частоты остановился, придется увеличивать количество исполняемых «за раз» инструкций.

Включаем параллельность

Как же увеличить количество инструкций, исполняемых за один такт?
Очевидно, выполняя несколько инструкций за один раз, параллельно. Но как это сделать?
Все сильно зависит от выполняемой программы.
Если программа написана программистом как однопоточная, где все инструкции выполняются последовательно, друг за другом, то процессору (или компилятору) придется «думать за человека» и искать части программы, которые можно выполнить одновременно, распараллелить.

Параллелизм на уровне инструкций

Возьмем простенькую программу:
a = 1
b = 2
c = a + b

Первые две инструкции вполне можно выполнять параллельно, только третья от них зависит. А значит — всю программу можно выполнить за два шага, а не за три.
Процессор, который умеет сам определять независимые и непротиворечащие друг другу инструкции и параллельно их выполнять, называется суперскалярным.
Очень многие современные процессоры, включая и последние x86 — суперскалярные процессоры, но есть и другой путь: упростить процессор и возложить поиск параллельности на компилятор. Процессор при этом выполняет команды «пачками», которые заготовил для него компилятор программы, в каждой такой «пачке» — набор инструкций, которые не зависят друг от друга и могут исполняться параллельно. Такая архитектура называется VLIW (very long instruction word — «очень длинная машинная команда»), её дальнейшее развитие получило имя EPIC (explicitly parallel instruction computing) — микропроцессорная архитектура с явным параллелизмом команд)
Самые известные процессоры с такой архитектурой — Intel Itanium.
Есть и третий вариант увеличения количества инструкций, выполняемых за один такт, это технология Hyper Threading В этой технологии суперскалярный процессор самостоятельно распараллеливает не команды одного потока, а команды нескольких (в современных процессорах — двух) параллельно запущенных потоков.
Т.е. физически процессорное ядро одно, но простаивающие при выполнении одной задачи мощности процессора могут быть использованы для выполнения другой. Операционная система видит один процессор (или одно ядро процессора) с технологией Hyper Threading как два независимых процессора. Но на самом деле, конечно, Hyper Threading работает хуже, чем реальные два независимых процессора т.к. задачи на нем будут конкурировать за вычислительные мощности между собой.

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

Параллелизм на уровне данных

Векторные процессоры

Мы уже упоминали скалярность, но кроме скаляра есть и вектор, и кроме суперскалярных процессоров есть векторные.
Векторные процессоры выполняют какую-то операцию над целыми массивами данных, векторами. В «чистом» виде векторные процессоры применялись в суперкомьютерах для научных вычислений в 80-е годы.
По классификации Флинна, векторные процессоры относятся к SIMD — (single instruction, multiple data — одиночный поток команд, множественный поток данных).
В настоящее время в процессорах x86 реализовано множество векторных расширений — это MMX, 3DNow!, SSE, SSE2 и др.
Вот как, например, выглядит умножение четырех пар чисел одной командой с применением SSE:

float a[4] = < 300.0, 4.0, 4.0, 12.0 >;
float b[4] = < 1.5, 2.5, 3.5, 4.5 >;
__asm <
movups xmm0, a ; // поместить 4 переменные с плавающей точкой из a в регистр xmm0
movups xmm1, b ; // поместить 4 переменные с плавающей точкой из b в регистр xmm1
mulps xmm1, xmm0 ; // перемножить пакеты плавающих точек: xmm1=xmm1*xmm0
movups a, xmm1 ; // выгрузить результаты из регистра xmm1 по адресам a
>;

Таким образом, вместо четырех последовательных скалярных умножений мы сделали только одно — векторное.
Векторные процессоры могут значительно ускорить вычисления над большими объемами данных, но сфера их применимости ограничена, далеко не везде применимы типовые операции над фиксированными массивами.
Впрочем, гонка векторизации вычислений далеко не закончена — так в последних процессорах Intel появилось новое векторное расширение AVX (Advanced Vector Extension)
Но гораздо интереснее сейчас выглядят

Графические процессоры

Теоретическая вычислительная мощность процессоров в современных видеокартах растет гораздо быстрее, чем в обычных процессорах (посмотрим знаменитую картинку от NVIDIA)
Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора
Не так давно эта мощность была приспособлена для универсальных высокопроизводительных вычислений с помощью CUDA/OpenCL.
Архитектура графических процессоров (GPGPU, General Purpose computation on GPU – универсальные расчеты средствами видеокарты), близка к уже рассмотренной SIMD.
Она называется SIMT — (single instruction, multiple threads, одна инструкция — множество потоков). Так же как в SIMD операции производятся с массивами данных, но степеней свободы гораздо больше — для каждой ячейки обрабатываемых данных работает отдельная нить команд.
В результате
1) Параллельно могут выполняться сотни операций над сотнями ячеек данных.
2) В каждом потоке выполняется произвольная последовательность команд, она может обращаться к разным ячейкам.
3) Возможны ветвления. При этом, правда, параллельно могут выполняться только нити с одной и той же последовательностью операций.

GPGPU позволяют достичь на некоторых задачах впечатляющих результатов. но существуют и принципиальные ограничения, не позволяющие этой технологии стать универсальной палочкой-выручалочкой, а именно
1) Ускорить на GPU можно только хорошо параллелящийся по данным код.
2) GPU использует собственную память. Трансфер данных между памятью GPU и памятью компьютера довольно затратен.
3) Алгоритмы с большим количеством ветвлений работают на GPU неэффективно

Мультиархитектуры-

Итак, мы дошли до полностью параллельных архитектур — независимо параллельных и по командам, и по данным.
В классификации Флинна это MIMD (Multiple Instruction stream, Multiple Data stream — Множественный поток Команд, Множественный поток Данных).
Для использования всей мощности таких систем нужны многопоточные программы, их выполнение можно «разбросать» на несколько микропроцессоров и этим достичь увеличения производительности без роста частоты. Различные технологии многопоточности давно применялись в суперкомпьютерах, сейчас они «спустились с небес» к простым пользователям и многоядерный процессор уже скорее правило, чем исключение. Но многоядерность далеко не панацея.

Суров закон, но это закон

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

Ускорение кода зависит от числа процессоров и параллельности кода согласно формуле

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

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

Например, если выполнение последовательного кода занимает всего 25% от времени выполнения всей программы, то ускорить эту программу более чем в 4 раза не получится никак.
Давайте построим график зависимости ускорения нашей программы от количества параллельно работающих вычислителей-процессоров. Подставив в формулу 1/4 последовательного кода и 3/4 параллельного, получим
Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

Грустно? Еще как.
Самый быстрый в мире суперкомпьютер с тысячами процессоров и терабайтами памяти на нашей, вроде бы даже неплохо (75%!) параллелящейся задаче, меньше чем вдвое быстрее обычного настольного четырехядерника.
Причем всё еще хуже, чем в этом идеальном случае. В реальном мире затраты обеспечение параллельности никогда не равны нулю и потому при добавлении все новых и новых процессоров производительность, начиная с некоторого момента, начнет падать.
Но как же тогда используется мощь современных очень-очень многоядерных суперкомпьютеров?
Во многих алгоритмах время исполнения параллельного кода сильно зависит от количества обрабатываемых данных, а время исполнения последовательного кода — нет. Чем больше данных требуется обработать, тем больше выигрыш от параллельности их обработки. Потому «загоняя» на суперкомп большие объемы данных получаем хорошее ускорение.
Например перемножая матрицы 3*3 на суперкомпьютере мы вряд ли заметим разницу с обычным однопроцессорным вариантом, а вот умножение матриц, размером 1000*1000 уже будет вполне оправдано на многоядерной машине.
Есть такой простой пример: 9 женщин за 1 месяц не могут родить одного ребенка. Параллельность здесь не работает. Но вот та же 81 женщина за 9 месяцев могут родить (берем максимальную эффективность!) 81 ребенка, т.е.получим максимальную теоретическую производительность от увеличения параллельности, 9 ребенков в месяц или, в среднем, тот же один ребенок в месяц на 9 женщин.
Большим компьютерам — большие задачи!

Мультипроцессор

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

Системы с общей памятью

В таких системах множество процессоров (и процессорных кэшей) имеет доступ к одной и той же физической оперативной памяти. Такая модель часто называется симметричной мультипроцессорностью (SMP). Доступ к памяти при таком построении системы называется UMA (uniform memory access, равномерный доступ) т.к. любой процессор может обратиться к любой ячейке памяти и скорость этого обращения не зависит от адреса памяти. Однако каждый микропроцессор может использовать свой собственный кэш.
Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора
Несколько подсистем кэш-памяти процессоров, как правило, подключены к общей памяти через шину

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

Когерентность кэша

Допустим, у нас есть многопроцессорный компьютер. Каждый процессор имеет свой кэш, ну, как на рисунке вверху. Пусть некоторую ячейку памяти читали несколько процессоров — и она попала к ним в кэши. Ничего страшного, пока это ячейка неизменна — из быстрых кэшей она читается и как-то используется в вычислениях.
Если же в результате работы программы один из процессоров изменит эту ячейку памяти, чтоб не было рассогласования, чтоб все остальные процессоры «видели» это обновление придется изменять содержимое кэша всех процессоров и как-то тормозить их на время этого обновления.
Хорошо если число ядер/процессоров 2, как в настольном компьютере, а если 8 или 16? И если все они обмениваются данными через одну шину?
Потери в производительности могут быть очень значительные.

Многоядерные процессоры

Как бы снизить нагрузку на шину?
Прежде всего можно перестать её использовать для обеспечения когерентности. Что для этого проще всего сделать?
Да-да, использовать общий кэш. Так устроены большинство современных многоядерных процессоров.
Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора
Посмотрим на картинку, найдем два отличия от предыдущей.
Да, кэш теперь один на всех, соответственно, проблема когерентности не стоит. А еще круги превратились в прямоугольники, это символизирует тот факт, что все ядра и кэши находятся на одном кристалле. В реальной действительности картинка несколько сложнее, кэши бывают многоуровневыми, часть общие, часть нет, для связи между ними может использоваться специальная шина, но все настоящие многоядерные процессоры не используют внешнюю шину для обеспечения когерентности кэша, а значит — снижают нагрузку на нее.
Многоядерные процессоры — один из основных способов повышения производительности современных компьютеров.
Уже выпускаются 6 ядерные процессоры, в дальшейшем ядер будет еще больше… где пределы?
Прежде всего «ядерность» процессоров ограничивается тепловыделением, чем больше транзисторов одновременно работают в одном кристалле, тем больше этот кристалл греется, тем сложнее его охлаждать.
А второе большое ограничение — опять же пропускная способность внешней шины. Много ядер требуют много данных, чтоб их перемалывать, скорости шины перестает хватать, приходится отказываться от SMP в пользу

NUMA (Non-Uniform Memory Access — «неравномерный доступ к памяти» или Non-Uniform Memory Architecture — «Архитектура с неравномерной памятью») — архитектура, в которой, при общем адресном пространстве, скорость доступа к памяти зависит от ее расположения Обычно у процессора есть » своя» память, обращение к которой быстрее и «чужая», доступ к которой медленнее.
В современных системах это выглядит примерно так

Что такое векторные команды процессора. Смотреть фото Что такое векторные команды процессора. Смотреть картинку Что такое векторные команды процессора. Картинка про Что такое векторные команды процессора. Фото Что такое векторные команды процессора

Процессоры соединены с памятью и друг с другом с помощью быстрой шины, в случае AMD это Hyper Transport, в случае последних процессоров Intel это QuickPath Interconnect
Т.к. нет общей для всех шины то, при работе со «своей» памятью, она перестает быть узким местом системы.
NUMA архитектура позволяет создавать достаточно производительные многопроцессорные системы, а учитывая многоядерность современных процессоров получим уже очень серьезную вычислительную мощность «в одном корпусе», ограниченную в основном сложностью обеспечения кэш-когерентности этой путаницы процессоров и памяти.
Но если нам нужна еще большая мощность, придется объединять несколько мультипроцессоров в

Мультикомпьютер

Мультикомпьютер — вычислительная система без общей памяти, состоящая из большого числа взаимосвязанных компьютеров (узлов), у каждого из которых имеется собственная память. При работе над общей задаче узлы мультикомпьютера взаимодействуют через отправку друг другу сообщений.
Современные мультикомпьютеры, построенные из множества типовых деталей, называют вычислительными кластерами.
Большинство современных суперкомпьютеров построены по кластерной архитектуре, они объединяют множество вычислительных узлов с помощью быстрой сети (Gigabit Ethernet или InfiniBand) и позволяют достичь максимально возможной при современном развитии науки вычислительной мощности.
Проблемы, ограничивающие их мощность, тоже немаленькие
Это:
1) Программирование системы с параллельно работающими тысячами вычислительных процессоров
2) Гигантское энергопотребление
3) Сложность, приводящая к принципиальной ненадежности

Сводим все воедино

Ну вот, вкратце пробежались почти по всем технологиям и принципам построения мощных вычислительных систем.
Теперь есть возможность представить себе строение современного суперкомпьютера.
Это мультикомпьютер-кластер, каждый узел которого — NUMA или SMP система с несколькими процессорами, каждый из процессоров с несколькими ядрами, каждое ядро с возможностью суперскалярного внутреннего параллелизма и векторными расширениями. Вдобавок ко всему этому во многих суперкомпьютерах установлены GPGPU — ускорители.
У всех этих технологий есть плюсы и ограничения, есть тонкости в применении.
А теперь попробуйте эффективно загрузить-запрограммировать всё это великолепие!
Задача нетривиальная… но очень интересная.
Что-то будет дальше?

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *