eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Automatic Reference Counting
Ilość wypowiedzi w tym wątku: 47

  • 41. Data: 2017-08-20 12:30:13
    Temat: Re: Automatic Reference Counting
    Od: "M.M." <m...@g...com>

    On Sunday, August 20, 2017 at 10:14:33 AM UTC+2, fir wrote:
    > odnosnie optymalizacji to moge jeszcze dodac cos bo widzialm gdzies
    > tu jak zwykle te niemal bezdennie glupie klasyczne pseudodyskusje
    > czy programista zoptymalizuje kod lepiej niz kompilator itd itd
    Dlaczego uważasz te rozmowy za głupie?



    > z tego jak ja to widze psrawa wyglada tak ze programista zoptymalizuje
    > kod lepiej problem jest jednak w czym innym - dzis - z tego jak to
    > mi sie jawi - kody sa memory-bound to nie asembler spowalnia kody
    > tylko memory-bandwidth, innymi slowy problem jest w tym ze nawet
    > 100-krotne zoptymalizowanie arytmetyki moze spowodowac na przyklad
    > powiedzmy jedynie 1% przyspieszenia -
    Generalnie masz rację. Ile razy przyspieszy 100-krotne zoptymalizowanie
    arytmetyki? To zależy od programu. Ja myślę, że przyspieszyłoby
    powiedzmy od 2 do 100 razy.

    > Zupelnie inaczej bylo kiedys kiedy to memory bound nie bylo
    > widoczne i wszystki liczylo sie predkoscią poszcegolnych instrukcji,
    > w danej sytuacji przyspieszenie asemblera 100 razy dawalo przyspeszenie
    > 100 razy... dzisiaj (jeli wywalic takie funkcja jak sin sqrt pow exp div)
    > kody sa glownie memory bound i dlatego przepisywania asma po prostu
    > niewiele daje -
    Można skrócić czas wykonania od np. 7% do 50%, zależy od przypadku.


    > jak robic optymalizacje tego memory bound?
    Ja np. zaimplementowałem tak drzewa czerwono-czarne, żeby wszystkie
    dane i meta-dane były w ciągłym obszarze pamięci. Można jeszcze
    spróbować tak, aby dane i meta dane trzymać w dwóch osobnych
    tablicach - ale ta technika w niektórych przypadkach zaszkodzi.
    Wracając, w wyszukiwaniu w drzewie ciągle jest skok pod
    (prawdopodobnie) losowy adres. W wyszukiwaniu binarnym w tablicy
    skok pod losowy adres jest tylko na początku:
    while( max - min > L ) {
    middle = (max - min)/2;
    [...]
    }
    while( min < max ) {
    [...]
    min ++ ;
    }


    > nie zajmowalem sie tym za duzo ale zdaje sie ze na przyklad unikanie
    > malych zmiennych posrednich niewiele przyspiesza (na szczescie - bo
    > rownoczesnie to zanczy ze mozna ich uywac tj uzywani ich niewiele
    > spowalnia) .. przepisywanie arytmetyki
    > jak wspomnialem w sumie sporo daje (mam tu na mysli przepisywanie i >
    > upraszcanie raczej na poziomie c a nie asma)
    Tak, na jedno wychodzi.

    > ale i tak sprawa rozbija sie o memory bound (memory bound jest dzisiaj
    > sciana i jesli mozesz zoptymalizowac asma to tylko DO tej sciany a nie
    > poza nia - dlatego przepisywanie w asmie nie daje tak jak kiedys
    > przyspieszen rzedu 10x 30x i
    Hmmm mi kiedyś dawało zazwyczaj 3x. Myślę, że przyczyną jednak było to, że
    kompilatory kiedyś były kiepskie.


    > dlateo wlasnie nie jest tak wazne jak kiedys) samego memory bound nie
    > wiem jak przyspieszyc byc moze sie nie da - podstawowe moemory bound
    > liczy sie po prostu wielkoscią inputu i wielkoscia outputu (w megabajtach)
    > t co ew mogloby to przyspieszyc to jakies skomplikowane algorytmy
    > selekcjonujace input i output
    Generalnie się zgadzam z Tobą, ale nie aż tak dosłownie. Przepisanie asma
    trochę też daje. Tyle że dziś kompilatory dobrze to robią.


    > -- ale to jest skomplikowane i zaciemnia algorytmy
    > tak ze ja osobiscie o to zbytnie nie dbam
    > jak zwykle na koniec warto wspomniec
    > zapewne opencl bo GPU maja mamory bandwidth np 10 razy wiekszy niz
    > procki tak ze jak ktos chce robic potezny flow przetwazania to
    > pewnie powinien si etego nauczyc ;c
    Na xeonphi jest fajnie, po prostu daje się
    #pragma omp parallel
    Niczego nie trzeba się uczyć i bangla. Ale na pewno podejście od bebechów
    przyspieszyłoby dużo więcej.



    > (ogolnie to napisalem wyzej to co wiem na ten temat, sam ostatnio
    > jednak zaczalem jak wspomnielem mniej interesowac sie optymalizacją -
    > choc ciagle interesuje mnie rev-engeenereeng /disasembling, vide
    > pisanie asemblera x86)

    Od kiedy znalazłem fragment kodu napisany przez kosmitów, też interesuję
    się wsteczną inżynierią ;-)

    Pozdrawiam


  • 42. Data: 2017-08-20 13:01:18
    Temat: Re: Automatic Reference Counting
    Od: fir <p...@g...com>

    W dniu niedziela, 20 sierpnia 2017 12:30:14 UTC+2 użytkownik M.M. napisał:
    > On Sunday, August 20, 2017 at 10:14:33 AM UTC+2, fir wrote:
    > > odnosnie optymalizacji to moge jeszcze dodac cos bo widzialm gdzies
    > > tu jak zwykle te niemal bezdennie glupie klasyczne pseudodyskusje
    > > czy programista zoptymalizuje kod lepiej niz kompilator itd itd
    > Dlaczego uważasz te rozmowy za głupie?
    >
    >

    dlatego ze ktos kto tak dyskutuje kompletnie nie rozumie problemu

    >
    > > z tego jak ja to widze psrawa wyglada tak ze programista zoptymalizuje
    > > kod lepiej problem jest jednak w czym innym - dzis - z tego jak to
    > > mi sie jawi - kody sa memory-bound to nie asembler spowalnia kody
    > > tylko memory-bandwidth, innymi slowy problem jest w tym ze nawet
    > > 100-krotne zoptymalizowanie arytmetyki moze spowodowac na przyklad
    > > powiedzmy jedynie 1% przyspieszenia -
    > Generalnie masz rację. Ile razy przyspieszy 100-krotne zoptymalizowanie
    > arytmetyki? To zależy od programu. Ja myślę, że przyspieszyłoby
    > powiedzmy od 2 do 100 razy.
    >

    raczej przyspieszy od 0 do 10 %
    wlasnie dlatego ze kod juz na starcie jest memory bound (dzis chyba trudna napisac az
    taki krap ktory bylby az tak bardzo cpu bound bys mogl go przyspieszyc 5 razy co tu
    mowic o 100x)

    kazdy kod ma swoja naturalna predkosc ktora rowna sie memory bandwidth i powiedzmy ze
    jest to 1 ms na 1 MB na rdzen (tak naprawde jest to troche wiecej, na kompach ktore
    testowalem bylo to do 10 razy wiecej, ale dla utrzymania uwagi mozna przyjac 1 ms na
    1 MB)

    poprawne napisany kod wstepnie zoptymalizowany w c bedzie bliski tego

    jelsi ta nieprzekraczalna granice uznasz za 100% to arytmatyka moze dodac nie wiem
    powiedzmy dodatkowe 30%
    i chocbys nie wiem co robic przepisywaniem asma zredukujesz tylko te 30% a 100%
    nieprzekraczalnej granicy nie ruszysz innymi slowy max co przyspieszysz nawet
    najlepszym recznym samem to 30% - i to nie dlatego dzis nie pisze sie za duzo w asmie
    ze kompilatory generuja tako dobry asm tylko wlasnie dlatego ze chocby najlepszy asm
    nie da za duzo

    (chyba ze kod jest totalnym crapem i nie jest memory bound ale takie kody
    rzadko sie widzi sa naprawde malo prawdopodobne)

    wiecej chyba nie che mi sie o tym gadac bo albo to rozumiesz albo nie (a ja
    powtarzajac w kolko to samo tylko tracilbym swoj czas czego wolalbym uniknac)

    (ps mozliwe ze kody ktore sa memory bound mozna dalej zoptymalizowac ale
    to raczej jakimis algorytmami w c
    ktore beda oszczedzac operacje na pamieci a nie przepisywaniem na asma,
    (mozliwe tez ze pewne szczegoly mi unikaja ale ogolna wizja memory-bound raczej jest
    prawdziwa)

    samo to przepisywanie kodow by unikaly przetwazania pamieci jest raczej co nieco
    nieprzyjemna i 'nadbudowana' optymalizacyjna algorytmiką i moim zdaniem niekoniecznie
    to trzeba robic bo kody robia sie od tego dluzsze i brzydsze a nie maja dodatkowej
    funkcjonalnosci wrecz nabieraja węższej ak ze jest to mocno specjalistyczna dzialka)






    > > Zupelnie inaczej bylo kiedys kiedy to memory bound nie bylo
    > > widoczne i wszystki liczylo sie predkoscią poszcegolnych instrukcji,
    > > w danej sytuacji przyspieszenie asemblera 100 razy dawalo przyspeszenie
    > > 100 razy... dzisiaj (jeli wywalic takie funkcja jak sin sqrt pow exp div)
    > > kody sa glownie memory bound i dlatego przepisywania asma po prostu
    > > niewiele daje -
    > Można skrócić czas wykonania od np. 7% do 50%, zależy od przypadku.
    >
    >
    > > jak robic optymalizacje tego memory bound?
    > Ja np. zaimplementowałem tak drzewa czerwono-czarne, żeby wszystkie
    > dane i meta-dane były w ciągłym obszarze pamięci. Można jeszcze
    > spróbować tak, aby dane i meta dane trzymać w dwóch osobnych
    > tablicach - ale ta technika w niektórych przypadkach zaszkodzi.
    > Wracając, w wyszukiwaniu w drzewie ciągle jest skok pod
    > (prawdopodobnie) losowy adres. W wyszukiwaniu binarnym w tablicy
    > skok pod losowy adres jest tylko na początku:
    > while( max - min > L ) {
    > middle = (max - min)/2;
    > [...]
    > }
    > while( min < max ) {
    > [...]
    > min ++ ;
    > }
    >
    >
    > > nie zajmowalem sie tym za duzo ale zdaje sie ze na przyklad unikanie
    > > malych zmiennych posrednich niewiele przyspiesza (na szczescie - bo
    > > rownoczesnie to zanczy ze mozna ich uywac tj uzywani ich niewiele
    > > spowalnia) .. przepisywanie arytmetyki
    > > jak wspomnialem w sumie sporo daje (mam tu na mysli przepisywanie i >
    > > upraszcanie raczej na poziomie c a nie asma)
    > Tak, na jedno wychodzi.
    >
    > > ale i tak sprawa rozbija sie o memory bound (memory bound jest dzisiaj
    > > sciana i jesli mozesz zoptymalizowac asma to tylko DO tej sciany a nie
    > > poza nia - dlatego przepisywanie w asmie nie daje tak jak kiedys
    > > przyspieszen rzedu 10x 30x i
    > Hmmm mi kiedyś dawało zazwyczaj 3x. Myślę, że przyczyną jednak było to, że
    > kompilatory kiedyś były kiepskie.
    >
    >
    > > dlateo wlasnie nie jest tak wazne jak kiedys) samego memory bound nie
    > > wiem jak przyspieszyc byc moze sie nie da - podstawowe moemory bound
    > > liczy sie po prostu wielkoscią inputu i wielkoscia outputu (w megabajtach)
    > > t co ew mogloby to przyspieszyc to jakies skomplikowane algorytmy
    > > selekcjonujace input i output
    > Generalnie się zgadzam z Tobą, ale nie aż tak dosłownie. Przepisanie asma
    > trochę też daje. Tyle że dziś kompilatory dobrze to robią.
    >
    >
    > > -- ale to jest skomplikowane i zaciemnia algorytmy
    > > tak ze ja osobiscie o to zbytnie nie dbam
    > > jak zwykle na koniec warto wspomniec
    > > zapewne opencl bo GPU maja mamory bandwidth np 10 razy wiekszy niz
    > > procki tak ze jak ktos chce robic potezny flow przetwazania to
    > > pewnie powinien si etego nauczyc ;c
    > Na xeonphi jest fajnie, po prostu daje się
    > #pragma omp parallel
    > Niczego nie trzeba się uczyć i bangla. Ale na pewno podejście od bebechów
    > przyspieszyłoby dużo więcej.
    >
    >
    >
    > > (ogolnie to napisalem wyzej to co wiem na ten temat, sam ostatnio
    > > jednak zaczalem jak wspomnielem mniej interesowac sie optymalizacją -
    > > choc ciagle interesuje mnie rev-engeenereeng /disasembling, vide
    > > pisanie asemblera x86)
    >
    > Od kiedy znalazłem fragment kodu napisany przez kosmitów, też interesuję
    > się wsteczną inżynierią ;-)
    >
    > Pozdrawiam


  • 43. Data: 2017-08-20 13:16:25
    Temat: Re: Automatic Reference Counting
    Od: fir <p...@g...com>

    z samego tego ze dzis kody so tak bardzo mamory-speed-bound i ze nie oplaca sie za
    bardzo optymalizowac asmanie wiem czy warto sie smucic czy cieszyc (kiedys juz o tym
    fakcie pisalem)

    pewnjie po prostu nalezy sie zmucis ze sa 'bound' i ze predkosc ramu jest jaka jest
    bo moglabybyc wieksza

    moim zdaniem jakby zwiekszyli predkosc ramu (np 20 razy) to predkosc programow by
    wzrosla blisko 20 razy (o ile mniej to by wlasnie znaczylo ze o tyle sa asm-bound)
    bez wiekszania liczby rdzeni i bez zwiekszania taktowania procesora


  • 44. Data: 2017-08-20 13:51:35
    Temat: Re: Automatic Reference Counting
    Od: "M.M." <m...@g...com>

    On Sunday, August 20, 2017 at 1:01:20 PM UTC+2, fir wrote:
    > dlatego ze ktos kto tak dyskutuje kompletnie nie rozumie problemu

    Niekoniecznie oznacza to, że ktoś kompletnie nie rozumie problemu.
    Może to oznaczać, że ktoś w pośpiechu, sformułował ciekawy problem
    właśnie przy pomocy takich słów.

    Zawsze szukamy jakiś idealnych odnośników. Programista ręcznie
    implementujący dany algorytm w języku assemblera jest odnośnikiem
    do najlepszej implementacji, bo dobry programista jak ma bardzo
    dużo czasu, to wykona najlepszą implementację. Potem do tej
    najlepszej porównujemy możliwości obecnych kompilatorów.

    Dla mnie to oznacza kolokwialne sformułowanie problemu, a nie
    totalne niezrozumienie.

    > [...]
    > wiecej chyba nie che mi sie o tym gadac bo albo to rozumiesz albo
    > nie (a ja powtarzajac w kolko to samo tylko tracilbym swoj czas
    > czego wolalbym uniknac)
    Generalnie zrozumiałem od początku. Problem jak zwykle siedzi w
    szczegółach. Zobacz jak nieprecyzyjne jest określenie "przyspieszenie
    CPU 100 razy". Co to jest CPU? Przyspieszamy tylko arytmetykę, czy
    także odczyty z rejestrów (rejestry to zdecydowanie część CPU, ale
    pamięć też), czy może także przyspieszamy cache L1, bo to chyba też
    integralna część CPU? Przyspieszony 100 razy CPU wraz z rejestrami i
    pamięcią cache, wykona dużo programów 30 razy szybciej.

    Pytanie, wnosi do naszej rozmowy przytoczenie 100 razy szybszego
    CPU, jeśli może być przyspieszony na N sposobów? Myślę że nic, tylko
    komplikuje sprawę. Dlatego w porównaniach często powołujemy się na
    teoretycznego programistę który napisał kod idealny - niestety z
    tym też jest problem, bo zazwyczaj nie mam kodu idealnego pod
    ręką. Hmmm my nie mamy, ale twórcy kompilatorów mogą mieć i to
    wiele prawie doskonałych kodów.

    Powiem w ten sposób. Gdy bez zastanowienia pisałem fragment kodu w
    asemblerze na nowsze procesory w czasach gdy kompilatory już
    powszechnie uchodziły za dopracowane, to mój kod działał np. o 20%-50%
    wolniej niż skompilowany z opcją -O1. Gdy był kompilowany z
    opcją -O3, w dodatku z informacjami z profilera, to mój był wolniejsz
    jeszcze może o 40%-80%. Przepustowość pamięci się nie zmieniała.
    Sposób korzystania z pamięci był taki sam, bo algorytmy za każdym
    razem te same. Wniosek dla mnie jest taki, że pisząc nawet
    przyzwoity kod w asemblerze można spowolnić wykonanie. Co by było
    gdyby kompilator porównać z kodem optymalnym - nie wiem, o to
    właściwie ja czasami dopytuję i nie uważam żeby moje pytania
    oznaczały totalnie niezrozumienie, co powyżej uzasadniłem.


    > samo to przepisywanie kodow by unikaly przetwazania pamieci jest raczej
    > co nieco nieprzyjemna i 'nadbudowana' optymalizacyjna algorytmiką i
    > moim zdaniem niekoniecznie to trzeba robic bo kody robia sie od tego
    > dluzsze i brzydsze a nie maja dodatkowej funkcjonalnosci wrecz
    > nabieraja węższej ak ze jest to mocno specjalistyczna dzialka)
    Tu się zgadzam, przykładem jest ATLAS. Koszmarek implementacyjny i
    zarazem dzieło sztuki implementacyjnej.

    Pozdrawiam


  • 45. Data: 2017-08-20 13:55:56
    Temat: Re: Automatic Reference Counting
    Od: bartekltg <b...@g...com>

    On Saturday, August 19, 2017 at 9:52:57 PM UTC+2, AK wrote:
    > Użytkownik "bartekltg" <b...@g...com> napisał:
    >
    > > Jeśli to jest drzewo, to w dół idzie unique_ptr, a w górę choćby goły
    > > wskaźnik. Ten goły zawsze jest ważny, bo obiekt w którym jest istnieje
    > > tylko, jesli obiekt nadrzędny istnieje.
    >
    > Nie goly wskaznik, tylko normalniej: weak_pointer

    Dlaczego?
    Weak pointer jest do sprawdzania, czy obiekt istnieje.
    A obiekt istenije na pewno.


    > PS: Najlepiej zapomniec o "zwyklych"/"golych"wskaznikach.
    > Doposzczalne winny byc jedynie w narzedziowce i to "on demand; (tak jak to
    zrobiono w C#)

    Bzdura.

    pzdr
    bartekltg


  • 46. Data: 2017-08-21 07:49:14
    Temat: Re: Automatic Reference Counting
    Od: Tomasz Kaczanowski <k...@p...onet.pl>

    W dniu 2017-08-19 o 23:17, fir pisze:
    > W dniu sobota, 19 sierpnia 2017 23:02:17 UTC+2 użytkownik M.M. napisał:
    >> On Saturday, August 19, 2017 at 9:52:57 PM UTC+2, AK wrote:
    >>> Użytkownik "bartekltg" <b...@g...com> napisał:
    >>>
    >>>> Jeśli to jest drzewo, to w dół idzie unique_ptr, a w górę choćby goły
    >>>> wskaźnik. Ten goły zawsze jest ważny, bo obiekt w którym jest istnieje
    >>>> tylko, jesli obiekt nadrzędny istnieje.
    >>>
    >>> Nie goly wskaznik, tylko normalniej: weak_pointer
    >>>
    >>> PS: Najlepiej zapomniec o "zwyklych"/"golych"wskaznikach.
    >>> Doposzczalne winny byc jedynie w narzedziowce i to "on demand; (tak jak to
    zrobiono w C#)
    >>>
    >>> AK
    >>
    >> Gdy wydajność nie jest istotna, to trzeba korzystać z wszelkich
    >> tego typu udogodnień.
    >> Pozdrawiam
    >
    > gdy wydajnosc jest istotna to nawet zwykle wskazniki nie sa wskazane imo
    >
    > (kiedys mierzylem ile wolniejszy jest kod gdy dzialasz na tablicy bedacej wynikiem
    malloka w stosunku do w pewlni statycznej - i na malloku bylo auwazalnie 10-20%
    wolniej
    >
    > no ale niewazne moze to byla specyficzne sytuacje, podaje jako anegdote, ostatnio
    az tak bardzo nie przejmuje sie wydajnoscią - nawet moge
    > powiedziec, kiedys stawialem chyba gdzies tu pytanie jak ktos zrobilby trzymanie
    zawartosci edytora tekstowego w programie w c i kombinowalem wtedy cos w kierunku
    trzymania listy litych kawalkow ramu po powiedzmy okolo 500 kb kazdy - dzis
    > raczej chyba zrobilbym przynajmniej na poczatek do testu tak ze kazda linijka w
    edytrze po prostu bylaby na odzielnym malloku (realokowany w miare
    > edycji itd)
    >

    Gdybyś się przyłożył bardziej do testów, zauważyłbyś, że jest to zależne
    od tego w jakim celu, jak dużą tablicę potrzebujesz. To jest narzędzie,
    tak samo jak młotek, czy wkrętak, jak będziesz młotkiem próbował wkręcać
    śrubki, a wkrętakiem wbijał gwoździe, to tez będzie raczej nieoptymalne...


    --
    http://kaczus.ppa.pl


  • 47. Data: 2017-08-21 12:23:38
    Temat: Re: Automatic Reference Counting
    Od: "M.M." <m...@g...com>

    On Monday, August 21, 2017 at 7:50:33 AM UTC+2, Tomasz Kaczanowski wrote:
    > Gdybyś się przyłożył bardziej do testów, zauważyłbyś, że jest to zależne
    > od tego w jakim celu, jak dużą tablicę potrzebujesz. To jest narzędzie,
    > tak samo jak młotek, czy wkrętak, jak będziesz młotkiem próbował wkręcać
    > śrubki, a wkrętakiem wbijał gwoździe, to tez będzie raczej nieoptymalne...

    Ja zrozumiałem, że chodzi nie o łączny koszt, lecz w ogóle o operacje na
    wskaźniku pochodzącym z malloc. Kiedyś też coś takiego zaobserwowałem, ale
    w innych programach to się nie potwierdzało.

    Pozdrawiam

strony : 1 ... 4 . [ 5 ]


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: