eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › rdtsc discovery
Ilość wypowiedzi w tym wątku: 5

  • 1. Data: 2017-08-27 13:53:47
    Temat: rdtsc discovery
    Od: fir <p...@g...com>

    ostatnio odkrylam jak tak naprawde zaskakujaco latwo jest robic testy
    na rdtsc (wewnetrznym liczniku cykli w procesorach, zdaje sie obecnym od pentium 1 w
    gore) z poziomu c

    - jako ze ta grupa zawsze podchwytywala dosyc sensownie temat optymalizacji, postuje
    przykladowy kod, jakby co to jeszcze w przyszlosci pomierzy sie pare kawalkow i
    powyciaga wnisoski czy jak to nazwac

    baza


    void GetRdtsc(unsigned* high, unsigned* low)
    {
    __asm__ volatile("rdtsc" : "=a" (*low), "=d" (*high) );
    return;
    }

    to podaje aktualny stan zliczonych cykli (podwojne wywoalnie bez niczego 'w srodku'
    i policznie roznicy u mie daje 70 lub 63 cykle)

    mozna opakowac to w rozmaite wraperry ja na szybko skrobnalem


    void rdtsc_test(char* test_description, void (*tested_function)() )
    {
    unsigned high_before,
    low_before,
    high_after,
    low_after;

    GetRdtsc(&high_before, &low_before);

    tested_function();

    GetRdtsc(&high_after, &low_after);


    long long unsigned cycles_passed =
    (((long long unsigned)(high_after-high_before))<<32) +
    (low_after-low_before);

    printf(test_description);
    printf("\n %I64u cycles passed", cycles_passed);
    printf(" ( %I64u mlns )", cycles_passed/1000/1000);

    }


    i przykladowa 'suita' testow



    double x;

    void foo_sin()
    {
    for(int i=0; i<1000*1000; i++)
    {
    x = sin((double)i);
    }

    }

    void foo_sqrt()
    {
    for(int i=0; i<1000*1000; i++)
    {
    x = sqrt((double)i);
    }

    }

    void foo_add()
    {
    for(int i=0; i<1000*1000; i++)
    {
    x += i;
    }

    }
    void foo_div()
    {
    for(int i=0; i<1000*1000; i++)
    {
    x /= i;
    }

    }


    int main()
    {

    rdtsc_test("\n 1mln sin testing", foo_sin);
    rdtsc_test("\n 1mln sqrt testing", foo_sqrt);
    rdtsc_test("\n 1mln add testing", foo_add);
    rdtsc_test("\n 1mln div testing", foo_div);

    return 0;
    }


    wyniki:


    1mln sin testing
    95116665 cycles passed ( 95 mlns )
    1mln sqrt testing
    57014027 cycles passed ( 57 mlns )
    1mln add testing
    1001189 cycles passed ( 1 mlns )
    1mln div testing
    6001233 cycles passed ( 6 mlns )



    HAVE FUN


  • 2. Data: 2017-08-27 14:30:03
    Temat: Re: rdtsc discovery
    Od: fir <p...@g...com>

    W dniu niedziela, 27 sierpnia 2017 13:53:48 UTC+2 użytkownik fir napisał:
    >
    > long long unsigned cycles_passed =
    > (((long long unsigned)(high_after-high_before))<<32) +
    > (low_after-low_before);

    tutaj jest chyba blad, powinno byc zdaje sie


    long long unsigned cycles_passed =
    (((long long unsigned)(high_after-high_before))<<32) +
    ((long long int)low_after-low_before);

    >
    >
    > HAVE FUN


  • 3. Data: 2017-08-28 01:51:29
    Temat: Re: rdtsc discovery
    Od: "M.M." <m...@g...com>

    On Sunday, August 27, 2017 at 1:53:48 PM UTC+2, fir wrote:
    > ostatnio odkrylam jak tak naprawde zaskakujaco latwo jest robic testy
    > na rdtsc (wewnetrznym liczniku cykli w procesorach, zdaje sie obecnym od pentium 1
    w gore) z poziomu c
    >
    > - jako ze ta grupa zawsze podchwytywala dosyc sensownie temat optymalizacji,
    postuje przykladowy kod, jakby co to jeszcze w przyszlosci pomierzy sie pare kawalkow
    i powyciaga wnisoski czy jak to nazwac
    >
    > baza
    >
    >
    > void GetRdtsc(unsigned* high, unsigned* low)

    Tam jest też przykład, chyba taki sam jak Twój:
    https://stackoverflow.com/questions/13772567/get-cpu
    -cycle-count

    Pozdrawiam


  • 4. Data: 2017-08-28 01:55:02
    Temat: Re: rdtsc discovery
    Od: "M.M." <m...@g...com>

    On Monday, August 28, 2017 at 1:51:31 AM UTC+2, M.M. wrote:
    > On Sunday, August 27, 2017 at 1:53:48 PM UTC+2, fir wrote:
    > > ostatnio odkrylam jak tak naprawde zaskakujaco latwo jest robic testy
    > > na rdtsc (wewnetrznym liczniku cykli w procesorach, zdaje sie obecnym od pentium
    1 w gore) z poziomu c
    > >
    > > - jako ze ta grupa zawsze podchwytywala dosyc sensownie temat optymalizacji,
    postuje przykladowy kod, jakby co to jeszcze w przyszlosci pomierzy sie pare kawalkow
    i powyciaga wnisoski czy jak to nazwac
    > >
    > > baza
    > >
    > >
    > > void GetRdtsc(unsigned* high, unsigned* low)
    >
    > Tam jest też przykład, chyba taki sam jak Twój:
    > https://stackoverflow.com/questions/13772567/get-cpu
    -cycle-count
    >
    > Pozdrawiam

    A tam działające na wielu platformach:
    http://www.fftw.org/cycle.h

    Pozdrawiam


  • 5. Data: 2017-08-28 12:48:05
    Temat: Re: rdtsc discovery
    Od: g...@s...invalid (Adam Wysocki)

    fir <p...@g...com> wrote:

    > ostatnio odkrylam jak tak naprawde zaskakujaco latwo jest robic testy na
    > rdtsc (wewnetrznym liczniku cykli w procesorach, zdaje sie obecnym od
    > pentium 1 w gore) z poziomu c

    To jeszcze odkryj istnienie out-of-order execution, schedulera i SMP.

    --
    [ Email: a@b a=grp b=chmurka.net ]
    [ Web: http://www.chmurka.net/ ]

strony : [ 1 ]


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: