Всі інші популярні відповіді, представлені тут, говорять про буквальні відмінності між FPGA та процесорами. Вони вказують на паралельний характер FPGA та послідовний характер процесора, або наводять приклади, чому певні алгоритми можуть добре працювати на FPGA. Все це добре і правдиво, але я б припустив, що існує більш принципова різниця між процесорами та FPGA.
Що спільного знаменника між FPGA та процесором? Це те, що вони обидва побудовані поверх кремнію. А в деяких випадках буквально однакові процеси кремнію.
Принципова відмінність полягає в абстракціях, які ми накопичуємо поверх цього кремнію. Одному людині неможливо зрозуміти повну деталь єдиної сучасної конструкції процесора від кремнію до упакованого ІС. Отже, в рамках інженерного процесу ми поділяємо цю складну проблему на менші керовані проблеми, якими люди можуть обернути голову.
Поміркуйте, що потрібно, щоб перетворити цей кремній на функціональний процесор. Ось дещо спрощений вигляд шарів абстракції, необхідних для цієї мети:
Спочатку у нас є інженери, які знають, як створити транзистори з кремнію. Вони знають, як створити крихітні транзистори, які поглинають потужність і перемикаються зі швидкістю 10-ти або навіть 100-ти гігагерців, і вони знають, як створити приємні транзистори, здатні подавати сигнали з достатньою потужністю, щоб відправити їх з пакета ІС та через друковану плату до іншого чіпа.
Тоді у нас є дизайнери цифрової логіки, які знають, як скласти ці транзистори до бібліотек із сотнями різних логічних комірок. Логічні ворота, фліп-флопи, мукси та допоміжні пристрої. Все в різноманітних конфігураціях.
Далі ми маємо різні групи інженерів, які знають, як поєднати ці цифрові (а іноді і аналогові) блоки, щоб утворити функціональні блоки вищого рівня, як високошвидкісні приймачі, контролери пам'яті, гілки прогнозів, АЛУ тощо.
Тоді у нас є дизайнери процесорних процесорів, які розробляють дизайни процесорів високого класу, об'єднуючи ці функціональні блоки в цілісну систему.
І це не зупиняється. На даний момент у нас працює робочий процесор, який запускає код складання, але це не мова, якою пишуть більшість програмістів в наші дні.
- У нас може бути компілятор C, який компілює до асемблерного коду (можливо, через деяке проміжне представлення)
- Ми можемо додати ще одну абстракцію поверх C, щоб отримати об'єктно-орієнтовану мову
- Ми можемо навіть написати віртуальну машину поверх C або C ++, щоб ми могли інтерпретувати такі речі, як байт-код Java
І шари абстракції можуть продовжуватися звідти. Важливим моментом тут є те, що ці шари абстракції поєднуються, щоб отримати систему на базі процесора, яка масштабується масштабно і коштує невелику частку спеціальної кремнієвої конструкції.
Зважаючи на це, важливим моментом, який слід зазначити, є те, що кожна абстракція також несе собі витрати. Конструктор транзисторів не створює ідеального транзистора для кожного випадку використання. Він створює розумну бібліотеку, і тому іноді використовується транзистор, який споживає трохи більше енергії або трохи більше кремнію, ніж дійсно потрібно для роботи. І так само логічні конструктори не будують кожну можливу логічну комірку. Вони можуть побудувати 4-вхідні NAND-ворота та 8-вхідні NAND-ворота, але що станеться, коли іншому інженеру потрібен 6-вхідний NAND? Він використовує 8 вхідних NAND-воріт і зв'язує 2 невикористаних входу, що призводить до втрати кремнію та ресурсів. І так воно йде по ланцюгу абстракцій. Кожен шар дає нам спосіб впоратися зі складністю,
Тепер порівняйте ці абстракції з тим, що потрібно для FPGA. По суті, абстракції FPGA зупиняються на №2 у списку вище. FPGA дозволяє розробникам працювати на рівні цифрової логіки. Це дещо складніше, ніж це, тому що процесори "жорстко закодовані" на цьому шарі і FPGA повинні бути налаштовані під час виконання (що, BTW, саме тому процесори, як правило, працюють на значно більшій частоті), але важливою правдою є те, що це далеко мало абстракцій для FPGA, ніж для процесорів.
Отже, чому FPGA може бути швидшим за процесор? По суті, це тому, що FPGA використовує набагато менше абстракцій, ніж процесор, а це означає, що дизайнер працює ближче до кремнію. Він не оплачує всі багато шарів абстракції, необхідні для процесорів. Він кодує на нижчому рівні і повинен докладати більше зусиль, щоб досягти заданого функціоналу, але нагородою він отримує більш високу продуктивність.
Але звичайно є й нижня сторона для меншої кількості абстракцій. Усі ці абстракції CPU є з поважних причин. Вони дають нам набагато простішу парадигму кодування, що означає, що більше людей може легко розвиватися для них. Це в свою чергу означає, що існує набагато більше конструкцій процесора, і тому ми маємо величезні переваги від ціни / масштабу / часу на ринок від процесорів.
Так ось у вас це є. FPGA мають менше абстракцій, і тому вони можуть бути швидшими та ефективнішими, але важко запрограмувати. Процесори мають безліч конструкцій абстракцій, щоб зробити їх легко розробити, масштабувати та дешево. Але вони відмовляються від швидкості та потужності в торгівлі за ці вигоди.