Więcej o firmie ELESOFTROM

Firma ELESOFTROM specjalizuje się w wykonywaniu i naprawianiu oprogramowania dla sterowników mikroprocesorowych.

Posiadamy ponad 10-letnie doświadczenie w tej dziedzinie.

W realizowanych projektach stawiamy na niezawodność i wydajność programów.

Naprawa oprogramowania

Oprogramowanie na zamówienie


Strona główna

Pełna oferta

Doświadczenie

O firmie

Kontakt


DioneOS - RTOS dla urządzeń embedded

Firma ELESOFTROM opracowała system RTOS dla procesorów ARM Cortex-M3 oraz msp430.

System jest zoptymalizowany pod względem wydajności, dzięki czemu uzyskano krótki czas przełączania pomiędzy wątkami.
System dostarcza elementy (np. semafory, mutexy, timery, kolejki itp.) niezbędne do tworzenia wielowątkowego firmware'u.

Wersja dla Cortexa została całkowicie przetestowana przy pomocy środowiska do automatycznego testowania.

Przeczytaj więcej:

Strona o systemie DioneOS

Niezawodność

Wydajność

Dokumentacja DioneOSa

Prezentacje n.t. DioneOS


^ Blog index    << SoC Broadcom BCM283x w Raspberry Pi    >> Broadcom VideoCoreIV 3D, podstawy programowania GPU

Broadcom VideoCoreIV 3D, budowa z perspektywy GPGPU

2017-12-18    dr inż. Piotr Romaniuk

Spis treści

Architektura VideoCore 3D
Quad Processing Unit (QPU) - model danych
Architektura QPU
Rejestry QPU
Powiązane moduły sprzętowe
Instrukcje QPU
Główne ograniczenia instrukcji
Linki

Architektura VideoCore 3D
Ten opis przedstawia architekturę VideoCoreIV 3D w sposób ogólny, przedstawia go z perspektywy programisty procesora graficznego. Z tego względu niektóre elementy na schemacie blokowym zostały pominięte lub uproszczone, ale tak aby było to wystarczające dla programowania GPGPU. Więcej szczegółów można znaleźć w dokumentacji układu firmy Broadcom (zobacz (1) w sekcji linki na końcu strony).



Rys. 1. Uproszczona architektura VideoCoreIV-3D.

Centralna częścią przetwarzająca dane składa się z wielu procesorów Quad Processing Units (QPU). Są one zgrupowane w tzw. slice'y (po cztery QPU w jednym slice) i zaopatrzone we wspólne zasoby:

  • Pamięć cache instrukcji (ICache) - pamięć cache instrukcji dla wszystkich QPU w slice'ie,
  • Pamięć cache argumentów (Uniforms cache) - pamięć cache argumentów (uniforms), które są przekazywane do QPU przy uruchamianiu programu
  • Texture and Memory Lookup Unit (TMU) - dostarcza dane z tekstur; również wygodny sposób do dostepu do danych przez indeksy
  • Moduł funkcji specjalnych (SFU) - oblicza funkcje matematyczne: 1/x, 1/sqrt(x), log(x), exp(x)

VideoCore 3D zawiera lokalną pamięć (Vertex Pipe Memory) wspólną dla wszystkich procesorów QPU. Ta pamięć służy do przechowywania większych fragmentów danych a jej zawartość jest pobierana lub przekazywana przez DMA do głównych regionów pamięci CPU. Dane mogą być ładowane w częściach, które odpowiadają strukturze obrazu (tzn. kolumny i linie). Gdy VPM zostanie raz skonfigurowane, staje się szeregowym źródłem (lub przeznaczeniem), z którego pobiera się kolejne dane. Niemniej jednak, VPM może być kilkukrotnie konfigurowane przed każdym przesłaniem paczki danych a nawet przed każdym pojedynczym transferem. W ten sposób daje elastyczny dostęp do tego rodzeju pamięci.
Konfigurowane są dwa interfejsy: (1) dostęp do VPM przez procesor QPU, (2) przekazywanie danych pomiędzy VPM i główną pamięcią. Każdy z nich może wykonywać pewną reorganizację danych (tzn. zapisywać w rzędach lub kolumnach, wprowadzać offset lub dodawać dodatkowe przesunięcie addresu do następnej linii obrazu).

Quad Processing Unit (QPU) - model danych
Procesor QPU posiada architekturę SIMD (Single Instruction, Multiple Data), co oznacza, że wykonuje w jednej instrukcji oprację na wektorze elementów. Z punktu widzenia programisty procesor QPU przetwarza 16-elementowe wektory liczb 32-bitowych. Jeśli jednak weźmie się pod uwagę fizyczną strukturę, to QPU przetwarza tylko 4-elementowe wektory, tzw. quady. Przez czterokrotne powtórzenie takiej operacji na kolejnych quadach wektora 16-elementowego uzyskuje się wirtualne SIMD-16.



Rys. 2. Długości danych dla procesora QPU.

Pojedynczy element jest zawsze 32-bitowy ale może reprezentować różne typy danych:

  • float - zmiennoprzecinkowa wartość pojedynczj precyzji,
  • int32 - liczba całkowita 32-bitowa,
  • 2x int16 - dwie wartości całkowite 16-bitowe (pakowane), kolejne wartości są oznaczane literami: a, b
  • 4x int8 - cztery wartości całkowite 8-bitowe (pakowane) - nazywane: a, b, c, d

Architektura QPU
Procesor QPU składa się z wielu rejestrów (w większości przechowujących 16-elementowe wektory) i dwudrożnej jednostki arytmetyczno-logicznej przetwarzającej argumenty SIMD16. Niektóre rejestry są wyposażone w bloki pakowania/rozpakowania. Ta cecha razem z instrukcjami ftoi oraz itof zapewniają konwersję pomiędzy różnymi formatami danych.
Moduły sprzętowe, które są ściśle powiązane z QPU (np. VPM, TMU, SFU) są widoczne dla procesora QPU w przestrzeni adresowej rejestrów. Przez to 'okno' QPU przesyła dane, sprawdza stan i konfiguruje ten hardware. Niektóre adresy (np. vpm_wait_ld) umożliwiają realziację oczekiwania; odczyt takiego rejestru wstrzymuje procesor QPU wprowadzając go w stan stall stage potoku przetwarzania instrukcji. Oczekiwanie kończy się gdy odpowiadajacy moduł sprzętowy (np. transfer dma) zakończy swoją operację. Zapis do innych adresów może wyzwolić jakieś działanie hardware'u. Przykładowo zapis do tmu0_s spowoduje zatwierdzenie współrzędnych tekstury i przygotowanie do odczytania odpowiadajaćego teksela z (s,t) przez moduł Texture and Memory Lookup Unit .



Rys. 3. Architektura procesora QPU.

Rejestry QPU
Procesor QPU zawiera kilka akumulatorów i dwa duże zestawy rejestrów. Każdy z rejestrów (wliczając akumulatory) może przechowywać wektor elementów, więc jest dostosowany do wykonywania operacji SIMD. Są 4 akumulatory ogólnego przeznaczenia, które można swobodnie używać oraz 2 o specjalnej funkcji. W kazdym zestawie rejestrów jest ich 32. Zestawy te, jak i zawarte w nich rejestry są oznaczone literami a i b. Wszystkie rejestry z tych dwóch zestawów tworzą łącznie lokalną pamięć, właściwą dla każdego procesora QPU z osobna.


Rys. 4. Rejestry QPU.

Akumulatory i rejestry z zestawów różnia się:

  • długością ścieżki w potoku QPU, stąd wynik w akumulatorze jest dostępny już w następnej instrukcji,
  • elastycznością użycia w jednej instrukcji - są pewne ograniczenia w użyciu rejestrów z zestawów,
  • rotacja wektora może być tylko wykonywania na akumulatorach,
  • liczba akumulatorów jest niewielka.

Ze względu na swoje własności rejestry z zestawów dobrze nadają się na przechowywanie zmiennych oraz przeznaczonych do późniejszego użycia konfiguracji. Jednocześnie akumulatory powinny być często używane w obliczeniach, i gdy uzyskana będzie końcowa wartość należy ją zapisać w rejestrze z zestawu. Można powiedzieć, że akumulatory służą do przechowywania wyników pośrednich, podczas gdy rejestry z zestawów mają jakieś przypisane znaczenie (przez programistę) w trakcie działania programu (tak jak zmienne globalne w językach wysokiego poziomu).

Powiązane moduły sprzętowe (Closely Coupled Hardware)
Procesor QPU może kontrolować hardware który jest z nim powiązany (np.: Vertex Pipe Memory, DMA, Texture and Memory Lookup Unit, Special Functions Unit, etc.). Te moduły sprzętowe są dostępne poprzez przestrzeń adresową rejestrów z zestawów - adresy powyżej 31 są uzywane do tego celu. Z punktu widzenia programisty moduły zachowują się podobnie jak zwykłe rejestry, więc normalne instrukcje mogą wykonywac na nich operacje.



Rys. 5. Przestrzeń adresowa używana do dostępu do powiązanych modułów sprzętowych.

Instrukcje QPU
Procesor QPU posiada jednolity 64-bitowy format instrukcji (każda instrukcja ma tą samą dlugość). W prawdzie liczba typów instrukcji jest niewielka ale dzięki dużemu rozmiarowi pojedynczej instrukcji są one elastyczne. Są nastepujące typy instrukcji:

  • instrukcje ALU,
  • instrukcje ładowania
  • instrukcje skoków
  • instrukcje synchronizacji (semaphory)

Instrukcje kontrolują dwudrożne ALU, które może wykonywać dwie operacje jednocześnie. Jedna ścieżka ALU jest odpowiedzialna za operacje dodawania, a druga wykonuje mnożenia i rotację wektora.
Procesor posiada potok (instruction pipeline), który nie jest opróżniany gdy wykonuje skok, stąd w przykładowych programach można znaleźć dziwne sekwencje instrukcji. Po instrukcji skoku umieszczane są 3 dodatkowe, nieoczekiwane linie:

1	:entry
2		brr -, r:loop1
3		nop	   ; ldtmu0
4		mov r0, r4 ; ldtmu0
5		mov r1,r4

Oznacza to, że te trzy linie (3,4,5) bedą wykonane po skoku ale przed pierwaszą instrukcją, która jest umieszczona pod adresem docelowym skoku. Dzieje się tak, bo te trzy instrukcje pozostają już w potoku, gdy skok jest wykonywany.

Szczegóły instrukcji procesora QPU można znaleźć w dokumentacji producenta układu VideoCore IV 3D (zobacz (1) w sekcji linki poniżej). Warto przeczytać też Addendum (linki (2) poniżej) gdzie Marcel Muller, autor makroasemblera do videocore'a wyjaśnia pewne specyficzne cechy instrukcji, niezgodności i nieudokumentowane własności.

Główne ograniczenia instrukcji
W związku ze specyfiką architektury procesora QPU można zaobserwować poniższe ograniczenia:

  • wynik zapisany do rejestru z zestawu nie jest dostępny dla następnej instrukcji,
  • jedna instrukcja nie może używać więcej niż jednego rejestru z tego samego zestawu
  • mała stała nie może być używana razem z reejstrem z zestawu B
  • rotacja wektora musi być wykonywana na akumulatorze
  • akumulator na którym jest wykonywana rotacja nie może być zapisywany w poprzedniej instrukcji
  • formaty pakowane są obslugiwane tylko przez rejestry z zestawu A, oraz akumulator r4
  • procesor nie posiada stosu sprzętowego, do przechowywania adresu powrotu należy użyć wybranego rejestru z zestawu rejestrów A - odpowiednik link register w architekturze ARM
  • jeśli wyniki obu ścieżek ALU (add i mul) są zapisywane do zestawu rejestrów, muszą to być rejestry z różnych zestawów

Linki

[1] Broadcom VideoCore IV 3D, Architecture Reference Guide - dokumentacja producenta VideoCore
[2] Addendum to the Broadcom VideoCore IV documentation - dodatek Marcela Mullera do dokumentacji producenta
[3] Instrukcje VideoCore - opis wykonany przez Marcela Mullera