Elektroda.pl
Elektroda.pl
X
Computer ControlsComputer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AT91SAM7: ARM i THUMB - porównanie, MIPS-y - jak wycisnąć?

17 Maj 2007 18:45 2336 11
  • Poziom 28  
    Zauważyłem, że kompilując (Cross Works-em, na pokładzie chyba GCC, ale cienki jestem z programowania, więc mogę się mylić) program z opcją THUMB mam znacznie mniejszy rozmiar kodu wynikowego niż przy kompilowaniu z opcją ARM. Wiem też z TDS-ki, że instrukcje THUMB są połowę mniejsze. Zastanawia mnie zależność pomiędzy zestawem instrukcji a rozmiarem kodu wynikowego, szybkością wykonywania programu (wydajnością kodu).
    Który zestaw instrukcji należy kiedy stosować? Jakieś doświadczenia z większymi projektami?
    Dobrze myślę, że jak potrzebuję wydajności to ARM, a jak brakuje flash-a to przerzucić się na THUMB?

    Jeszcze jedna drobna sprawa - żeby nie smarować dwóch topiców ;-)
    Jak poustawiać rejestry, żeby taktować cały ten interes z prękością 55MHz? Kwarc mam na pokładzie 18,432MHz , dolożony PLL. Może daje się szybciej niż 55MHz? ;-) Próbowałem odpalić PLL-a, ale nie jestem pewien, co mi wychodziło, nie mam pomysłu jak "zmierzyć" ilość wyduszonych z procka MIPS-ów. ;-)
    Może ktoś to już próbował zrobić?

    pzdr
  • Computer ControlsComputer Controls
  • Poziom 31  
    kleki napisał:
    Zauważyłem, że kompilując (Cross Works-em, na pokładzie chyba GCC, ale cienki jestem z programowania, więc mogę się mylić)

    Raczej nie GCC, CrossWorks raczej napewno ma swoj kompilator.
    Cytat:

    Dobrze myślę, że jak potrzebuję wydajności to ARM, a jak brakuje flash-a to przerzucić się na THUMB?

    Dobrze.
  • Computer ControlsComputer Controls
  • Poziom 28  
    Rozumiem. Póki co jeszcze nic mi nie brakło (w życiu jeszcze nie miałem okazji zapchać 64kB flash ;-) - wszystko przede mną).

    A jak tu wygląda sprawa "wyciskania" prędkości?
    Masz może przypadkiem kawałek prg, który załącza najszybszy możliwy zegar? Próbowałem odpalić PLL, ale nie jestem pewien, jak to mi szybko latało. W porównaniu z SLCK o wieeeeeele szybciej. ;-)
    Który zegar jest uruchomiony domyślnie?

    pzdr
  • Poziom 19  
    fantom napisał:

    Raczej nie GCC, CrossWorks raczej napewno ma swoj kompilator.


    CrossWorks nie ma swojego kompilatora i bazuje na GCC.

    Co Thumba to zyskujesz około 30% na rozmiarze kodu. Ten sam kod skompilowany w trybie ARM będzie około 40% szybszy.
  • Poziom 28  
    Hehe, to znaczy że dobrze myślałem. :-)
    Gdzieś w help-ie były informacje o GCC, ale nie byłem pewien.
  • Poziom 21  
    Krisgorn napisał:
    Ten sam kod skompilowany w trybie ARM będzie około 40% szybszy.


    Niezupełnie, w jednoukładowcach podstawowym ograniczeniem jest dostęp do Flash(czas pobierania słowa). To powoduje że podkręcając taktowanie core i tak wstawiane są opóżnienia do pobierania słów rozkazów. W trybie ARM w tym samym czasie pobierzesz mniej rozkazów niż w trybie THUMB, ale te w trybie ARM są wykonywane szybciej niż THUMB (i masz do dyspozycji wiecej rejestrów) Ostatecznie, w jednoukładowcach przyrost prędkości nie jest aż taki ogromny.

    bis
  • Pomocny post
    Poziom 23  
    Przy kwarcu 18,432MHz żeby wycisnąć maksa z procka
    wprowadź następujące ustawienia:

    DIV=218
    MUL=1301

    co daje częstotliwość PLL-a 110MHz

    dalej ustawiasz dzielnik częstotliwości na 2 i masz 55MHz

    Dodano po 6 [minuty]:

    bis napisał:
    w jednoukładowcach przyrost prędkości nie jest aż taki ogromny.
    bis
    To prawda. Dużo zależy jeszcze od organizacji pamięci FLASH.
    Na plus zorganizowano to w układach LPC Philipsa, gdzie słowo danych ma 128 bitów.
  • Poziom 31  
    Krisgorn napisał:
    fantom napisał:

    Raczej nie GCC, CrossWorks raczej napewno ma swoj kompilator.


    CrossWorks nie ma swojego kompilatora i bazuje na GCC.

    Co Thumba to zyskujesz około 30% na rozmiarze kodu. Ten sam kod skompilowany w trybie ARM będzie około 40% szybszy.


    Faktycznie poszli na latwizne, to po kij to kupowac ? W takim razie powinni dostarczac kod zrodlowy, jesli tego nie robia to lamia prawo.
  • Poziom 19  
    bis napisał:
    Niezupełnie, w jednoukładowcach podstawowym ograniczeniem jest dostęp do Flash(czas pobierania słowa). To powoduje że podkręcając taktowanie core i tak wstawiane są opóżnienia do pobierania słów rozkazów. W trybie ARM w tym samym czasie pobierzesz mniej rozkazów niż w trybie THUMB, ale te w trybie ARM są wykonywane szybciej niż THUMB (i masz do dyspozycji wiecej rejestrów) Ostatecznie, w jednoukładowcach przyrost prędkości nie jest aż taki ogromny.
    bis


    Podane procenty znalazłem w jakiejś publikacji Hitexa.
    Oczywiście zgadzam się, że opóźnienie wynikające z dostępu do pamięci ma duże znaczenie.
    Nie rozumiem dlaczego w trybie ARM w tym samym czasie miałbym pobrać mniej rozkazów niż w trybie thumb?
    Na większą szybkość trybu ARM składa się jeszcze to, że niekiedy do realizacji danej fukcji należy wykonać większą ilość rozkazów w trybie Thumb. Przykładowo rozkazy arytmetyczne w trybie ARM posiadają trzy argumenty a w Thumb tylko 2. Dodatkowo wszystkie rozkazy w trybie ARM mogą być wykonane warunkowo a w trybie Thumb tylko rozkazy skoku.
  • Poziom 21  
    Krisgorn napisał:
    Nie rozumiem dlaczego w trybie ARM w tym samym czasie miałbym pobrać mniej rozkazów niż w trybie thumb?

    Core ARM nie jest bezpośrednio dołączone do pamięci. Pomiędzy pamięcią a core jest sterownik odpowiedniej magistrali (czasami kilka, osobne do różnych rodzajów pamięci i peryferiów wewnętrznych). Dzięki temu core może być taktowane innym zegarem niż np. pamięć a sterownik magistrali synchronizuje komunikację.

    Mały przykład: W NXP pamięć flash zwraca słowo 128 bitów (czyli 4x32 bity, czyli 4 rozkazy ARM lub 8 rozkazów THUMB). Ale efektywny czas pełnego cyklu jest 100 ns( tak dla uproszczenia rozważań, bo może być większy). Jeżeli core będzie działało z zegarem 60MHz to w czasie 100 ns będzie mogło potencjalnie wykonać 6 instrukcji ARM ale wykona tylko 4 bo tyle dostanie z pamięci, resztę czasu będzie czekać na następne instrukcje. Ale w trybie THUMB zawsze będzie miał co robić. Przyjmując podaną statystyczną efektywność instrukcji ARM i THUMB to zysk jest minimalny i bardzo problematyczny, a juz bardzo daleko mu do owych 40%. Ten efekt jest niezależny kolejkowania, potoków, czy szerokości słowa z pamięci Flash. Zawsze procek dostanie dwa razy więcej instrukcji trybu THUMB niż trybu ARM w tym samym czasie. Uwaga: nie można mylić minimalnego czasu dostępu do pamięci (od rozpoczęcia odczytu do uzyskania danych) z minimalnym czasem pełnego cyklu pamięci (od rozpoczęcia odczytu do rozpoczęcia nastepnego odczytu).

    Co innego gdy umieścimy kod trybu ARM w wewnętrznym RAM (z reguły ma ona krótsze czasy cyklu) wtedy można uzyskać większą różnicę realnej prędkości wykonywania kodu.

    Dlatego w ARM'ach serii 9 dodano wewnętrzne cash'e dla kodu i danych aby jakoś umożliwić przyspieszenie działania (ale statystyczne)

    Czyli: dla jednoukładowych ARM7 najwięcej MIPS'ów uzyskasz stosując kod trybu ARM wykonywany z RAM. Przy wykonywaniu kodu z pamięci Flash różnica w MIPS'ach pomiędzy kodem trybu ARM i THUMB jest znikoma.

    Krisgorn napisał:
    Na większą szybkość trybu ARM składa się jeszcze to, że niekiedy do realizacji danej fukcji należy wykonać większą ilość rozkazów w trybie Thumb. Przykładowo rozkazy arytmetyczne w trybie ARM posiadają trzy argumenty a w Thumb tylko 2. Dodatkowo wszystkie rozkazy w trybie ARM mogą być wykonane warunkowo a w trybie Thumb tylko rozkazy skoku.

    Pytanie dotyczyło MIPS'ów a nie jakości kodu. A wtedy bez sensu jest rozważanie możliwości listy instrukcji w każdym z trybów. Na wskażnik typu MIPS nie ma to żadnego wpływu.

    bis
  • Poziom 19  
    Cytat:
    W NXP pamięć flash zwraca słowo 128 bitów


    No i wszystko jasne.

    Cytat:
    Pytanie dotyczyło MIPS'ów a nie jakosci kodu. A wtedy bez sensu jest rozważanie możliwości listy instrukcji w każdym z trybów. na wskażnik typu MIPS nie ma to zadnego wpływu.


    Oczywiście zgadzam się w 100%. Pozwolę sobie zacytować autora tematu:

    Cytat:
    Zastanawia mnie zależność pomiędzy zestawem instrukcji a rozmiarem kodu wynikowego, szybkością wykonywania programu (wydajnością kodu).


    Ja skupiłem się na tym zagadanieniu. Z punktu widzenia wydajności kodu (jego szybkości) ograniczenia rozkazów thumb są istotne.
  • Poziom 28  
    Wszystkim dziękuję za informacje i opinie. Sporo jestem dzięki temu "do przodu".

    Pozdrawiam