eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingrdtsc discovery › rdtsc discovery
  • X-Received: by 10.31.98.2 with SMTP id w2mr40715vkb.19.1503834827484; Sun, 27 Aug
    2017 04:53:47 -0700 (PDT)
    X-Received: by 10.31.98.2 with SMTP id w2mr40715vkb.19.1503834827484; Sun, 27 Aug
    2017 04:53:47 -0700 (PDT)
    Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit
    0.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.
    iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!e2no124
    0117qta.1!news-out.google.com!f21ni611qta.1!nntp.google.com!e2no1240113qta.1!po
    stnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
    Newsgroups: pl.comp.programming
    Date: Sun, 27 Aug 2017 04:53:47 -0700 (PDT)
    Complaints-To: g...@g...com
    Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=5.172.255.7;
    posting-account=Sb6m8goAAABbWsBL7gouk3bfLsuxwMgN
    NNTP-Posting-Host: 5.172.255.7
    User-Agent: G2/1.0
    MIME-Version: 1.0
    Message-ID: <5...@g...com>
    Subject: rdtsc discovery
    From: fir <p...@g...com>
    Injection-Date: Sun, 27 Aug 2017 11:53:47 +0000
    Content-Type: text/plain; charset="UTF-8"
    Lines: 113
    Xref: news-archive.icm.edu.pl pl.comp.programming:211355
    [ ukryj nagłówki ]

    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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

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: