eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Szukam benchmarków
Ilość wypowiedzi w tym wątku: 58

  • 41. Data: 2014-12-17 16:55:19
    Temat: Re: Szukam benchmarków
    Od: Borneq <b...@a...hidden.pl>

    W dniu 2014-12-17 o 14:24, g...@g...com pisze:
    > Poza tym, jezeli nie mialoby to wplywu na obserwowalne zachowanie programu,
    > to nie widze powodu, dla ktorego kompilator nie mialby w okreslonych
    > okolicznosciach zamieniac bubblesorta na qsorta (choc w tym kontekscie

    I programista nie mógłby porównać działania bubble sorta z quick sortem
    nie mówiąc że nie mógłby debugować bo źródła by się znacznie różniły od
    wyniku.
    Programowanie wyglądało by tak, że programista mówił by do mikrofonu:
    "kompilatorze, zrób mi gierkę, taką strzelankę first person perspective,
    wymyśl plan okolicy, po której będzie się chodzić"


  • 42. Data: 2014-12-17 16:56:50
    Temat: Re: Szukam benchmarków
    Od: firr <p...@g...com>

    teoretyczni juz dzis moglby tablicowac np

    float sin_(unsigned char x)
    {
    return sin((float)x / 255. * 2*PI);
    }

    ale chyba kompilatory nie robia takich kawalow


  • 43. Data: 2014-12-17 17:08:31
    Temat: Re: Szukam benchmarków
    Od: bartekltg <b...@g...com>

    On 17.12.2014 14:24, g...@g...com wrote:
    > W dniu środa, 17 grudnia 2014 03:01:18 UTC+1 użytkownik bartekltg napisał:
    >>> inicjalna wersja trwala jakies 100 czy nawet 150 ms ms a to glownie
    >>> dziki temu ze czas zarly dwa sinusy i pierwiastek na piksel jeszcze
    >>> z jakims dzieleniem i rzutowaniami (jak uzyjesz sinusa w kodzie to
    >>> program jest wydajnosciowym trupem tak bardzo sinus jest wolny) po
    >>> stablicowaniu sinusów i normalizacji i jeszcze ze dwu dniach
    >>> glowienia sie nad petla czas spadl do 20 i w koncu do 13 milisekund
    >>> 9prawie 10 razy szybciej niz normalny kod dla gcc) ciegle uwazalem ze
    >>> to za duzo i zaczalem przepisywac kod na kafelki gdzie mogelem zrobic
    >>> na kafelkach pewna interpolacje i pewne tam drobne rozroznienia, to
    >>> bylo troche trudne ale spowodowalo ze cza sspadl do 6-10 ms, 910-20
    >>> razy sszybciej "niz gcc",
    >>
    >> Zaraz, wkurzasz się, zę kompilator nie zmienił ci algoruytmu na inny?
    >> Znów odpływasz. Kompilator nie może zmienić bublesorta na qsorta.
    >> Zmieniłeś algorytm na szybszy, a mniej dokłądny, to masz
    >> przyszpieszenie, nie ma to nic wspolnego z jakością generowanego kodu.
    >
    > Jezeli dana procedura (taka jak np. liczenie sinusa) gwarantuje,
    > ze dla tego samego argumentu zawsze uzyskamy ten sam wynik, to nie
    > ma zadnego powodu, dla ktorego kompilator nie mialby sam tablicowac
    > wynikow. Nazywanie tego rodzaju optymalizacji "zmiana algorytmu"
    > wydaje sie jednak dosc pretensjonalne

    Żeby zmienił sposób liczenia algorytmu - nie ma problemu.
    Tak robi. Mi wszytko jedno, czy sin będzie policzony
    koprocesorem czy szeregiem pędzonym SSE.
    Natomiast zamiana na stablicowanie (nie w tym przypadku, tablica
    o gęstości precyzyjnej jak sin[x] z interpolacją
    liniową czy nawet kwadratową jest niepraktyczni duża ) powinna być
    świadomą decyzją programisty.
    Lepszym przykładem byłby dwumian newtona wielokrotnie liczony
    dla małych parametrów. Czasem trzymam sobie go w pamięci,
    ale czasem cache możę być znacznie przydatniejsze gdzie indziej,
    i te kilka pętli jest lepszym wyjściem.


    > Poza tym, jezeli nie mialoby to wplywu na obserwowalne zachowanie programu,
    > to nie widze powodu, dla ktorego kompilator nie mialby w okreslonych
    > okolicznosciach zamieniac bubblesorta na qsorta (choc w tym kontekscie
    > oczywiscie stwierdzenie "zamiana algorytmu" wydaje sie jak najbardziej
    > na miejscu).

    A skąd kompilator ma wiedzieć, co mam na myśli.
    To, że potrzebuję akurat stabilnego sortowania będzie w stanie wyłapać?
    Pamiętaj, że kompilator na zanalizować kod, a nie widzi intencje przez
    użycie sort czy stable_sort.
    A może zawsze ten algorytm sortuje jedynie malutkie tablice.
    Albo wstępnie posortowane (dla insertsorta).

    Kompilator musiałby zrozumieć nie tylko kod, ale i intencje
    piszącego, oraz to, czy jest baranem, czy taki a nie inny
    sposób przetwarzania danych wynika z jakiejś głębszej analizy.


    > Istnieja ciekawe metody dotyczace optymalizacji algorytmow,
    > opisane np. tutaj:
    > http://repository.readscheme.org/ftp/papers/topps/D-
    170.ps.gz

    Bardzo dokładnie się nie wczytałem, ale czy rozwiązywanie
    sporych NP zupełnych problemów grafowych podczas kompilacji
    nie jest chwilowo przesadą? ;-)

    >>> jeszcze kombinowalem z rugowaniem castow i
    >>
    >> To samo. Każesz kompialtorowi liczyć danymi zmiennymi, musi nimi
    >> liczyć.
    >
    > Nie bardzo rozumiem te uwage, ale znow: jezeli kompilator moze w jakims
    > kontekscie dokonac czesciowej ewaluacji, to nie ma istotnego powodu, dla
    > ktorego nie mialby tego robic

    Masz dwa programy. Jeden liczy coś intami, drugi na float.
    Wyniki _NIE_ bądą identyczne, poza przypadkami, gdzie obłożymi
    warunkami praktycznie wszystko.

    Oczywiście, że liczenie pewnyych rzeczy na raz, najlepiej w czasie
    kompilacji, po wyciągnieciu prez pętle jest przydatne. Nawet
    powszechnie mowimy kompilatorowi, by się IEEE za bardzo przy tym
    nie przejmował.

    Ale to nie jest to, o czym była tu mowa.

    pzdr
    bartekltg






  • 44. Data: 2014-12-17 17:15:59
    Temat: Re: Szukam benchmarków
    Od: bartekltg <b...@g...com>

    On 17.12.2014 15:27, M.M. wrote:
    > On Wednesday, December 17, 2014 2:24:57 PM UTC+1, g...@g...com wrote:
    >> Jezeli dana procedura (taka jak np. liczenie sinusa) gwarantuje,
    >> ze dla tego samego argumentu zawsze uzyskamy ten sam wynik
    > Wystarczy ze gwarantuje taką samą dokładność dla określonego zbioru
    > argumentów.
    >
    >
    > Swoją drogą, szkoda że w C++ nie można przy argumencie procedury
    > napisać, że dany argument będzie przyjmował wartości tylko z małego
    > zbioru. Wtedy kompilator miałbym lepsze możliwości optymalizacji.
    >
    >
    > np.
    > f( int x@{1:50%,0:20%,2:10%,other} ) {
    > return sin(x);
    > }
    >
    > Kompilator mógłby stablicować dla sin dla 1, 0 i 2, a że 1
    > przychodzi statystycznie w 50%, to mógłby 'górnym ifem' sprawdzać,
    > czy x==1.

    Nie, tablicowanie to inny sposób działania programu.
    Chcesz tablicowania, zrób to ręcznie (ile to, 10 linijak jak się
    rozpiszesz).

    >
    > if( x==1 ) return sin(1);
    > if( x==0 ) return sin(0);
    > if( x==2 ) return sin(2);
    > return sin(x);


    > Z kolei gdy się nie poda statystyki wystąpień, to kompilator mógłby
    > wziąć wartości z pgo.
    >
    > Dalej, gdy nie ma other, to w ogóle kompilator mógłby wygenerować
    > ultra zoptymalizowany kod:
    >
    > f( int x@{1:60%,0:40%} ) {
    > return x==1 ? sin(1) : sin(0);
    > }

    Kompilator musiałby mieć gwarancje, że innej liczby nie będzie.
    Przykładowe uruchomiania przy -fprofile-generate to za mało.
    A skoro wpisujesz to ręcznie, to możesz wpisać sam, jak powyżej.

    Kompilator ma wykonywać za programistę mechzniczne czynności,
    nie myśleć ;-)

    pzdr
    bartekltg




  • 45. Data: 2014-12-17 17:21:17
    Temat: Re: Szukam benchmarków
    Od: "M.M." <m...@g...com>

    On Wednesday, December 17, 2014 4:39:51 PM UTC+1, firr wrote:

    > jesli statycznie wiesz co to bezie to sam sobie mozesz
    > to napisac w dobrej kolejnosci zamiast troche szpecic zrodlo tymi
    > procentami;
    Można samemu. Ale kompilator moim zdaniem powinien sam wypróbować
    wiele wersji, a jeśli się opłaca, to powinien za programistę
    napisać.


    > jesli nie to lepiej jednak by kompilatr sobie sam ta statystyke
    > trzasnal
    Też myślę że lepiej jak kompilator zrobi sam statystykę.


    > (i tak jakos slabo wierze w skutecznosc tego rodzaju
    > optymizacji -
    W szachach taka technika optymalizacji dawała dużo. Poprawiało
    się jedna mała procedurę, a wielki program przyspieszał o nawet 3%.
    Jeśli się zadba o kolejność ifów w gorącym punkcie, to może
    przyspieszyć o 50%.


    > za to chyba zgodzilbym sie ze przydaloby sie definiowanie statycznych
    > okrojonych typow np float_od_0_do_1 albo int_od_0_do_100)
    W sumie wszystko to co napisałem powyżej, można sprowadzić do
    okrojonych typów. Też uważam, że ich brakuje.


    > I programista nie mógłby porównać działania bubble sorta z quick sortem
    > nie mówiąc że nie mógłby debugować bo źródła by się znacznie różniły od
    > wyniku.
    Powinna być opcja do wyłączenia tej techniki optymalizacji.

    > teoretyczni juz dzis moglby tablicowac np
    > float sin_(unsigned char x)
    Racja. Już dziś teoretycznie może na char, albo na enum.
    Też nie wiem, czy jakiś kompilator w praktyce robi takie coś.

    Pozdrawiam


  • 46. Data: 2014-12-17 17:25:55
    Temat: Re: Szukam benchmarków
    Od: "M.M." <m...@g...com>

    On Wednesday, December 17, 2014 5:16:01 PM UTC+1, bartekltg wrote:
    > Kompilator ma wykonywać za programistę mechzniczne czynności,
    > nie myśleć ;-)

    Nawet gdyby myślenie było jako opcja? :D

    Pozdrawiam


  • 47. Data: 2014-12-17 17:39:34
    Temat: Re: Szukam benchmarków
    Od: firr <p...@g...com>

    W dniu środa, 17 grudnia 2014 17:21:18 UTC+1 użytkownik M.M. napisał:
    > On Wednesday, December 17, 2014 4:39:51 PM UTC+1, firr wrote:
    >
    > > jesli statycznie wiesz co to bezie to sam sobie mozesz
    > > to napisac w dobrej kolejnosci zamiast troche szpecic zrodlo tymi
    > > procentami;
    > Można samemu. Ale kompilator moim zdaniem powinien sam wypróbować
    > wiele wersji, a jeśli się opłaca, to powinien za programistę
    > napisać.
    >
    >
    > > jesli nie to lepiej jednak by kompilatr sobie sam ta statystyke
    > > trzasnal
    > Też myślę że lepiej jak kompilator zrobi sam statystykę.
    >
    >
    > > (i tak jakos slabo wierze w skutecznosc tego rodzaju
    > > optymizacji -
    > W szachach taka technika optymalizacji dawała dużo. Poprawiało
    > się jedna mała procedurę, a wielki program przyspieszał o nawet 3%.
    > Jeśli się zadba o kolejność ifów w gorącym punkcie, to może
    > przyspieszyć o 50%.
    >
    >
    > > za to chyba zgodzilbym sie ze przydaloby sie definiowanie statycznych
    > > okrojonych typow np float_od_0_do_1 albo int_od_0_do_100)
    > W sumie wszystko to co napisałem powyżej, można sprowadzić do
    > okrojonych typów. Też uważam, że ich brakuje.
    >
    zgadza sie, odnioslem wrazenie ze w jakims sensie o tym mowa,, tylko jak mowie ja w
    ta kolejnosc ifow az tak bardzo nie wierze natomiast w to tablicowanie, jak
    najbardziej (zwlaszcza w swietle tych moich ostatnich wynikow z tablicowaniem)


  • 48. Data: 2014-12-17 17:55:05
    Temat: Re: Szukam benchmarków
    Od: "M.M." <m...@g...com>

    On Wednesday, December 17, 2014 5:39:35 PM UTC+1, firr wrote:
    > zgadza sie, odnioslem wrazenie ze w jakims sensie o tym mowa,, tylko jak mowie ja w
    ta kolejnosc ifow az tak bardzo nie wierze natomiast w to tablicowanie, jak
    najbardziej (zwlaszcza w swietle tych moich ostatnich wynikow z tablicowaniem)

    Zrozumiałem że nie wierzysz. Ja mierzyłem i widziałem, przynajmniej w
    przypadku kilku kompilatorów, kolejność ifów dawała przyspieszenie. Tablicowanie
    też stosowałem kilka razy, przyspieszenie raz było, raz nie, zależy co
    było tablicowane. Funkcje sin i exp są szybko liczone, nie wiem czy
    bym tak proste funkcje tablicował. Może...

    Pozdrawiam


  • 49. Data: 2014-12-17 18:47:52
    Temat: Re: Szukam benchmarków
    Od: firr <p...@g...com>

    W dniu środa, 17 grudnia 2014 17:55:06 UTC+1 użytkownik M.M. napisał:
    > On Wednesday, December 17, 2014 5:39:35 PM UTC+1, firr wrote:
    > > zgadza sie, odnioslem wrazenie ze w jakims sensie o tym mowa,, tylko jak mowie ja
    w ta kolejnosc ifow az tak bardzo nie wierze natomiast w to tablicowanie, jak
    najbardziej (zwlaszcza w swietle tych moich ostatnich wynikow z tablicowaniem)
    >
    > Zrozumiałem że nie wierzysz. Ja mierzyłem i widziałem, przynajmniej w
    > przypadku kilku kompilatorów, kolejność ifów dawała przyspieszenie. Tablicowanie
    > też stosowałem kilka razy, przyspieszenie raz było, raz nie, zależy co
    > było tablicowane. Funkcje sin i exp są szybko liczone, nie wiem czy
    > bym tak proste funkcje tablicował. Może...
    >
    no spoko, mozliwe ze ma znaczenie, kiedys tu pisalem znaleziona skad informacje ze o
    ile przewidziany skok kosztuje ok 1-2 ns to nietrafiony okolo 30 ns (juz troche nie
    pamietam ale cos w tym stylu)
    wierze w to o tyle mniej ze tu sytuacja zalezy od ukladu danych nie tylko od
    kolejnosci ifow, z tad by wynikalo ze
    nie tyle zalezy jak te ify zahardkodujesz tylko czy dane beda lecialy spojnymi
    blokami (ale to oczywicie troche wyidealizowana sytuacja i w praktyce pewnie zalezy
    od jednego i drugiego,

    co do wplywo ifów to nie wiem, jesli faktycznie nietrafiony if zajmuje 30 to
    bedzie zalezalo bo 30 to duzo, mw kosz sqrt - sqrt mozesz stablicowac i wtedy
    kosztuje ze 2 ns, z kolei jak nie stablicujesz to ze 30 (moze nawet costam wiecej juz
    nie pamietam ale cos w tym stylu) zawsze, ifow nie stablicujesz
    (chyba, costam probowac niby mozna ale nie robilem testow), za to mozesz eliminowac
    tymi dobrymi ukladami - kiedys posprawdzam [sinus jest za to zabojczy
    zalezy do jakiej libki linkujesz ja uzywam zdaje sie tego z msvcrt.dll i to jest
    sinusowe truchlo, cos slyszalem ze jakas wersja z gcc jest lepsza, tylko ze za bardzo
    nie wiem o czym mowa jak ja uzywam mingw i msvcrt.dll jest tu chyba jednyna opcją]


  • 50. Data: 2014-12-18 14:12:27
    Temat: Re: Szukam benchmarków
    Od: g...@g...com

    W dniu środa, 17 grudnia 2014 17:08:33 UTC+1 użytkownik bartekltg napisał:
    > > Jezeli dana procedura (taka jak np. liczenie sinusa) gwarantuje,
    > > ze dla tego samego argumentu zawsze uzyskamy ten sam wynik, to nie
    > > ma zadnego powodu, dla ktorego kompilator nie mialby sam tablicowac
    > > wynikow. Nazywanie tego rodzaju optymalizacji "zmiana algorytmu"
    > > wydaje sie jednak dosc pretensjonalne
    >
    > Żeby zmienił sposób liczenia algorytmu - nie ma problemu.
    > Tak robi. Mi wszytko jedno, czy sin będzie policzony
    > koprocesorem czy szeregiem pędzonym SSE.
    > Natomiast zamiana na stablicowanie (nie w tym przypadku, tablica
    > o gęstości precyzyjnej jak sin[x] z interpolacją
    > liniową czy nawet kwadratową jest niepraktyczni duża ) powinna być
    > świadomą decyzją programisty.
    > Lepszym przykładem byłby dwumian newtona wielokrotnie liczony
    > dla małych parametrów. Czasem trzymam sobie go w pamięci,
    > ale czasem cache możę być znacznie przydatniejsze gdzie indziej,
    > i te kilka pętli jest lepszym wyjściem.

    Tzn oczywiscie, jezeli zamiast liczyc wynik, dokonujemy interpolacji,
    to tego rodzaju optymalizacja wydaje sie niedopuszczalna, chyba ze
    programista dopusci ja explicite

    > > Poza tym, jezeli nie mialoby to wplywu na obserwowalne zachowanie programu,
    > > to nie widze powodu, dla ktorego kompilator nie mialby w okreslonych
    > > okolicznosciach zamieniac bubblesorta na qsorta (choc w tym kontekscie
    > > oczywiscie stwierdzenie "zamiana algorytmu" wydaje sie jak najbardziej
    > > na miejscu).
    >
    > A skąd kompilator ma wiedzieć, co mam na myśli.

    Kompilator moze wiedziec, jaka funkcje realizuje Twoja procedura,
    i jezeli zna wydajniejsza procedure realizujaca te sama funkcje,
    to moze ja zastapic

    > To, że potrzebuję akurat stabilnego sortowania będzie w stanie wyłapać?

    Jezeli Twoj algorytm sortuje stabilnie, to oczywiscie -- zeby procedura
    wygenerowana przez kompilator realizowala te sama funkcje -- algorytm
    wynikowy musialby rowniez sortowac stabilnie

    > Pamiętaj, że kompilator na zanalizować kod, a nie widzi intencje przez
    > użycie sort czy stable_sort.
    > A może zawsze ten algorytm sortuje jedynie malutkie tablice.
    > Albo wstępnie posortowane (dla insertsorta).

    Oczywiscie, zdarzaja sie przypadki graniczne, dla ktorych
    wydajnosc kodu zoptymalizowanego przez kompilator jest gorsza,
    niz wydajnosci kodu niezoptymalizowanego

    > Kompilator musiałby zrozumieć nie tylko kod, ale i intencje
    > piszącego, oraz to, czy jest baranem, czy taki a nie inny
    > sposób przetwarzania danych wynika z jakiejś głębszej analizy.

    Dla kompilatora nie ma roznicy pomiedzy kodem a intencja
    piszacego. (Oczywiscie z tego wzgledu jest lepiej, jezeli
    jezyk programowania umozliwia programiscie dokladne wyrazanie
    swoich intencji)

    > > Istnieja ciekawe metody dotyczace optymalizacji algorytmow,
    > > opisane np. tutaj:
    > > http://repository.readscheme.org/ftp/papers/topps/D-
    170.ps.gz
    >
    > Bardzo dokładnie się nie wczytałem, ale czy rozwiązywanie
    > sporych NP zupełnych problemów grafowych podczas kompilacji
    > nie jest chwilowo przesadą? ;-)

    To oczywiscie zalezy od sytuacji, ale czesto do rozwiazywania
    NP-trudnych problemow istnieja dobre heurystyki dzialajace
    wydajnie na typowych przypadkach

    > >>> jeszcze kombinowalem z rugowaniem castow i
    > >>
    > >> To samo. Każesz kompialtorowi liczyć danymi zmiennymi, musi nimi
    > >> liczyć.
    > >
    > > Nie bardzo rozumiem te uwage, ale znow: jezeli kompilator moze w jakims
    > > kontekscie dokonac czesciowej ewaluacji, to nie ma istotnego powodu, dla
    > > ktorego nie mialby tego robic
    >
    > Masz dwa programy. Jeden liczy coś intami, drugi na float.
    > Wyniki _NIE_ bądą identyczne, poza przypadkami, gdzie obłożymi
    > warunkami praktycznie wszystko.

    Wyglada na to, ze wyinterpretowales z wypowiedzi firra duzo wiecej
    niz ja :]
    Ja nie wiem, czy on dokonywal jakichs interpolacji na sinusach. Byc
    moze oryginalny algorytm byl napisany w taki sposob, ze sinusy byly
    brane tylko z pewnego dyskretnego rownomiernie rozlozonego podzbioru
    odcinka [0, 2pi) i bystry kompilator moglby teoretycznie to zauwazyc
    i stablicowac wartosci sinusa?

    Dalej firr rzeczywiscie pisal cos o interpolacjach -- i zgodze sie,
    ze tego rodzaju optymalizacja jest juz dla semantyki programu inwazyjna,
    ale z Twojej odpowiedzi wynikalo, ze zastapienie wywolan funkcji
    stablicowanymi wartosciami stanowi zmiane algorytmu. Oczywiscie mozna
    dzielic wlos na czworo i dowodzic, ze tak jest, ale moim zdaniem jest
    to jedna z prostszych nieinwazyjnych optymalizacj, jakie kompilator
    moglby przeprowadzac.

strony : 1 ... 4 . [ 5 ] . 6


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: