Wszystkie inne popularne odpowiedzi przedstawione tutaj mówią o dosłownych różnicach między układami FPGA i procesorami. Wskazują na równoległy charakter FPGA w porównaniu z sekwencyjnym charakterem procesora lub podają przykłady, dlaczego niektóre algorytmy mogą działać dobrze na FPGA. Wszystkie są dobre i prawdziwe, ale sugerowałbym jednak, że istnieje bardziej fundamentalna różnica między procesorami a FPGA.
Jaki jest wspólny mianownik między układem FPGA a procesorem? Oba są zbudowane na bazie krzemu. A w niektórych przypadkach dosłownie te same procesy krzemowe.
Podstawową różnicą są abstrakcje, które nakładamy na ten krzem. Jeden człowiek nie jest w stanie zrozumieć pełnego szczegółu pojedynczego nowoczesnego projektu procesora, od krzemu po zapakowany układ scalony. Dlatego w ramach procesu inżynieryjnego dzielimy ten złożony problem na mniejsze, możliwe do rozwiązania problemy, które ludzie mogą owijać wokół głowy.
Zastanów się, czego potrzeba, aby zmienić ten krzem w działający procesor. Oto nieco uproszczony widok warstw abstrakcji niezbędnych do tego celu:
Najpierw mamy inżynierów, którzy wiedzą, jak tworzyć tranzystory z krzemu. Wiedzą, jak zaprojektować maleńkie tranzystory, które pobierają moc i przełączają się z częstotliwością 10 lub nawet 100 gigaherców, i wiedzą, jak zaprojektować mocne tranzystory, które mogą sterować sygnałami o mocy wystarczającej do wysłania ich z układu scalonego i przez płytkę drukowaną do innego układu.
Następnie mamy projektantów logiki cyfrowej, którzy wiedzą, jak połączyć te tranzystory w bibliotekach z setkami różnych komórek logicznych. Bramy logiczne, klapki, multipleksery i dodatki, żeby wymienić tylko kilka. Wszystko w różnych konfiguracjach.
Następnie mamy różne grupy inżynierów, którzy wiedzą, jak połączyć te bloki cyfrowe (a czasem analogowe), aby utworzyć bloki funkcjonalne wyższego poziomu, takie jak szybkie transceiver, kontrolery pamięci, predyktory gałęzi, ALU itp.
Następnie mamy projektantów procesorów, którzy opracowują wysokiej klasy projekty procesorów, łącząc te jednostki funkcjonalne w kompletny system.
I to nie koniec. W tym momencie mamy działający procesor, który uruchamia kod asemblera, ale nie jest to język, który większość programistów pisze obecnie.
- Możemy mieć kompilator C do kompilacji kodu asemblera (prawdopodobnie poprzez jakąś reprezentację pośrednią)
- Możemy dodać kolejną abstrakcję na C, aby uzyskać język obiektowy
- Możemy nawet napisać maszynę wirtualną na C lub C ++, abyśmy mogli interpretować takie rzeczy, jak kod bajtowy Java
Od tego momentu warstwy abstrakcji mogą być kontynuowane. Ważną kwestią jest to, że te warstwy abstrakcji łączą się, tworząc system oparty na procesorze, który skaluje się masowo i kosztuje niewielką część niestandardowej konstrukcji krzemowej.
JEDNAK ważne jest, aby tutaj zwrócić uwagę, że każda abstrakcja sama w sobie wiąże się z pewnymi kosztami. Projektant tranzystorów nie buduje idealnego tranzystora dla każdego przypadku użycia. Buduje rozsądną bibliotekę, dlatego czasami używany jest tranzystor, który zużywa nieco więcej energii lub trochę więcej krzemu, niż jest to naprawdę potrzebne do danego zadania. Podobnie projektanci logiki nie budują wszystkich możliwych komórek logicznych. Mogą zbudować bramę NAND z 4 wejściami i bramę NAND z 8 wejściami, ale co się stanie, gdy inny inżynier potrzebuje NAND z 6 wejściami? Używa 8-wejściowej bramki NAND i wiąże 2 nieużywane wejścia, co powoduje utratę zasobów krzemu i utratę mocy. I tak idzie w górę łańcucha abstrakcji. Każda warstwa daje nam sposób na radzenie sobie ze złożonością,
Teraz porównaj te abstrakcje z tym, co jest potrzebne do FPGA. Zasadniczo abstrakcje FPGA zatrzymują się na drugim miejscu na powyższej liście. FPGA pozwala programistom pracować na cyfrowej warstwie logicznej. Jest to nieco bardziej skomplikowane, ponieważ procesory są „zakodowane na stałe” na tej warstwie, a układy FPGA muszą zostać skonfigurowane w czasie wykonywania (co, BTW, właśnie dlatego procesory zwykle pracują na znacznie wyższych częstotliwościach), ale podstawową ważną prawdą jest to, że są one daleko kilka abstrakcji dla układów FPGA niż dla procesorów.
Więc Dlaczego FPGA szybciej niż CPU? Zasadniczo dzieje się tak dlatego, że FPGA używa znacznie mniej abstrakcji niż procesor, co oznacza, że projektant pracuje bliżej krzemu. Nie pokrywa kosztów wszystkich warstw abstrakcji wymaganych dla procesorów. Koduje na niższym poziomie i musi ciężko pracować, aby osiągnąć określony poziom funkcjonalności, ale nagrodą jest wyższa wydajność.
Ale oczywiście jest też wadą mniej abstrakcji. Wszystkie te abstrakty procesora istnieją z dobrego powodu. Dają nam znacznie prostszy paradygmat kodowania, co oznacza, że więcej osób może z łatwością się dla nich rozwijać. To z kolei oznacza, że istnieje o wiele więcej konstrukcji procesorów, dzięki czemu mamy ogromne korzyści w stosunku do ceny / skali / czasu wprowadzenia na rynek procesorów.
Więc masz to. Układy FPGA mają mniej abstrakcji, dzięki czemu mogą być szybsze i bardziej energooszczędne, ale trudne do zaprogramowania. Procesory mają wiele abstrakcji, dzięki czemu można je łatwo opracowywać, skalować i tanio. Ale rezygnują z szybkości i siły w handlu dla tych korzyści.