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

Ilość cykli maszynowych dla mnożenia w C

bisz 07 Paź 2010 16:49 2248 11
  • #1 07 Paź 2010 16:49
    bisz
    Poziom 18  

    Witam.
    Szukałem już trochę, ale nie znalazłem...
    Czy ktoś orientuje się ile cykli maszynowych zajmuje mikrokontrolerom Avr wykonanie operacji mnożenia na zmiennych 8,16 i 32 bitowych?
    Mniemam, że dodawanie zajmuje pomijalnie mało?
    Mam sterownik, którego priorytetem jest wyrabianie się z pewną względnie dużą ilością obliczeń z częstotliwością dochodzącą do 100Hz i chciałbym jakoś to oszacować czy mikrokontroler się 'wyrobi'?

    0 11
  • #2 07 Paź 2010 18:11
    kubus_puchatek
    Poziom 17  

    Wszystko zależy od tego czy jest sprzętowy rozkaz mnożenia czy nie.
    jeśli jest sprzętowy rozkaz to mnożenie 8x8 to jest bodajże dwa cyknięcia zegara.

    mnożenie 16x16 to 4 mnożenia 8x8 + sumowanie wyników mnożeń

    podobnie jest z 32x32 to jest 16 mnożeń + sumowanie tych wyników

    0
  • #3 07 Paź 2010 18:29
    bisz
    Poziom 18  

    w przypadku programowania w C od czego to zależy czy jest sprzętowy czy nie ?

    0
  • #4 07 Paź 2010 18:42
    tmf
    Moderator Mikrokontrolery Projektowanie

    Od rdzenia AVR, czy obsługuje rozkaz maszynowy MUL czy nie. Z drugiej strony pisząc w języku C nie za bardzo ma sens zastanawianie się co ile cykli zajmuje - to jak program będzie skompilowany zależy od kompilatora, jego wersji i przede wszystkim opcji kompilacji. Także sprecyzuj pytanie.

    0
  • #6 08 Paź 2010 09:02
    tmf
    Moderator Mikrokontrolery Projektowanie

    gaskoin - link, który pokazałeś jest świetnym przykładem na to co napisałem wcześniej - pytanie w takiej postaci nie ma sensu. Po pierwsze podane wyliczenia są dla programów napisanych w asemblerze, które mają się nijak do C, gdyż C ma swoje biblioteki. Po drugie ten pdf odnosi się do starych architektur, które nie mają instrukcji MUL i pochodnych.Biorąc pod uwagę, że np. u nich mnożenie 8x8 do 58 cykli, a na rdzeniu z obsługą sprzętową mnożenia to zaledwie 2 cykle to wnioski jakie można wyciągnąć z tego pdfa można sobie wsadzić głęboko w ....

    0
  • #7 08 Paź 2010 12:55
    sedr
    Poziom 17  

    Wystarczy zrobić disasemblacje programu i będziesz wiedział ile cykli zajmuje.

    0
  • #8 08 Paź 2010 13:04
    mirekk36
    Poziom 42  

    tmf napisał:
    Z drugiej strony pisząc w języku C nie za bardzo ma sens zastanawianie się co ile cykli zajmuje ...


    Co za brednie!

    tmf napisał:
    ... to wnioski jakie można wyciągnąć z tego pdfa można sobie wsadzić głęboko w ....


    Raczej twoje wypowiedzi można sobie wsadzić głęboko w d...., bo jak to często bywa, są bez sensu. Autor dostał wszystko czego chciał. Z jednej strony dowiedział się że część procków ma polecenie mul i ile ono cykli zajmuje i jak na to się patrzy przy mnożeniu różnych liczb a z drugiej dostał dokładnego PDF'a, który obrazuje co do taktu obliczenia bez użycia mul, czyli implementacje w prockach, które nie posiadają mul.

    A dużo ma to wspólnego z C, bo nie jest żadnym problemem zrobić sobie wstawkę w asm szczególnie na tego typu własne obliczenia jeśli ktoś potrafi zorganizować to w sposób bardziej optymalny niż kompilator C.

    W samym C wystarczy sobie napisać funkcję, która np będzie mnożyła np liczby 16bitowe i zwracała wynik. Wystarczy podejrzeć jej kod w asemblerze po kompilacji i wszystko stanie się jasne, ile cykli (dla danego procesora oczywiście i przy włączonej optymalizacji -os) ... dla tych które mają mul będzie ono wykorzystane a dla tych które nie mają to będą mniej więcej takie procedury opisane w pdf przedstawionym powyżej. (Chba że się je samemu na wstawkę asm napisze). Po tym wszystkim będziesz mógł panie autor oszacować sobie czas o jaki pytasz

    0
  • #9 08 Paź 2010 13:10
    gaskoin
    Poziom 38  

    tmf napisał:
    Z drugiej strony pisząc w języku C nie za bardzo ma sens zastanawianie się co ile cykli zajmuje - to jak program będzie skompilowany zależy od kompilatora, jego wersji i przede wszystkim opcji kompilacji


    To akurat Mirku jest prawda. Chyba nie przeczytałeś reszty zdania. Przy włączonej optymalizacji mnożenie x*15 i x*16 będą się różnie wykonywały... Autor zadał pytanie dość ogólnie, nie było w nim żadnych szczegółów i nie da się jednoznacznie powiedzieć ile czasu zajmie przemnożenie 2 liczb 8 bitowych

    0
  • #10 08 Paź 2010 13:24
    tmf
    Moderator Mikrokontrolery Projektowanie

    mirekk36 - ja cię proszę, zanim zaczniesz wypowiadać się na temat C doucz się trochę, bo to wstyd, żeby takie brednie pisała osoba, która innym oferuje płatne kursy. Jeśli dla ciebie opcje optymalizacji ograniczają się do znajomości -Os to współczuję. Kod wygenerowany przez kompilator dla zwykłego mnożenia to może być wszystko pomiędzy 1 a kilkaset instrukcji, w dodatku nie będzie to miało wiele wspólnego z obsługą sprzętową mnożenia. A jak ktoś potrzebuje optymalny kod to albo pisze w assemblerze, albo odpala profilera (mirku, wiesz co to takiego?) żeby sprawdzić gdzie ma wąskie gardła. Próby optymalizacji w sytuacji, kiedy nie wiadomo nawet czy taka optymalizacja jest potrzebna to częsty błąd początkujących, w efekcie tracą czas na nieistotne detale, a projekt nigdy nie jest kończony.

    0
  • #11 08 Paź 2010 14:02
    mirekk36
    Poziom 42  

    bisz napisał:
    chciałbym jakoś to oszacować czy mikrokontroler się 'wyrobi'.


    Jeśli gaskoin i tmf nie potrficie czytać i nie rozumiecie co znaczy że ktoś coś chce "jakoś oszacować" to współczuję.

    A ty tmf doucz się kultury osobistej bo ci jej brakuje na potęgę. A swoje durne wywody o płatnych kursach i niedouczeniu czy profilerach wsadź sobie wiesz w co .... mówię tak żebyś zrozumiał bo tylko takim prostackim językiem potrafisz się komunikować z otoczeniem. Ja nie będę na te tematy z tobą polemizował ;) chyba że kiedyś dorośniesz.

    0
  • #12 08 Paź 2010 14:12
    _Robak_
    Poziom 33  

    I basta. Jeśli autor zapragnie otworzę temat.

    Otwieram na prośbę autora.

    0