Як FPGA може перевершити процесор?


55

Я чую, як люди використовують FPGA для поліпшення роботи систем, які роблять такі речі, як видобуток біткоїнів, електронна торгівля та складання білка.

Як FPGA може конкурувати з процесором за продуктивністю, коли процесор, як правило, працює принаймні на порядок швидше (з точки зору тактової частоти)?


13
FPGA робить все одночасно.
Ігнасіо Васкес-Абрамс

Відповіді:


48

Процесорні процесори - пристрої послідовної обробки. Вони розбивають алгоритм на послідовність операцій і виконують їх по черзі.

Пристрої паралельної обробки FPGA - це (або можуть бути налаштовані як). Весь алгоритм може бути виконаний за один галочку годинника, або, що найгірше, набагато менше тактових годин, ніж потрібен послідовний процесор. Однією з витрат на підвищену складність логіки є, як правило, нижня межа, при якій пристрій можна синхронізувати.

Зважаючи на вищезазначене, FPGA може перевершити виконання процесора певних завдань, оскільки вони можуть виконувати те саме завдання за меншої кількості тактових годин, хоча і з меншою загальною тактовою частотою. Досягнення, які можна досягти, сильно залежать від алгоритму, але, принаймні, на порядок не є типовим для чогось на кшталт FFT.

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

Ціна, яку ви платите за переваги, - це споживання електроенергії та $$$.


2
+1; Однак FPGA не настільки динамічні, як процесори, саме тому процесори зазвичай краще підходять для ПК
Нік Вільямс

17
"Ціна, яку ви платите за переваги, - це споживання електроенергії та $$$ '." - Це часто відповідає дійсності, але ви можете прямо перемогти багатофункціональну машину Intel Xeon на 1000 доларів з низьким кінцем $ 50 Xilinx Spartan-6 за багатьма алгоритмами. Але це, як правило, займає багато інженерного часу, і, можливо, ви можете створити дуже спеціальний дизайн, який працює лише для однієї програми та важко змінити. Тож компроміс - це не просто енергія та гроші, а час розробки алгоритму, повторне використання та гнучкість. (Хоча ви можете сперечатися час == гроші.)
wjl

markt, про ваше останнє речення, чи не FPGA мають меншу потужність, ніж процесори? Існує широкий спектр пристроїв як для процесорів, так і для FPGA, але якщо ми подивимось на ті, які використовуються для таких речей, як видобуток біт-монет, чи не це процесори, які використовуються для виконання цих завдань, значно більші за потужність, ніж FPGA. використовували?
Девід Гарднер

4
@David: Якщо говорити про видобуток Bitcoin, то відповідним показником є ​​кількість хешів на ват. Маркт говорить про загальне споживання електроенергії. Тобто, даний FPGA може споживати 3 рази потужність типового процесора, але бути набагато більше, ніж в 3 рази швидше при видобутку біткойна; так що для Bitcoin це виграш.
Біллі ONeal

2
@Billy: кількість хешів на ват · секунду, а не на ват.
Paŭlo Ebermann

34

У Маркта це в основному правильно, але я збираюся кинути свої 2 центи тут:

Уявіть, що я сказав вам, що я хочу написати програму, яка змінює порядок бітів всередині 32-бітного цілого числа. Щось на зразок цього:

int reverseBits(int input) {
    output = 0;
    for(int i = 0;i < 32;i++) {
        // Check if the lowest bit is set
        if(input & 1 != 0) {
            output = output | 1; // set the lowest bit to match in the output!
        }

        input = input >> 1;
        output = output << 1;
    }
    return output;
}

Зараз моя реалізація не є елегантною, але я впевнений, що ви згодні з тим, що для цього була б якась кількість операцій, і, мабуть, якась петля. Це означає, що в процесорі ви витратили набагато більше 1 циклу, щоб здійснити цю операцію.

У FPGA ви можете просто підключити це як пару засувок. Ви отримуєте свої дані в якомусь реєстрі, а потім проводите їх до іншого регістра в зворотному порядку біт. Це означає, що операція завершиться за один тактовий цикл в FPGA. Таким чином, за один цикл FPGS завершив операцію, яка зайняла ваш CPU загального призначення багато тисяч циклів! Окрім того, ви можете паралельно підключити декілька сотень цих регістрів. Отже, якщо ви зможете перейти в декілька сотень чисел до FPGA, за один цикл він завершить ці тисячі операцій в сотні разів за все за 1 тактовий цикл FPGA.

Є багато речей, які CPU загального призначення може зробити, але як обмеження ми створили узагальнені та прості інструкції, які обов'язково повинні розширюватися на списки простих інструкцій, щоб виконати деякі завдання. Тож я міг би зробити так, щоб процесор загального призначення мав інструкцію на кшталт "порядок зворотного біту для 32-бітного реєстру" і надати процесору таку ж можливість, як FPGA, яку ми тільки що створили, але існує нескінченна кількість таких можливих корисних інструкцій, і тому ми розміщуйте лише ті, які гарантують вартість у популярних процесорах.

FPGA, CPLD та ASIC надають вам доступ до необмеженого обладнання, що дозволяє визначати шалені операції, такі як "розшифрувати зашифровані байти AES256 за допомогою ключа" або "кадр декодування відео h.264". У них є затримки більш ніж одного тактового циклу в FPGA, але вони можуть бути реалізовані набагато ефективнішими способами, ніж виписування операції в мільйонах рядків коду складання загального призначення. Це також має перевагу зробити FPGA / ASIC постійного призначення для багатьох цих операцій більш енергоефективними, оскільки їм не потрібно робити стільки сторонніх робіт!

Паралелізм - це інша частина, на яку вказував markt, і хоча це також важливо, головне, коли FPGA паралелізує щось, що вже було дорого в CPU з точки зору циклів, необхідних для виконання операції. Як тільки ви почнете говорити: "Я можу виконати за 10 циклів FPGA завдання, яке займає мій процесор 100 000 циклів, і я можу виконувати це завдання паралельно 4 предметам одночасно", ви можете легко зрозуміти, чому FPGA може бути багато чортів швидше, ніж процесор!

То чому б ми не використовувати FPGA, CPLD та ASIC для всього? Тому що загалом це ціла фішка, яка не робить нічого, крім однієї операції. Це означає, що, хоча ви можете отримати процес запуску багатьох порядків швидше у вашому FPGA / ASIC, ви не зможете змінити його пізніше, коли ця операція вже не буде корисною. Причина, коли ви не можете (як правило) змінити FPGA, як тільки він є в ланцюзі, полягає в тому, що електропроводка для інтерфейсу фіксована, і зазвичай схема не включає компоненти, які дозволять перепрограмувати FPGA на більш корисну конфігурацію. Є деякі дослідники, які намагаються створити гібридні модулі FPGA-процесора, де є розділ процесора, який здатний перепрограмуватися / перепрограмуватися як FPGA, що дозволяє "завантажувати" ефективний розділ процесора,


2
Для прикладу обертання бітів (та всіх інших завдань по заміні / вибору бітів) він насправді не займає 1 тактовий цикл, він займає 0. У вашому прикладі для зберігання даних у засувці потрібен 1 тактовий цикл , який не є та ж операція. Незалежно від того, повертаєте ви біти чи ні, це займає 1 тактовий цикл. Операція реверсування бітів становить 0 тактових циклів; немає накладних витрат, просто різні маршрути. Різниця полягає не лише в семантиці, особливо коли ви починаєте додавати речі. Наприклад, скільки часу потрібно перенести 32-розрядне слово вниз на 3 біти, потім поміняти кожну іншу мітку, а потім повернути її назад?
wjl

1
"гібридний модуль FPGA-процесора" - вони існують на ринку вже давно (див. xilinx.com/products/silicon-devices/soc/zynq-7000/index.htm для сучасного успішного), але навіть без спеціальна підтримка, комбінування програмного забезпечення та HDL зазвичай здійснюється шляхом впровадження м'якого процесора всередині FPGA на тканині.
wjl

@wjl Ви праві, що технічно не потрібно циклів для самої операції. Я б стверджував, що ваш приклад відрізняється лише семантично, але, головним чином, тому, що виконання цих трьох операцій логічно перетворюється на фіксований бітовий візерунок (тобто я починаю з b1b2b3b4 і закінчую з b3b1b4b2). Це було моїм моментом у всій відповіді. Я намагався вказати, що описувати операцію як серію кроків часто потрібно лише тоді, коли у вас є фіксований набір інструкцій / ворота.
Kit Scuzz

@wjl: Тоді, як David-Gardner задав питання, він, схоже, каже, що "CPU" еквівалентний Intel або AMD x86 / x86_64 з високим тактовим частотою, конвеєрним процесом та оптимізованим процесором. Існує багато м'яких "процесорів", але я жоден із тих, хто призначений для сидіння у FPGA, не може бути таким, як i7, і вони майже не оптимізовані та не здатні. Щодо гібридів, я більше мав на увазі щось подібне: newsroom.intel.com/docs/DOC-1512, який, мабуть, існує
Kit Scuzz

1
Zynq насправді не надто поганий процесор (ARM Cortex-A9 - те саме, що працює з планшетними комп'ютерами тощо), але я погоджуюся, що було б набагато приємніше мати інтегровану FPGA з високою швидкістю x86_64. =)
wjl

25

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

Що спільного знаменника між FPGA та процесором? Це те, що вони обидва побудовані поверх кремнію. А в деяких випадках буквально однакові процеси кремнію.

Принципова відмінність полягає в абстракціях, які ми накопичуємо поверх цього кремнію. Одному людині неможливо зрозуміти повну деталь єдиної сучасної конструкції процесора від кремнію до упакованого ІС. Отже, в рамках інженерного процесу ми поділяємо цю складну проблему на менші керовані проблеми, якими люди можуть обернути голову.

Поміркуйте, що потрібно, щоб перетворити цей кремній на функціональний процесор. Ось дещо спрощений вигляд шарів абстракції, необхідних для цієї мети:

  1. Спочатку у нас є інженери, які знають, як створити транзистори з кремнію. Вони знають, як створити крихітні транзистори, які поглинають потужність і перемикаються зі швидкістю 10-ти або навіть 100-ти гігагерців, і вони знають, як створити приємні транзистори, здатні подавати сигнали з достатньою потужністю, щоб відправити їх з пакета ІС та через друковану плату до іншого чіпа.

  2. Тоді у нас є дизайнери цифрової логіки, які знають, як скласти ці транзистори до бібліотек із сотнями різних логічних комірок. Логічні ворота, фліп-флопи, мукси та допоміжні пристрої. Все в різноманітних конфігураціях.

  3. Далі ми маємо різні групи інженерів, які знають, як поєднати ці цифрові (а іноді і аналогові) блоки, щоб утворити функціональні блоки вищого рівня, як високошвидкісні приймачі, контролери пам'яті, гілки прогнозів, АЛУ тощо.

  4. Тоді у нас є дизайнери процесорних процесорів, які розробляють дизайни процесорів високого класу, об'єднуючи ці функціональні блоки в цілісну систему.

І це не зупиняється. На даний момент у нас працює робочий процесор, який запускає код складання, але це не мова, якою пишуть більшість програмістів в наші дні.

  1. У нас може бути компілятор C, який компілює до асемблерного коду (можливо, через деяке проміжне представлення)
  2. Ми можемо додати ще одну абстракцію поверх C, щоб отримати об'єктно-орієнтовану мову
  3. Ми можемо навіть написати віртуальну машину поверх C або C ++, щоб ми могли інтерпретувати такі речі, як байт-код Java

І шари абстракції можуть продовжуватися звідти. Важливим моментом тут є те, що ці шари абстракції поєднуються, щоб отримати систему на базі процесора, яка масштабується масштабно і коштує невелику частку спеціальної кремнієвої конструкції.

Зважаючи на це, важливим моментом, який слід зазначити, є те, що кожна абстракція також несе собі витрати. Конструктор транзисторів не створює ідеального транзистора для кожного випадку використання. Він створює розумну бібліотеку, і тому іноді використовується транзистор, який споживає трохи більше енергії або трохи більше кремнію, ніж дійсно потрібно для роботи. І так само логічні конструктори не будують кожну можливу логічну комірку. Вони можуть побудувати 4-вхідні NAND-ворота та 8-вхідні NAND-ворота, але що станеться, коли іншому інженеру потрібен 6-вхідний NAND? Він використовує 8 вхідних NAND-воріт і зв'язує 2 невикористаних входу, що призводить до втрати кремнію та ресурсів. І так воно йде по ланцюгу абстракцій. Кожен шар дає нам спосіб впоратися зі складністю,

Тепер порівняйте ці абстракції з тим, що потрібно для FPGA. По суті, абстракції FPGA зупиняються на №2 у списку вище. FPGA дозволяє розробникам працювати на рівні цифрової логіки. Це дещо складніше, ніж це, тому що процесори "жорстко закодовані" на цьому шарі і FPGA повинні бути налаштовані під час виконання (що, BTW, саме тому процесори, як правило, працюють на значно більшій частоті), але важливою правдою є те, що це далеко мало абстракцій для FPGA, ніж для процесорів.

Отже, чому FPGA може бути швидшим за процесор? По суті, це тому, що FPGA використовує набагато менше абстракцій, ніж процесор, а це означає, що дизайнер працює ближче до кремнію. Він не оплачує всі багато шарів абстракції, необхідні для процесорів. Він кодує на нижчому рівні і повинен докладати більше зусиль, щоб досягти заданого функціоналу, але нагородою він отримує більш високу продуктивність.

Але звичайно є й нижня сторона для меншої кількості абстракцій. Усі ці абстракції CPU є з поважних причин. Вони дають нам набагато простішу парадигму кодування, що означає, що більше людей може легко розвиватися для них. Це в свою чергу означає, що існує набагато більше конструкцій процесора, і тому ми маємо величезні переваги від ціни / масштабу / часу на ринок від процесорів.

Так ось у вас це є. FPGA мають менше абстракцій, і тому вони можуть бути швидшими та ефективнішими, але важко запрограмувати. Процесори мають безліч конструкцій абстракцій, щоб зробити їх легко розробити, масштабувати та дешево. Але вони відмовляються від швидкості та потужності в торгівлі за ці вигоди.


Крім того, FPGA розроблені з використанням простих повторюваних блоків, які повинні виконувати прості логічні завдання. Вони пристосовані для певних видів завдань. Процесори, OTOH, мають багато складних функціональних частин, які роблять різні речі. Можна було б вважати, що процесор - це група багатьох різних FPGA-подібних пристроїв (адже це все просто кремній, електроніка та математика). Тож мова йде не лише про абстракції, а про складність. Процесорні процесори - це складні пристрої, що складаються з багатьох різних типів електричних пристроїв, тоді як FPGA складається з декількох. ЦП - це рушниця, а FPGA - гвинтівка.
AbstractDissonance

21

Хоча інші відповіді вірні, жодна з них поки не розглядає приклад видобутку біткойна з вашого запитання, що справді є гідним прикладом. Майнінг біткойна включає неодноразовий обчислення криптографічної хеш-функції, SHA-256 результату іншого обчислення SHA-256, даних, де змінюється лише одне 32-бітове ціле число, поки отриманий хеш не має певних властивостей. Кожен SHA-256 складається з 64 повторень того ж алгоритму, що включає 32-бітні доповнення, бітзміни та деякі інші операції керування бітами.

Якщо ви програмуєте цей цикл на 32-розрядний (або більше) процесор, ви знайдете його набір інструкцій дуже добре підходить для завдання --- SHA-256 був розроблений для ефективної роботи на процесорах. Проте ви будете використовувати лише 2% кремнієвої області сучасного процесора з функціональними можливостями області, такими як кешування, множення, ділення, операція з плаваючою точкою, прогнозування розгалуження та брахування тощо, або взагалі не використовуються або не можуть забезпечити значне підвищення продуктивності для цього конкретного завдання.

У конфігуруваному обладнанні, наприклад FPGA, ви просто реалізуєте лише ці 2% та оптимізуєте подальше, забуваючи про виконання коду, а розробляючи ворота для прямого обчислення кожної з часто повторюваних функцій. Покладено так, що кожен з них передає результат в наступний кожен циліндр годинника, і повторюється 128 разів (і з певною додатковою логікою, коли кожен SHA-256 починається і закінчується), ви в кінцевому підсумку отримуєте результат кожен тактовий цикл (можливо, 100 мільйонів хешів в секунду на FPGA, що рекламується для підтримки 300 МГц за більш простою логікою, ніж ця), тоді як на сучасному процесорі можна очікувати одного результату кожні кілька тисяч тактових циклів на ядро, скажімо, 10 мільйонів хешів за секунду на багатоядерному мульти -ГГц ЦП.

Якщо цей конкретний приклад вас зацікавив, ви можете ознайомитись із моєю відповідною інформацією про внутрішню роботу шахтарів ASIC на bitcoin.stackexchange, оскільки багато шахтарів FPGA працюють аналогічно, використовуючи конфігуруване, а не обладнання на замовлення. Просто для повноти: Є й інші можливості, такі як обмеження або уникнення конвеєрного опромінення, яке я описав на користь більш тривіальної паралелізації за допомогою декількох незалежних хешей SHA-256. Залежно від обмежень внутрішніх ваших FPGA та загального розміру, це навіть може забезпечити кращі показники роботи, хоча це було б менш ефективно з точки зору кількості воріт і маршрутизації, якщо ви мали ідеальну свободу в розробці всього мікросхеми, а не тільки в конфігурації FPGA. .


3
Це дуже хороший момент щодо використання кремнію.
Маркт

Але, можливо, (ненавмисно!) Вводячи в оману, враховуючи, що FPGA складається з дещо складних комірок з багатьма фізичними воротами, з яких типова програма знову використовує лише дріб, що дозволяє їх виробникам рекламувати еквівалентні підрахунки воріт, намагаючись сказати, скільки всього з цього, можливо, варто в "типовому" застосуванні ...
піраміди

3

Наведені вище відповіді, хоча і правильні, не вникають у тему, чому FPGA (та спеціальні ASIC) особливо хороші для обчислення біткойна.

Реальна перевага полягає в тому, що велика частка розрахунків SHA-256 - це логічні операції (наприклад, бітові зсуви), які можна виконати при проводці. Після цього їм потрібно 0 тактових годин.

Ще одна важлива перевага полягає в тому, що FPGA набагато більш енергоефективні (тобто MIPS на Ватт), ніж процесори, тому кількість енергії, необхідної для розрахунків, значно менша. Це важливо, оскільки вартість видобутку біткойна залежить від того, скільки електроенергії ви використовуєте для його виготовлення.

Чіпи ASIC є більш енергоефективними, ніж FPGA, тому вони можуть виконувати той же код набагато дешевше. Ви також можете набити більше одиниць виконання на борту, щоб зробити їх швидшими. Недоліком є ​​те, що вартість виготовлення спеціального ASIC дуже висока, тому вам потрібно буде продати досить багато чіпів, щоб покрити виробничі витрати.

Графічні процесори, також використовуються для виготовлення біткойнів, але оскільки вони набагато менш енергоефективні, вони втрачають позицію для FPGA та користувацьких ASIC.


Якщо ви подивитесь на алгоритм хешування Monero, який називається cryptonight, ви побачите, що реалізація FPGA майже неможлива через великий обсяг пам'яті, необхідний для доступу довільно (2 МБ). ЦП має перевагу в цьому випадку.
lucas92
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.