Все другие популярные ответы, представленные здесь, говорят о буквальных различиях между ПЛИС и процессорами. Они указывают на параллельную природу FPGA по сравнению с последовательной природой CPU или приводят примеры того, почему определенные алгоритмы могут хорошо работать на FPGA. Все это хорошо и верно, но я бы сказал, что между процессорами и FPGA есть более фундаментальная разница.
Какой общий знаменатель между ПЛИС и процессором? Это то, что они оба построены на основе кремния. А в некоторых случаях буквально одни и те же кремниевые процессы.
Принципиальное отличие - это абстракции, которые мы накладываем поверх этого кремния. Один человек не может понять всех деталей единой современной конструкции ЦП, от кремниевой до упакованной ИС. Поэтому, как часть процесса разработки, мы делим эту сложную проблему на более мелкие управляемые проблемы, которые люди могут обернуть вокруг себя.
Подумайте, что нужно, чтобы превратить этот кремний в работающий процессор. Вот несколько упрощенный вид слоев абстракции, необходимых для этой цели:
Сначала у нас есть инженеры, которые знают, как создавать транзисторы из кремния. Они знают, как проектировать крошечные транзисторы, которые потребляют мощность и переключаются с частотой 10 или даже 100 гигагерц, и они знают, как проектировать мощные транзисторы, которые могут управлять сигналами с достаточной мощностью, чтобы отправлять их из пакета IC и через плату. на другой чип.
Затем у нас есть разработчики цифровой логики, которые знают, как собрать эти транзисторы в библиотеки с сотнями различных логических ячеек. Логические ворота, шлепанцы, мультиплексоры и сумматоры и многие другие. Все в различных конфигурациях.
Затем у нас есть различные группы инженеров, которые знают, как соединить эти цифровые (а иногда и аналоговые) блоки в функциональные блоки более высокого уровня, такие как высокоскоростные приемопередатчики, контроллеры памяти, предсказатели ветвлений, ALU и т. Д.
Затем у нас есть разработчики ЦП для проектирования высокопроизводительных ЦП, объединяя эти функциональные блоки в единую систему.
И это не останавливается там. На данный момент у нас есть работающий процессор, который выполняет ассемблерный код, но это не тот язык, на котором большинство программистов пишут в наши дни.
- У нас может быть компилятор C, который компилирует в ассемблерный код (возможно, через некоторое промежуточное представление)
- Мы могли бы добавить еще одну абстракцию поверх C, чтобы получить объектно-ориентированный язык
- Мы могли бы даже написать Виртуальную машину поверх C или C ++, чтобы мы могли интерпретировать такие вещи, как байт-код Java
И оттуда могут продолжаться слои абстракции. Важным моментом здесь является то, что эти уровни абстракции объединяются, образуя основанную на процессоре систему, которая масштабируется и стоит незначительную долю от заказной кремниевой конструкции.
ОДНАКО, важно отметить, что каждая абстракция также несет свою стоимость. Конструктор транзисторов не создает идеальный транзистор для каждого случая использования. Он создает разумную библиотеку, и поэтому иногда используется транзистор, который потребляет немного больше энергии или немного больше кремния, чем на самом деле необходимо для работы. И точно так же разработчики логики не строят все возможные логические ячейки. Они могут построить вентиль NAND с 4 входами и вентиль NAND с 8 входами, но что произойдет, когда другому инженеру понадобится NAND с 6 входами? Он использует 8-входный вентиль NAND и связывает 2 неиспользуемых входа, что приводит к потере ресурсов кремния и мощности в талии. И так идет вверх по цепочке абстракций. Каждый слой дает нам способ справиться со сложностью,
Теперь сравните эти абстракции с тем, что необходимо для FPGA. По сути, абстракции FPGA останавливаются на # 2 в списке выше. FPGA позволяет разработчикам работать на уровне цифровой логики. Это несколько сложнее, чем это, потому что процессоры «жестко запрограммированы» на этом уровне, и FPGA должны быть сконфигурированы во время выполнения (что, кстати, именно поэтому процессоры обычно работают на более высоких частотах), но важная истина заключается в том, что это далеко немного абстракций для ПЛИС, чем для процессоров.
Итак, почему FPGA может быть быстрее, чем процессор? По сути, это потому, что FPGA использует гораздо меньше абстракций, чем процессор, что означает, что разработчик работает ближе к кремнию. Он не оплачивает стоимость всех многих уровней абстракции, которые требуются для процессоров. Он программирует на более низком уровне и должен работать усерднее, чтобы достичь определенного уровня функциональности, но за вознаграждение он получает более высокую производительность.
Но, конечно, есть и обратная сторона для меньшего количества абстракций. Все эти абстракции процессора есть для этого по уважительной причине. Они дают нам гораздо более простую парадигму кодирования, что означает, что больше людей могут легко разработать для них. Это, в свою очередь, означает, что существует гораздо больше конструкций ЦП, и, следовательно, мы получаем огромную выгоду ЦП / масштаб / время выхода на рынок.
Так что у вас есть это. FPGA имеют меньше абстракций, поэтому они могут быть более быстрыми и более энергоэффективными, но их трудно программировать. Процессоры имеют много абстракций, что делает их простыми в разработке, масштабируемыми и дешевыми. Но они отказываются от скорости и мощи в торговле ради этих выгод.