Сумбурні роздуми про майбутнє технології FPGA

Працюючи над черговим ігровим (навчальним) проектом ПЛІС для плати Марсоход2 я зіткнувся з тим, що мені явно не вистачає місця в кристалі. Здається і проект не дуже складний, але моя реалізація така, що вимагає багато логіки. В принципі, це дурниця, справа-то житейська. Ну, якщо дуже буде потрібно, то можна вибрати ПЛІС з більшою ємністю. Власне мій проект - це гра «Життя», але реалізована в ПЛІС мовою Verilog HDL.


Про логіку гри, розповідати не буду, про неї і так написано вже достатньо.

Ідея проекту ось така: кожна клітина в ігровому полі являє собою самостійний обчислювач. У кожному обчислювачі є своя логічна функція і свій регістр, який зберігає поточний стан клітини (жива/не жива). Весь простір для життя клітин - це почесний масив обчислювачів, обчислювачі утворюють цілу мережу. Всі обчислювачі працюють синхронно, оскільки на всі регістри подається єдина тактова частота. Малюнок вгорі повинен прояснити схему проекту.

Так от. На моїй платі стоїть ПЛІС Cyclone III EP3C10E144C8 компанії Альтера. 10тис логічних елементів. Спершу я думав, що зможу зробити почесний масив клітин 128x64 = 8192 клітини. Не поміщається. 64x64 = 4096 - те саме не поміщається у кристал. Як же так. Я зумів вмістити в ПЛІС тільки 32x16 = 512 клітин. Пічалько...

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

Однак..

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

Ми знаємо, наприклад, що компанія Альтера пропонує і просуває технологію OpenCL

Просто кажучи - це така C-подібна мова для опису паралельних обчислень в FPGA акселераторі. До речі, Nvidia і її відеокарти так само підтримують паралельні обчислення c OpenCL.

Таким чином, видно, що Альтера явно замислюються про те, як донести «звичайні» C-подібні паралельні обчислення FPGA в народ. Подивимося, що там з цінами на плати для паралельних обчислень з FPGA? Плата Terasic DE5-Net.

25 користувачам подобається ціна 8 тис баксів (жартую).

Є й інші спроби привезти FPGA в народ - Altera випустила спільно з Intel мікросхему серії E6x5C, де в єдиному корпусі з'єднаний процесор Atom і ПЛІС Arria II. Хороша спроба, але технологія так здається і не змогла знайти масового споживача.

Мабуть існуючі кристали ПЛІС погано вписуються в сучасну парадигму програмування.

А яка у нас зараз сучасна парадигма «нормального» програмування?

Мені здається, що якось так:

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

Зрозуміло, що чим більше пам'яті і чим більше ядер процесора, тим швидше працюють всі процеси в системі.

Пам'ять і ядра процесора - це ресурси комп'ютера, обчислювача, які операційна система розподіляє між процесами.

Тепер уявімо собі, що в майбутньому ми отримаємо комп'ютери, де на ряду з пам'яттю і ядрами процесора будуть іметься в наявності ще блоки логіки «як-би-пліс». Цей ресурс «як-би-пліс» за своїми властивостями знаходиться десь між процесором і пам'яттю. З одного боку «як-би-пліс» = це обчислювач, тобто ближче до процесуального, але з іншого боку це і пам'ять, бо в регістрах пліс зберігається досить багато інформації. Стан обчислювача «як-би-пліс» вже досить важко буде зберегти в структурі task_struct при перемиканні контексту завдання. Але, напевно, можна спробувати витіснити стан блоків логіки в swap файл, як віртуальну пам'ять. І тимчасово ОС може підвантажити інші блоки логіки для активного потоку...

До речі, і Altera і Xilinx вже досить давно мають FPGA з можливістю часткового перезавантаження окремих ділянок, блоків логіки (Partial Reconfiguration) - тобто в принципі вони якось йдуть в цей бік...

Програміст може виділити для процесу стільки «як-би-пліс», скільки потрібно. Буквально функцією lalloc (logic alloc) за аналогією з malloc (memory alloc). Потім з файлу рахувати туди «прошивку ПЛІС» і вона буде жити і працювати. Ми, програмісти, за великим рахунком не повинні думати є ця пам'ять/логіка «як-би-пліс» у системи або її немає. А не наша ця справа. Так, іноді може бути дуже повільно при обмежених ресурсах, але хіба ми не знаємо як «лагають» відеоігри на слабких відеокартах? Користувачі знають, що за сильне залізо доведеться платити, але добре б, щоб навіть мінімальна система вже мала в базовому варіанті логічні блоки «як-би-пліс» для використання в програмах.

Насправді, звичайно, я уявляю собі, що така технологія навряд чи скоро з'явиться, занадто все це складно і не реалізовано. Принаймні існуючі мікросхеми ПЛІС мало підходять для цих цілей хоча б тому, що для конфігурування ПЛІС використовуються повільні послідовні інтерфейси типу JTAG. Але можливо, колись хтось із нас зробить це?

ЗИ: до речі, а ось і моя гра життя в ПЛІС, така маленька, 32x16... ну немає у мене віртуальної пам'яті «як-би-пліс», щоб зробити поле гри ширше і вище...

ЗЫ2: всі вихідники і докладний опис проекту гри Життя можна взяти тут.