Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 21 mar 2026, o 05:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 4 mar 2016, o 10:58 
Offline
Nowy

Dołączył(a): 19 sty 2016
Posty: 8
Pomógł: 0

Cześć, pytanie na które nie spodziewam się uzyskać konkretnej odpowiedzi, lecz warto spróbować.
Kod (dla attiny13) skompilowany na:
- kompie z linux mint 13 na gcc 4.5.3 ma 1024 bajty (bin)
- ten sam kod skopiowany na kompa z linux mint 17.3 z gcc 4.8.2 ma 1070 bajtów (bin)

Oczywiście niczego nie zmieniam (poza kompami).
I teraz się zastanawiam, czy na innym kompie mam szukać jakiś ustawień zdefiniowanych gdzieś na dysku (jakieś niejawne opcje kompilatora), czy jest jakaś uznana (za porządną) wersja (która?) avr-gcc - która generuje solidny kod, czy to zwyczajnie efekt rozwijania gcc (a może raczej bibliotek avr-libc?) i dodawania/poprawiania kodu?

Różnica jest spora, prawie 50 bajtów. Kod i tak przystrzygłem jak tylko mogłem i musiałem wyrzucić kilka funkcjonalności - no ale, nie o kod tu właściwie chodzi a znaczą różnicę w wyniku (mogę analizować dumpy ASM, ale nawet ten 1K to sporo pracy jest i być może nic nie osiągnę).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2016, o 11:40 
Offline
Nowy

Dołączył(a): 19 sty 2016
Posty: 8
Pomógł: 0

Bo nie zmieniam (sensu w kodzie i wywołaniu kompilatorów -wołam je z pliku bash - nie przez make), a to co się zmienia wymieniłem przecież: gcc, linux. Niejawne - czyli podawane np. przez zmienne środowiskowe i jakieś .cfg - których nie znam (i pytam).
Jakie .lss, jakie eclipse .. :) ja to piszę w Midnight Commander (mcedit) - jestem "starej daty" - myszki przy pisaniu kodu doprowadzają mnie do szału.
a diff mi nic nie daje, sekcje są poprzemieszczane i trochę inny kod wygenerowany.

Ale już chyba wiem, to OPTYMALIZATOR (-Os) mi się wchrzania, mam mnożenie przez dodawanie - prościutka pętelka, wykorzystałem ją jednak tylko raz (x*3) a optymalizator na gcc 4.8.2 "na chama" generuje mi ASM "uniwersalnego" mnożenia "__mulhi3", które wg. tamtej pętelki jest 2,3x większe.
Zresztą na gcc 4.5 też z tą pętlą zrobił jakieś cyrki (ale mniejsze), za to do dzielenia w pętli się nie przyczepił.
A ja właśnie napisałem te funkcje by zaoszczędzić te kilka bajtów - a "ON" mi na złość tam robi problemy.

Pytanie, jak w C zaznaczyć by optymalizator nie optymalizował tej funkcyjki? Mogę ostatecznie napisać ją w ASM i zlinkować, i tak zrobię jak się nie odczepi od niej :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2016, o 14:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

To jest proste.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Można też użyć volatile - podobny efekt, ale dla konkretnej zmiennej lub funkcji.

Tu masz komplet informacji o możliwych rodzajami optymalizacji:

https://gcc.gnu.org/onlinedocs/gcc/Opti ... tions.html

Hard core :D

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2016, o 15:40 
Offline
Nowy

Dołączył(a): 19 sty 2016
Posty: 8
Pomógł: 0

To wszystko mam, i wołany "goły gcc" ;), prócz "-S" to się przydało (dzięki!), nie mnożenie (zmyliło mnie "__mulhi8" -te ~mull) a dzielenie było problemem.
uint8_t trivdiv( uint16_t dzielna, uint8_t dzielnik) {..}
gdy wołałem to tak: x8t = trivdiv( dzielna16t, dzielnikt8t) - kompilator wołał "moją" funkcję
gdy wołałem to: x8t = trivdiv( dzielna8t, dzielnik8t) - kompilator wytworzył do tego jednego inny/oddzielny i spory kod.

OK, zastąpiłem mnożenia przez przesunięcia np. (*3) "x<<1 + x",
poprawiłem trochę kod i teraz mam "wsad" 1006 bajtów - he, zaszaleję, może wcisnę jeszcze jaką funkcjonalność :).

@sq5rix volatile nie działało (próbowałem, a niech tam), dla zmiennej to oczywiście działa

dzięki
ps.edit, dla jasności
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 4 mar 2016, o 15:46 przez kenubi, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2016, o 15:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Napisałem, że hardcore :D

To normalne. Powody są takie:
albo masz _delay_ms() - wtedy się wywala, no bo jak?

Masz wtedy taki warning:

Składnia: [ Pobierz ] [ Ukryj ]
język bash
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


albo nie włożyłeś funkcji z kodem do osobnego pliku :)

Można też użyć zamiast
Składnia: [ Pobierz ] [ Ukryj ]
język bash
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


dać

Składnia: [ Pobierz ] [ Ukryj ]
język bash
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Działa, nawet jeśli jest wszystko w jednym pliku

Jest też zależność od flagi -fwhole-program - ona najczęściej jest z defaultu, ale tego nie ćwiczyłem - myślę że to dlatego trzeba dać w osobnym pliku...

volatile działa tylko dla zmiennych, ale zauważyłem że czasem pomaga...

Generalnie to ja w życiu nie kombinuję z optymalizacją :D

------------------------ [ Dodano po: 34 minutach ]

Zalączam projekcik (rozgrzebany, ale się kompiluje i działa) z optymalizacją
Biblioteka może ugryźć, lojalnie uprzedzam :D

A kurczę o najważniejszym zapomniałem. Jak chcesz jedną funkcję "zdeoptymalizować" można jeszcze tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO