Wpis z mikrobloga

#asembler #cpp #jezykc #programowanie Takie pytanko, czy jeśli nie zależy mi na pamięci, to jest sens używania np. 8 bitowych char i 16 bitowych shortów? czy używać tylko 32 bitowych intów, bo i tak reszta rejestru musi zostać uzupełniona zerami czy coś.. a jak jest int to zajmuje cały 32 bitowy rejestr wiec powinno być szybicej bo nie trzeba nic uzupełniać.... mówimy oczywiście o systemach i kompilacjach 32 bitowych.. chyba, że kompilator jest na tyle mądry że jak widzi że ma dwie zmienne lokalne lub parametry po 16 bitów to je jakos upchnie w jednym 32 rejestrze? jak to wygląda??
  • 11
@ZawzietyRobaczek: Po pierwsze rejestry raczej nie wiele mają wspólnego z memory footprint. Lista rejestrów dostępnych w CPU jest zawsze taka sama, niezależnie od typu zmiennych, jakich używasz ( ͡° ͜ʖ ͡°) To powiedziawszy, typ zmiennej może mieć wpływ na performance. Szczegóły zależą pewnie od CPU, ale zwykle jeśl masz 32-bitowy CPU, najwydajniesze będą operacje na 32-bitowych zmiennych.
Jeśli chcesz zmiejszyć memory footprint, zainteresuj się paddingiem w używanych
@ZawzietyRobaczek: To czy to ma znaczenie, zależy od tego czy algorytm, który optymalizujesz jest CPU bound czy memory bound, to znaczy co nie wyrabia, pamięć czy ilość cykli.
Tak jak ktoś powiedział. Lokalne zmienne nie mają znaczenia dla pamięci, bo kompilator i tak wykorzysta dużo szersze rejestry a może nawet i skorzystać z olbrzymich rejestrów SSE, żeby więcej można było ugrać na ilości wykonywanych instrukcjii. Oczywiście możesz sobie porównywać poszczególne implementacje
czy jeśli nie zależy mi na pamięci, to jest sens używania np. 8 bitowych char i 16 bitowych shortów?


@ZawzietyRobaczek: Jeśli piszesz program, który dodaje dwie liczby i wypluwa wynik, to raczej nie ma potrzeby, żeby używać te typy. Jeśli implementujesz protokół komunikacyjny z serializacją danych, to nie masz wyboru. Rozmiar typów prostych nie ma znaczenia dla wydajności dostępu do pamięci. Ale jeśli operujesz na strukturach, to należy zadbać o alignment
@ZawzietyRobaczek: rożnie może być: czasami szybciej, czasami nie. Jak zmienna jest lokalna to kompilator powinien ogarnąć. Jak kompilujesz funkcję, które jest wołana z innej jednostki kompilacji albo używasz np. tablicy o nieznanym rozmiarze, to oczywiście ma to znaczenie. Tak czy owak zmiana rozmiaru zmiennej to raczej optymalizacja niskopoziomowa tzn. jeśli nie masz super zoptymalizowanej aplikacji to prawdopodobnie masz wiele innych miejsc do optymalizacji.

Z podobnych obszarów to kiedyś udało mi się
@ZawzietyRobaczek: Zależy od typu operacji, ale czasami autowektoryzacja może uderzyć i wtedy na mniejszych typach powinno być szybciej (bo więcej danych przetwarzasz na raz, w rejestrze 128 bitowym zmieścisz 32x4, ale 64x2).
@ZawzietyRobaczek:
1. Czy jest sens używania shorta zamiast inta?
Jeśli wiesz że zmiescisz się w zakresie shorta i wiesz że na twojej platformie jest on rzeczywiście mniejszy niż int bo standard wcale tego nie gwarantuje, to wtedy użycie shorta ma sens gdy:
- chcesz zwiększyć lokalność pamięci, by dane były bardziej cache friedly/zmieściło się ich więcej na jednej stronie - ale to robisz na podstawie profilowania a nie ślepego strzału