Układy FPGA w programowalnych sieciach komputerowych (SDN)

Krzysztof Kempiński
Nov 3 · 12 min read
Image for post
Image for post

W ramach podcastu “Porozmawiajmy o IT” miałem okazję porozmawiać z Maciejem Trochimiukiem i Mateuszem Jabłońskim o układach FPGA w programowalnych sieciach komputerowych.

Posłuchaj naszej rozmowy w wersji audio 🎧 👇

Cześć! Dzisiaj moimi gośćmi w podcaście są Maciej Trochimiuk, Software Engineer w CodiLime, doktor na Politechnice Warszawskiej. Studiował informatykę i radiokomunikację. Pracował między innymi w Orange Polska i Samsung Electronics. Oraz Mateusz Jabłoński, Software Engineer w CodiLime, absolwent informatyki na Politechnice Warszawskiej, programista C, C++ oraz Python.

Z Maciejem i Mateuszem będę dzisiaj rozmawiał o układach FPGA w programowalnych sieciach komputerowych.

Maciej, Mateusz, bardzo mi miło gościć Was w podcaście.

Maciej Trochimiuk: Cześć! Mnie również bardzo miło.

Mateusz Jabłoński: Cześć!

Cieszę się, że będziemy mieli okazję porozmawiać, ale na początku zapytam Was o to, o co zawsze pytam moich gości, czyli czy słuchacie podcastów, a jeśli tak, to jakich najczęściej?

M.T.: Słucham podcastów, ale wyłącznie zagranicznych. Traktuje to jako pewne narzędzie do utrzymania kontaktu z językiem. Natomiast polskojęzycznych nie słucham, tak się przyznam.

M.J.: Natomiast mi się zdarza posłuchać jakiegoś polskiego podcastu, ale bardziej jak znajdę coś ciekawego, albo ktoś mi coś ciekawego podeśle. Nie mam raczej takich podcastów, które słuchałbym regularnie. Natomiast bardzo lubię przeglądać jakieś bardziej techniczne materiały wideo na YouTubie, czy Livestreamy.

Dzięki wielkie.

Układy FPGA, o których będziemy dzisiaj rozmawiać, to przykład układów programowalnych. Chciałbym Was zapytać, czym są takie układy programowalne w ujęciu ogólnym.

M.T.: Generalnie układy scalone, takie jak na przykład procesory, czy mikrokontrolery, działają na takiej zasadzie, że mają wyprowadzenia na różne sygnały, które można wbić i te wyprowadzenia, i ich architektura jest zadana raz w procesie produkcyjnym. Czyli jeżeli mamy jakiś mikrokontroler albo nawet procesor, wiemy które nóżki, do czego służą, czy która nóżka jest zasilaniem, która jest sygnałem zegarowym, które nóżki są do pamięci i tak dalej.

Natomiast jeżeli nie ma możliwości zmiany sposobu, w jaki ten układ działa. Sposób jego działania jest zadany raz przez producenta w procesie produkcji. W przypadku układów programowalnych mamy oczywiście część funkcjonalności, która jest zapisana na sztywno. W tym przypadku programowanie, zasilanie i tak dalej. Natomiast cała funkcjonalność tego układu scalonego muszę programować, w ten sposób, że jeden taki układ może być zaprogramowany tak, żeby był na przykład procesorem w architekturze ARM, innym razem taki układ może być kartą sieciową albo innym razem jakimś koderem sieciowym.

W 59. odcinku podcastu rozmawiałem z Krzysztofem Wróblem o SDN, czyli Software Defined Networking w sieciach programowalnych softwarowo. W dzisiejszym odcinku chciałbym z Wami porozmawiać o tym, jak te układy FPGA programowalne możemy w tego typu sieciach wykorzystać.

Warto więc myślę, w pierwszej kolejności odsłuchać ten odcinek, to informacja dla słuchaczy, którzy nie mieli wcześniej ku temu okazji. Natomiast Was chciałbym zapytać, poprosić o rozwinięcie akronimu FPGA i powiedzenie po prostu czym są te układy i jaka była historia ich powstania.

M.T.: Skrót od FPGA po angielski rozwija się jako Field Programmable Gate Array. Układy programowane jako pierwsze, skąd były to pewne matryce bramek logicznych, które można było programować. Wynika to z praw De Morgana czy można wyprowadzić, czy wystarczy jeden procent bramek, czy dwa rodzaje bramek, albo AND, albo OR, żeby taki układ mógł realizować bardzo szeroką gamę funkcji logicznych, czyli takich, gdzie wejściem i wyjściem są zero jedynki. Generalnie te układy, o których mówię, to już jest wręcz prehistoria.

Natomiast w procesie rozwoju układów programowalnych powstawały coraz doskonalsze układy. W przypadku układów programowalnych programujemy komórki logiczne, które mogą działać zarówno jako rejestry, sumatory, multipleksery, czy tablice przygruntowe. Co więcej, strukturę działania i sposób pracy takich komórek można zmniejszyć w trakcie pracy. Układ, który jest włączony, może po prostu po przeprogramowaniu stać się zupełnie czymś innym, czym był przed chwilą.

Co prawda studiowałem elektronikę i telekomunikację, więc trochę w tym obszarze pojmuję pojęć, natomiast nigdy nie pracowałem zawodowo w tym obszarze. Musiałem się też do tego podcastu douczyć i poczytać. Szukając różnych informacji, dotarłem do tego, że czołowe firmy produkujące właśnie układy tego typu wymieniają szereg korzyści wynikających z korzystania układów FPGA, między innymi elastyczność, szybkość, redukcja kosztów. Chcę Was zapytać, jak według Was można by opisać taki ogół korzyści ze stosowania tych układów, również w stosunku do tych zaproponowanych przez Intela?

M.T.: W przypadku korzyści, zarówno podstawową funkcją, dla której wykorzystywane są układy w FPGA jest przede wszystkim programowanie układów scalonych. Ponieważ taki układ może realizować bardzo szeroką gamę funkcji logicznych, nie musimy projektować układu scalonego tak, że zlecamy fabrykację gotowego projektu i następnie ją przygotowujemy, tylko przygotowujemy projekt na układ w FPGA, który możemy zrealizować, sprawdzić dokładnie jak działa.

Jeżeli okaże się, że ten projekt wymaga poprawek, możemy te poprawki wprowadzić i w kolejnej iteracji ten układ poprawić. W tym przypadku oszczędza się zarówno bardzo dużo czasu, ponieważ fabrykacje takiego gotowego układu mogą być procesem bardzo skomplikowanym, a także kosztów, ponieważ jeden układ może nam służyć do przygotowywania bardzo wielu iteracji danego projektu.

Jak tego typu układy działają od strony technologicznej, czy wszystkie opierają się na tych samych zasadach? Są może tworzone w ten sam sposób, czy mamy różne typy?

M.T.: Tutaj będę mówił tylko o układach FPGA, tak jak mówiłem, te starsze typy, czyli BLD, czy CBLD, to już są układy prehistoryczne. Inna sprawa, że na przykład w przypadku Intela była MAX, czyli takie bardzo stare nadal są wykorzystywane, natomiast nie zmienia to faktu, że te układy nie tracą konfiguracji w przypadku wyłączenia i włączenia zasilania, a układ w FPGA muszą za każdym razem być przeprogramowywane. W przypadku projektów Intela układ MAX służy do inicjalizacji płytki i następnie można powiedzieć pierwsze skrzypce gra już układ FPGA, kiedy zostają zainicjalizowane. Wracają do samych układów FPGA, one składają się z komórek logicznych, połączonych kanałami połączeniowymi. Każda komórka logiczna składa się z tablicy przeglądowej i jest to element, który jest programowany.

Natomiast tablica ta wykorzystywana jest do wysterowania elementów, z których składa się każda komórka i do realizowania funkcji logicznych odnośnie deplementów, z których składa się komórka, czyli oprócz tej tablicy każda komórka zawiera sumator, czyli układ służący do realizowania dodawania, a także przy pomocy odpowiedniej zmiany stanów konsologicznych można także odejmować. Oprócz sumatora mamy także rejestry, czyli elementy logiczne służące do realizowania pamięci, takich najprostszych. Oraz multipleksery, czyli elementy przełączające.

Oprócz tego w układach FPGA mogą znajdować się pamięci statyczne i dynamiczne, ale to już bardzo dokładnie zależy od konkretnego modelu producenta. Oprócz tego w układach FPGA można znaleźć także gotowe elementy, takie jak rdzenie procesorów, kontrolery pamięci, kontroler USB, czy karty sieciowe. Z tego względu, że są to na tyle często używane podzespoły, żeby nie było konieczności implementowania ich w strukturze FPGA skoro mogą być zaimplementowane w krzemie i w ten sposób mogą być od razu wykorzystywane.

Struktura, którą opisałeś, wydaje się bardzo elastyczna. Wydaje się, że można ją zastosować w różnych obszarach. Chciałbym właśnie zapytać teraz o te obszary, kto wykorzystuje tego typu układy, czy są być może jakieś dziedziny, które chętnie korzystają z możliwości układów FPGA?

M.T.: Wcześniej mówiłem już o podstawowym zastosowaniu układów FPGA, czyli prototypowaniu układów scalonych. Oprócz tego mogę jeszcze dodać, że wszystkie na przykład współczesne procesory tensorowe, albo nawet koparki to kryptowalut, te wszystkie nowe układy scalone zaczynały jako właśnie projekty w FPGA i dopiero po osiągnięciu pewnego poziomu dojrzałości, te procesory tensorowe zostały już zaimplementowane w krzemie. Był to po prostu projekt, który wyewoluował z układu w FPGA, bo tam były początkowo rozwijane.

Oprócz tego stosowane są w systemach czasu rzeczywistego, czyli tam, gdzie te wymagania czasowe są bardziej wyśrubowane i w przypadku niezwykle wyśrubowanych wymagań, to już są ułamki mikrosekund, zastosowanie systemów czasu rzeczywistego zaimplementowanych na procesorach ogólnego przeznaczenia może być niewystarczające. Natomiast taki algorytm może być zaimplementowany w układzie FPGA z użyciem po prostu logiki albo kombinacyjnej, albo sekwencyjnej. Wykorzystując system czasu rzeczywistego w układzie FPGA może go modyfikować, ponieważ są to układy programowalne, a także, jeżeli dawny układ wiemy, że już jest dojrzały i dopracowany, możemy przenieść go do układu scalonego, gdzie będzie odznaczał się i znacznie lepszą szybkością i energooszczędnością.

Oprócz tego układy programowalne wykorzystywane są przy projektach, które głęboko ingerują w sprzęt, czyli tam, gdzie część sprzętową może podlegać zmianom i nie możemy sobie pozwolić na zamrożenie całego projektu sprzętowego, gdzie zakładamy, że część sprzętowa może się zmienić i potrzebujemy układu, który będziemy dostosowywać do tych zmian. Jeżeli mamy jakiś podzespół albo układ jednego producenta i zakładamy, że jeden z dostawców może się zmienić i dostawca ten nie ma tego, może mieć inny interfejs, to w tym przypadku, takim naturalnym rozwiązaniem może być wykorzystanie układów programowalnych. Oprócz tego takim innym zastosowaniem, gdzie stosowane są układy FPGA, są różnego rodzaju akceleratory obliczeniowe.

Układy FPGA to układy programowalne. Do tej pory trochę powiedzieliśmy o podstawach technologicznych, o zastosowaniach, o tym, jak to wygląda od strony sprzętu. Myślę, że to, co szczególnie interesuje słuchaczy, to jak się programuje tego typu układy. Jakich języków programowania się używa, w jaki sposób transferuje się gotowy program do układu elektronicznego?

M.T.: W przypadku programowania układów programowanych to pojęcie jest takie troszeczkę mylące z tego względu, że może nie mylące, ponieważ w odróżnieniu od procesorów ogólnego przeznaczenia, procesorów graficznych, nie ma programu, który by się na nim wykonywał, w jakiś sposób sekwencyjny. W przypadku układów FPGA w programowaniu to, co nazywamy programowaniem układów FPGA, polega na stworzeniu architektury sprzętowej, która będzie realizowała zadany przez nasz algorytm, albo to, co chcielibyśmy, aby ten układ robił i opisaniu tego algorytmu w języku opisu sprzętu. Czyli takimi klockami, z których ten algorytm budujemy, nie są takie jak w przypadku programów na CPU albo na kartę graficzną, rejestr pamięci i zestaw operacji, które udostępnia procesor, tylko w przypadku FPGA składamy ten algorytm z bramek logicznych, sumatorów, rejestrów, multiplekserów, czyli takich elementów bardzo niskiego poziomu.

Natomiast to ma te zalety, że można bardzo dokładnie dostosować się do danych elementów, które występują w algorytmie. Czyli jeżeli mamy dwudziesto bitowy typ danych, możemy tylko realizować na dokładnie dwudziesto bitowych sumatorach, a nie wykorzystywać do tego rejestru, które są na przykład w procesorze o przeznaczeniu trzydziestodwu bitowe. Możemy się bardzo dokładnie dopasować do danych oraz możemy wykorzystywać operacje, które w przypadku podwójnego przeznaczenia są albo trudne, albo czasochłonne. One są możliwe do realizacji, natomiast mogą się wiązać na przykład z bardzo długim czasem wykonywania operacji, jak na przykład różne operacje bitowe, czy maski bitowe, które w przypadku procesorów ogólnego przeznaczenia mogą być realizowane przez kilka cykli procesora, natomiast w układach FPGA mogą być po prostu realizowane natychmiast.

Rozumiem, czyli bardziej programujemy w krzemie, niż w języku wysokopoziomowym, gdzieś tam kojarzę pojęcia typu VHDL i tego typu języki, które być może, czy pseudo języki, które być może są już teraz archaiczne, natomiast zastanawiam się jak od strony programowania można by tu było powiedzieć kilka słów na temat, chociażby tworzenia takich układów w PGA właśnie na bazie tego sprzętu. Jakiego typu narzędzia, jakiego typu podejście się wykorzystuje, żeby taką strukturę stworzyć?

M.T.: Jeżeli chodzi o języki, to nie jest tak, że one są archaiczne. W przypadku języka VHDL on ma składnię bardziej zbliżoną do Pascala, niż do C, więcej jest to może nie archaizm, ale pewna specyfika tego języka, że programuje się nim troszeczkę inaczej, raczej składnie niż trochę inna. Natomiast Vector, czyli inny język opisu sprzętu ma składnię podobną do C, która niby powinna być taka bardziej intuicyjna dla osób, które nie miały wcześniej doświadczenia z językami opisu sprzętu. W przypadku tworzenia takiej architektury kluczowym narzędziem jest symulator HDL. Narzędzie, które pozwala zasymulować działania architektury na podstawie samych pobudzeńi sprawdzenia jak ten przepływ danych wygląda.

Symulator jest tutaj bardzo istotnym elementem z tego powodu, że kompilacja programowania, czyli cykl polegający na skompilowaniu danego opisu sprzętu do układu i zaprogramowaniu tego układu, jest bardzo czasochłonne. Kompilacja nawet najprostszych programów może trwać bardzo długo. Dlatego tutaj kluczowym elementem jest symulator, aby ten algorytm, który zostanie tam zaimplementowany, bardzo dokładnie i dogłębnie zweryfikować.

W przypadku depakowania układu, depakowania architektury sprzętowej jest to też mocno utrudnione z tego względu, że architektura sprzętowa musi uwzględniać możliwość depakowania, co przejawia się na przykład tym, że architektura sprzętowa w konfiguracji takiej gotowej do uruchomienia, może się w układzie FPGA mieścić bez problemu, natomiast architektura przygotowana do depakowania może się już nie zmieścić w układzie i będzie się charakteryzowała znacznie gorszymi charakterystykami czasowymi. W przypadku tworzenia algorytmów, które będą zaimplementowane w układzie FPGA bardzo ważne jest dokładne ich przesymulowanie, ponieważ może się okazać, że depakowanie takiego produktu może być mocno utrudnione.

Ciekawe wyzwania tej dziedziny programowania. Zastanawiam się w bardziej klasycznych ujęciach, czy w tworzeniu bardziej klasycznego programowania, które ma działać na procesorach ogólnego przeznaczenia, albo gier, które bardziej wykorzystują GPU, domyślam się, że w tych dziedzinach trochę inaczej podchodzi się do programowania, niż w przypadku układów programowalnych. Czy mógłbyś powiedzieć, jakie są główne różnice w tego typu podejściu, a bardziej klasycznych procesorach ogólnego przeznaczenia i kartach GPU?

M.T.: W przypadku układów programowalnych, jak już mówiłem, projektujemy po prostu architekturę sprzętową, która będzie wykonywała pewne zadania, natomiast w procesorach ogólnego przeznaczenia, mamy całą architekturę, czyli zestaw instrukcji, pamięć mamy zadaną, dostosowujemy się do tego, co zostało przewidziane przez producenta.

Czyli sama specyfika jest różna, jak również języki programowania, czy narzędzia, które się wykorzystuje. Czy można powiedzieć, że są jakieś rzeczy wspólne, skoro tak wiele na pierwszy rzut oka dzieli?

M.T.: W przypadku języka VHDL ta archaiczność składni ma jednak pewne wady, ponieważ pisanie tych weryfikatorów, czy weryfikowanie tego, czy architektura działa tak, jak zakładaliśmy, jest po prostu bardzo utrudnione i na przykład z własnego doświadczenia, kiedy pisałem pewną architekturę VHDL-u, to i tak musiałem wspomagać się Pythonem do wygenerowania części tego kodu, ponieważ wpisanie tego w czystym VHDL-u było wtedy dla mnie, może nie tyle zbyt pracochłonne, ale prościej dało się to zrobić inaczej.

Powiedzieliśmy tutaj chwile o układach GPU wykorzystywanych gdzieś w kartach graficznych. Jeśli jesteśmy przy tym temacie, to trzeba też powiedzieć, że jednym z głównych zastosowań układów FPGA jest akceleracja sprzętowa. Czym jest taka akceleracja i jak działa właśnie na przykładzie kart graficznych?

M.J.: Akceleracja sprzętowa jest wspomaganiem pewnych powtarzalnych złożonych operacji, które normalnie zużywałyby dużo zasobów naszego komputera i możemy takie operacje wydzielić, zaimplementować na dedykowanym sprzęcie, którym jest właśnie FPGA. Mówiąc o zasobach, mam na myśli w tym przypadku głównie moc obliczeniową. Wtedy dedykowany sprzęt przejmuje część zadań naszego CPU i odciąża po prostu nasze procesy. Karty graficzne są jednym z najbardziej rozpoznawalnych i najpowszechniejszych takich akceleratorów sprzętowych.

W tym przypadku tak jak już mówiłem, mamy dedykowany sprzęt, który z zasady nie jest procesorem ogólnego przeznaczenia, tylko właśnie dedykowanym procesorem zajmującym się grafiką, wyświetlaniem grafiki. Mówię tutaj z zasady, ponieważ w dzisiejszych czasach już strony graficzne można używać do pewnego rodzaju obliczeń, no ale nadal nie są to dowolne obliczenia. To jest też pewien ograniczony zakres możliwości tego, co na GPU możemy zrobić. No ale GPU jest idealnym przykładem akceleratora sprzętowego i nie mówię tu tylko o dzisiejszych kartach graficznych, które przetwarzają setki tysięcy wierzchołków modelu, mnożąc je przez macierze i nakładają to tekstury i generują z tego obraz. Wiele razy, na przykład sześćdziesiąt razy na sekundę.

Mówię też tu o czymś, co było przed kartami graficznymi, czyli na przykład akceleratorach 3D, które już wtedy wchodziły i wspierały procesu na generowaniu grafiki. Możemy także tu mówić o dedykowanych układach graficznych, które były w komputerach jeszcze w czasach jakichś interfejsów tekstowych. Wtedy procesor wpisywał tylko do pamięci to, co chciał, żeby było wyświetlone, a taki dedykowany układ zajmował się generowaniem tej grafiki. Często też na przykład sygnału analogowego. Można powiedzieć, że był to dedykowany akcelerator sprzętowy.

Jeszcze mówiąc o zasobach, można też wyobrazić sobie akcelerator sprzętowy w postaci dodatkowej pamięci, dodatkowej karty z pamięcią pewnego rodzaju, na przykład chcemy mieć terabajty pamięci, ale nie ma być to pamięć ram, tylko może być to jakaś wolniejsza pamięć o jakimś sekwencyjnym dostępie, wtedy też możemy mówić, że to jest w pewnym sensie akcelerator sprzętowy.

A jak taka akceleracja działa w przypadku układów FPGA, w jaki sposób też połączyć też taki układ z softwarem, skoro on jest bardzo customizowalny, można go dostosować, czy są jakieś standardy, które umożliwiają później korzystanie, z takiego powiedzmy właśnie programowalnego układu poprzez software, który jest napisany, software wyższego już poziomu.

M.J.: Tak naprawdę akceleracja z udziałem FPGA działa tak samo, jak czysto sprzętowa implementacja. Różni się tylko właśnie implementacja z punktu widzenia komputera, który będzie to używał, może być tak naprawdę to samo. Jak wcześniej mówiliśmy, jak Maciej powiedział, główna różnica jest elastyczność i wszystkie pozostałe plusy, które daje nam FPGA, możemy w prosty sposób zmieniać implementację sprzętową, nawet już do danego sprzętu wypuszczać aktualizacje, aktualizujemy wtedy obraz, czy możemy też posiadać wiele implementacji, które będą działały na jednej płytce.

Co do łączenia z softwarem, najprostszym przykładem będzie tutaj chyba GPAO. Wtedy łączymy odpowiednie piny naszego procesora, czy to w tym przypadku pewnie bardziej mikrokontrolera z odpowiednimi pinami FPGA. Wtedy FPGA możemy odpowiednio zaprojektować ten sprzęt, żeby odpowiednio interpretował sygnały, które będziemy podawali na takich pinach.

Można oczywiście zaimplementować jakieś protokoły komunikacji, na przykład Quad SPI. Takim chyba najlepszym sposobem komunikacji w przypadku jakichś serwerów opartych o architekturę Intelową będzie PCI. Wtedy w FPGA implementujemy obsługę PCI i nasz procesor może pisać do odpowiednich rejestrów, tak zaimplementowanym sprzęcie, jak właśnie przez PCI. Nawet możemy wpisać odpowiednie adresy do tego FPGA i wtedy FPGA będzie pisało przez DMA do pamięci naszego hosta.

M.T.: Ze swojej strony chciałbym jeszcze dodać, że zarówno takie proste protokoły, jak UAD, jak i kontrolery PCI często są już zaimplementowane krzemowo w układach FPGA, więc są to rzeczy, które są dostępne i można je wykorzystać.

👉 Czytaj dalej na: https://porozmawiajmyoit.pl/poit-091-uklady-fpga-w-sieciach-sdn/

kkempin’s dev blog

Dev and life blog.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store