ARM Cortex-A8: Jaka jest różnica między VFP a neonem

W procesorze ARM Cortex-A8 rozumiem czym jest NEON, jest to współprocesor SIMD.

Ale czy jednostka VFP (Vector Floating Point), która jest również współpro-procesorem, działa jako procesor SIMD? Jeśli tak, który z nich jest lepszy do wykorzystania?

Przeczytałem kilka linków takich jak-

  1. Link1

  2. Link2 .

Ale nie bardzo jasne, co one oznaczają. Mówią, że VFP nigdy nie miał być używany dla SIMD, ale na Wiki I przeczytaj poniższe - " Architektura VFP obsługuje również wykonywanie instrukcji wektorowych krótkich, ale działają one na każdym elemencie wektorowym sekwencyjnie i dlatego nie oferują wydajności równoległości true SIMD (Single Instruction Multiple Data)."

To tak nie do końca jasne w co wierzyć, czy ktoś może rozwinąć więcej na ten temat?

Author: Tamar E. Granor, 2010-11-04

4 answers

Jest między nimi pewna różnica. Neon to procesor akceleratora SIMD (Single Instruction Multiple Data) będący częścią rdzenia ARM. Oznacza to, że podczas wykonywania jednej instrukcji ta sama operacja będzie miała miejsce na maksymalnie 16 zestawach danych równolegle. Ponieważ Neon jest równoległy, możesz uzyskać więcej MIPS lub FLOPS z neonu niż standardowy procesor sisd działający z tą samą częstotliwością zegara.

Największą zaletą neonu jest to, że jeśli chcesz wykonać praca z wektorami, czyli kodowanie/dekodowanie wideo. Może również wykonywać operacje zmiennoprzecinkowe o pojedynczej precyzji (float) równolegle.

VFP to klasyczny akcelerator sprzętowy zmiennoprzecinkowy. Nie jest to architektura równoległa jak Neon. Zasadniczo wykonuje jedną operację na jednym zestawie wejść i zwraca jedno wyjście. Jego celem jest przyspieszenie obliczeń zmiennoprzecinkowych. Obsługuje pojedynczy i podwójny precyzyjny zmiennoprzecinkowy.

Masz 3 możliwości wykorzystania Neon: {]}

  • Użyj funkcji wewnętrznych # include " arm_neon.h "
  • inline The Assembly code
  • niech gcc zrobi dla Ciebie optymalizacje, podając -mfpu=neon jako argument (gcc 4.5 jest w tym dobry)
 37
Author: Cosmin Cojocar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-05 15:20:26

Architektonicznie, VFP (nie był nazywany zmiennoprzecinkowym wektorowym) rzeczywiście ma przepis do działania na wektorze zmiennoprzecinkowym w jednej instrukcji. Nie wydaje mi się, aby kiedykolwiek faktycznie wykonuje operacje wielokrotności jednocześnie( jak true SIMD), ale może zaoszczędzić trochę rozmiaru kodu. Jeśli jednak przeczytasz Podręcznik ARM Architecture Reference w Pomocy Shark (jak opisuję we wstępie do neonu, link 1 w pytaniu), zobaczysz w sekcji A2.6, że funkcja wektorowa VFP jest przestarzały w ARMv7 (co implementuje Cortex A8), a oprogramowanie powinno używać Zaawansowanego SIMD do operacji wektorów zmiennoprzecinkowych.

Co gorsza, w implementacji Cortex A8, VFP jest zaimplementowany z jednostką wykonawczą VFP Lite (Czytaj lite jako zajmującą mniejszą powierzchnię krzemu, a nie jako mającą mniej funkcji), co oznacza, że jest faktycznie wolniejszy niż na przykład na ARM11! Na szczęście większość instrukcji VFP z pojedynczą precyzją jest wykonywana przez jednostkę NEON, ale nie jestem oczywiście operacje Vector VFP działają; a nawet jeśli tak, to z pewnością wykonują wolniej niż w przypadku instrukcji NEON.

Mam nadzieję, że to wszystko wyjaśni!

 16
Author: Pierre Lebeaupin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-06 22:04:46

Dla armv7 ISA (i wariantów)

VFP jest jednostką zmiennoprzecinkową zgodną ze STANDARDEM IEEE-754. W szczególności na A8 Jednostka neonowa jest znacznie szybsza dla prawie wszystkiego, nawet jeśli nie masz bardzo równoległych danych, ponieważ VFP nie jest pipelinowany. Więc dlaczego miałbyś używać VFP?!

Największą różnicą jest to, że VFP zapewnia podwójną precyzję zmiennoprzecinkowy.

Po drugie, istnieje kilka wyspecjalizowanych instrukcji, które oferuje VFP, dla których nie ma równoważnych implementacji w jednostce NEON. Przychodzi mi na myśl sqrt, być może jakieś konwersje typu.

Ale najważniejszą różnicą, o której nie wspomniano w odpowiedzi Cosmina, jest to, że rurociąg zmiennoprzecinkowy NEON nie jest całkowicie zgodny z IEEE-754. Najlepszy opis różnic znajduje się w opisie rejestru FPSCR .

Ponieważ nie jest Zgodny ze STANDARDEM IEEE-754, kompilator nie może wygenerować tych instrukcji, chyba że powiesz kompilatorowi, że nie jesteś zainteresowany pełną zgodnością. Można to zrobić na kilka sposobów.

  1. użycie funkcji wewnętrznej do wymuszenia użycia neonu, na przykład zobacz listę funkcji wewnętrznej GCC Neon .
  2. poproś kompilatora, bardzo ładnie. Nawet nowsze wersje GCC z -mfpu=neon nie będą generować instrukcji zmiennoprzecinkowych, chyba że podasz również -funsafe-math-optimizations.

Na armv8+ ISA (i warianty) [Update]

NEON jest teraz w pełni zgodny z IEE-754, a z punktu widzenia programisty (i kompilatora) nie ma zbyt dużej różnicy. Podwójna precyzja została wektoryzowana. Z punktu widzenia mikroarchitektury wątpię, by były to nawet różne jednostki sprzętowe. ARM dokumentuje instrukcje skalarne i wektorowe oddzielnie, ale obie są częścią " Advanced SIMD."

 15
Author: Peter M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-19 23:02:28

IIRC, VFP jest koprocesorem zmiennoprzecinkowym działającym sekwencyjnie.

Oznacza to, że można użyć instrukcji na wektorze pływaków do zachowania SIMD, ale wewnętrznie instrukcja jest wykonywana na każdym elemencie wektora w sekwencji.

Podczas gdy całkowity czas wymagany dla instrukcji jest przez to skrócony z powodu pojedynczej instrukcji load, VFP nadal potrzebuje czasu na przetworzenie wszystkich elementów wektora.

True SIMD zyska więcej wydajność zmiennoprzecinkowa netto, ale korzystanie z VFP z wektorami jest jeszcze szybsze niż korzystanie z niego czysto sekwencyjnie.

 2
Author: sum1stolemyname,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-04 13:58:40