eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingno to ile czasu matlab mnozy te duze macierze? › no to ile czasu matlab mnozy te duze macierze?
  • Path: news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.task.gda
    .pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!e37g2000yqn.goog
    legroups.com!not-for-mail
    From: Mariusz Marszałkowski <m...@g...com>
    Newsgroups: pl.comp.programming
    Subject: no to ile czasu matlab mnozy te duze macierze?
    Date: Fri, 22 Jan 2010 17:28:58 -0800 (PST)
    Organization: http://groups.google.com
    Lines: 124
    Message-ID: <8...@e...googlegroups.com>
    NNTP-Posting-Host: 89.229.16.190
    Mime-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-1
    X-Trace: posting.google.com 1264210139 31072 127.0.0.1 (23 Jan 2010 01:28:59 GMT)
    X-Complaints-To: g...@g...com
    NNTP-Posting-Date: Sat, 23 Jan 2010 01:28:59 +0000 (UTC)
    Complaints-To: g...@g...com
    Injection-Info: e37g2000yqn.googlegroups.com; posting-host=89.229.16.190;
    posting-account=xjvq9QoAAAATMPC2X3btlHd_LkaJo_rj
    User-Agent: G2/1.0
    X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1.7)
    Gecko/20091221 Firefox/3.5.7 (.NET CLR
    3.5.30729),gzip(gfe),gzip(gfe)
    Xref: news-archive.icm.edu.pl pl.comp.programming:184572
    [ ukryj nagłówki ]

    Witam

    Mam kod w C/C++. Kod jest caly czas kodem napisanym na szybkiego, jak
    ktos znajdzie bledy, to poprawimy. Kod oczywiscie realizuje mnozenie
    macierzy.

    Testowalem dla macierzy [1024,1024] x [1024,1024].
    Sprzet: Intel Atom N270 (energooszczedny, w rankingu wypada 15-20 razy
    gorzej niz i7)
    Kompilator gcc pod windows (mingw) wersja 4.4.0

    Polecenie kompilacj:
    g++ -O3 *.cpp
    czas dla double: 9-10s
    czas dla float: 9-10s
    Polecenie kompialcji:
    g++ -O3 -march=native -mtune=native *.cpp
    czas dla double: 6-7s
    czas dla float 6-7s

    Bede wdzieczny jak ktos poda czasy dla matlaba na podbym sprzecie.
    Podoby
    sprzet to np. AMD Sempron 2300+ 1.6GHz. Osobiscie nie podaje czasow
    dla matlaba, bo nie mam wykupionej licencji.

    W kodzie jest tez zamieszczony algorytm z naiwnym dostepem do
    pamieci, dzialal okolo 20 razy wolniej. Moja wersja algorytm z
    lepszym
    trafianiem w pamiec cache korzysta z dodatkowej kopii i pamieci, a
    wiec ma gorsza zlozonosc pamieciowa, ale to z powodu mojego
    lenistwa. Algorytm moze dzialac w miejscu malym kosztem czasu.
    Jesli ktos zechce napisac wersje transponujaca macierz w miejscu, to
    bedziemy mieli jeszcze lepsze rozeznanie.

    Zakomentowane sa metody show, po odkomentowaniu zostana wyswietlone
    macierze na standardowe wyjscie, mozna wrzucic do innego programu i
    sprawdzic
    czy wyniki sie zgadzaja (dla mniejszych N,M,K rzecz jasna)

    Pozdrawiam serdecznie i czekam az to ktos porowna do matlaba.





    #include <cstdio>
    #include <cmath>
    #include <cstdlib>
    #include <ctime>

    #define N (9)
    #define M (8)
    #define K (7)

    typedef double m_typ;

    static m_typ mat_a[N][K];
    static m_typ mat_b[N][M];
    static m_typ mat_c[M][K];

    static void init() {
    int i,j;
    for(i=0;i<N;i++)
    for(j=0;j<M;j++)
    mat_b[i][j] = (rand()%129-64) * (m_typ)0.05;
    for(i=0;i<M;i++)
    for(j=0;j<K;j++)
    mat_c[i][j] = (rand()%129-64) * (m_typ)0.05;
    }

    static void mmat() {
    int i,j,k;
    for(i=0;i<N;i++)
    for(j=0;j<K;j++) {
    mat_a[i][j] = 0;
    for(k=0;k<M;k++)
    mat_a[i][j] += mat_b[i][k] * mat_c[k][j];
    }
    }

    static void mmat_trans() {
    int i,j,k;
    static m_typ c_trans[K][M];

    for(i=0;i<M;i++)
    for(j=0;j<K;j++)
    c_trans[j][i] = mat_c[i][j];

    for(i=0;i<N;i++)
    for(j=0;j<K;j++) {
    mat_a[i][j] = 0;
    for(k=0;k<M;k++)
    mat_a[i][j] += mat_b[i][k] * c_trans[j][k];
    }

    }

    void show(const m_typ *const m, const int r,const int c) {
    int i,j;
    for(i=0;i<r;i++) {
    for(j=0;j<c;j++)
    printf("%+7.3lf ",(double)m[i*c+j]);
    printf("\n");
    }
    printf("\n");
    }

    int main(int argc, char *argv[])
    {
    clock_t t;
    init();
    // show( (m_typ*)mat_b , N , M );
    // show( (m_typ*)mat_c , M , K );

    t = clock();
    mmat_trans();
    t = clock() - t;
    printf("czas = %d\n",(int)(t/CLOCKS_PER_SEC));

    // show( (m_typ*)mat_a , N , K );

    getchar();
    return 0;
    }

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: