Видео в конце...
Программируемые логические интегральные схемы (ПЛИС) это один из альтернативных путей организовать вычисления в какой либо автоматизированной системе. Так делают, если производительность процессора явно недостаточна для вычислений в реальном масштабе времени. Да и просто если важна скорость получения результата, то применяются либо ПЛИС, либо специализированные интегральные схемы, сделанные специально под конкретную задачу. В отношении производительности эти два класса вычислителей очень похожи. Объединяет их философия максимально параллельного выполнения операций. Давайте разберемся что это значит.
Параллельные вычисления
Вашему вниманию предлагается некая программа на абстрактном языке программирования.
В прошлые выпуски по особенностям работы компиляторов мы выяснили, что вся вычислительная задача разбивается на большое число элементарных операций, которые процессор умеет выполнять. Например, в представленной программе есть условная конструкция, которая выборочно выполнит одну из двух веток программы. В случае если b[i] равно нулю выполнится первая ветка. В противном случае выполнится вторая.
Даже при простейшей проверке, в зависимости от модели процессора, выполнится несколько операций. Это доступ к элементу массива по индексу, операция сравнения, которая выставит флаг окончания операции, а потом еще переход по адресу в зависимости от состояния флага. И это только проверка равенства.
Внутри веток вычисления функций от аргумента, что в зависимости от сложности функции, заставит процессор много попотеть. Как было показано ранее, организация выполнения функции это очень захватывающее мероприятие.
В конце концов, к результату выполнения функции будет добавлено элемент массива d. Просто невероятное количество операций.
Теперь давайте рассмотрим схему, выполняющую все эти операции параллельно.
Это схема параллельного вычислителя, который решит эту задачу за одну операцию. Как это возможно? Да очень просто. Нет никакой необходимости раскладывать вычисления в долго работающий алгоритм. Несмотря ни на какие условные операции, все решается мгновенно.
Два блока вычисляют значения функций одновременно и каждая из функций выполняется со скоростью прохождения сигнала с входа на выход. Оба промежуточных результата поступают на мультиплексор, который выберет только одно. Выбор осуществляется самым нижним управляющим входом мультиплексора. А уровень сигнала на этом входе определяется блоком сравнения b[i] с нулем. За мультиплексором находится сумматор, который завершит решение задачи. Схема, в которой нет абсолютно ничего сложного выполняет программу за один такт.
Еще один факт, который вас немало позабавит, количество транзисторов в такой схеме в миллионы раз меньше, чем в современном процессоре. А теперь в полный рост встает вопрос — так ли эффективны процессоры? Число транзисторов в них превышает миллиард штук, потребление электричества как у лампочки и отсутствие возможности высокопроизводительных вычислений.
Производительность процессоров и ПЛИС
Мы переходим к следующей схеме. Она показывает производительность процессоров (CPU) и ПЛИС (FPGA).
Начиная с 2000х годов, программируемые логические интегральные схемы начали включать в себя достаточно логических элементов, чтобы превосходить вычислительную мощь процессоров. Стоит упомянуть, что на данном графике для процессоров представлены миллиарды операций над числами с плавающей точкой. Для ПЛИС это миллиарды операций над числами с фиксированной точкой. Поскольку процессоры имеют для таких вычислений аппаратные модули, то такое сравнение вполне корректное. В ПЛИС умножители также реализованы аппаратно. Обработка сигналов, как правило, ведется с числами с фиксированной точкой. Необходимо отметить, что вертикальная ось имеет логарифмический масштаб и между горизонтальными штрихами десятикратная разница производительности. С каждым годом эта разница только нарастает.
Устройство ПЛИС
Настало время разобраться с устройством ПЛИС. Основные пять функциональных частей ПЛИС это логические ячейки, матрица межсоединений, блочная память, умножители и блоки ввода вывода. Логические ячейки на схеме изображены красным цветом.
Они выполняют какую-то часть логических операций всего сложного проекта. Матрица межсоединений обозначена заливкой серым цветом всего кристалла ПЛИС. В соответствии со своим названием межсоединения обеспечивают связь всех частей программируемой логической интегральной схемы между собой.
Переходим к следующей части. Немного про блоки памяти. На схеме показаны зеленым цветом.
Это специально выращенные на кристалле структуры из транзисторов, выполняющие работу памяти со случайным доступом. Следующей частью ПЛИС являются умножители. На схеме показаны голубым цветом.
Их функцией является целочисленное умножение двух множителей. При большой разрядности двоичных чисел умножитель должен требовать довольно много логических ресурсов, поэтому, так же как и память со случайным доступом, умножители выращиваются на кристалле в виде отдельных ресурсов. Последним основным элементом ПЛИС являются блоки ввода вывода. На схеме они показаны желтым цветом.
Это такие согласующие устройства, обеспечивающие преобразование напряжений внешних устройств в напряжения сигналов, используемые внутри кристалла. Также верно то, что при выводе сигнала на внешние устройства эти блоки преобразуют внутренние напряжения к основным популярным уровням, используемым внешними устройствами.
Логическая ячейка
Рассмотрим устройство логической ячейки. Если отбросить в сторону принципиальные схемы и рассмотреть все под простым углом, то логическая ячейка это конструкция из одной или нескольких небольших блоков памяти со случайным доступом, задачей которых является быть таблицей истинности какой-то небольшой части схемы всего большого проекта.
В зеленом столбце содержатся выходы функции. Эти биты помещаются в память и при появлении на адресной шине памяти соответствующей комбинации бит, на выход поступает значение булевой функции. Значения бит на адресной шине это аргументы функции, содержимое ячейки памяти это значение функции.
Таким образом, эти небольшие блоки памяти могут быть какой угодно булевой функцией нескольких переменных. Такие блоки памяти называются LUT или Look Up Table. Буквально — посмотри в таблице. Большие логические схемы при помощи системы автоматизированного проектирования разбиваются на такие LUT.
В этих логических ячейках присутствуют такие блоки, из которых собираются сумматоры. Одной из особенностью сумматоров являются линии переноса результата в старшие разряды.
Подробнее об этом можно посмотреть в статье про сумматоры. Таким образом, кроме как быть любой булевой функцией, логическая ячейка приспособлена к сложению чисел. Но и это еще не все.
В каждой из логических ячеек имеется один или несколько триггеров, способных хранить один бит информации каждый. В зависимости от ситуации, эти триггеры могут формироваться в параллельные регистры или в регистры сдвига.
На этом рассмотрение логических ячеек закончено.
Матрица межсоединений
Чтобы логические ячейки и другие части ПЛИС объединялись в большие схемы, необходимо большое количество соединительных линий с возможностью переключения путей прохождения сигналов, в зависимости от логики всего проекта. Основу матрицы составляют коммутирующие узлы.
В этих узлах полевые транзисторы отвечают за направление прохождения сигнала. Соответственно, часть прошивки ПЛИС будет загружена не в логические ячейки, а в регистры, управляющие транзисторами — ключами в узлах матриц.
Блочная память
Память со случайным доступом является одной из основных частей ПЛИС. Как правило нет единой структуры, а вся блочная память разделена на небольшие массивы размером в десяток другой килобайт данных.
Это позволяет конфигурировать модули в общую конструкцию с произвольной разрядностью шины адреса и данных. Система автоматизированного проектирования автоматически подберет необходимое число модулей и выстроит их в нужном порядке. Такие небольшие блоки памяти, кроме того, являются двухпортовыми, что позволяет создавать кольцевые буферы и много чего еще, о чем мы поговорим в будущем.
Умножители
Немного затронем целочисленный умножитель и закончим обзор основных частей. Более менее подробно его конструкцию рассмотрим в будущих статьях. А сейчас довольно скупо и коротко.
Совместно с сумматорами, умножители являются главными действующими лицами вычислений, связанных с обработкой радиосигналов, обработкой изображений и видеопотоков.
Именно количество встроенных умножителей позволяет судить о потенциальной производительности ПЛИС. Чем больше ресурсов, а конкретнее умножителей, тем больше вариантов реализовать вычислительные схемы параллельными, а значит обладающими высокой производительностью.
На этом краткий обзор пора заканчивать. В следующей статье обсудим такое направление, как синтез высокого уровня, он же HLS.
Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.