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?
  • Data: 2010-01-23 01:28:58
    Temat: no to ile czasu matlab mnozy te duze macierze?
    Od: Mariusz Marszałkowski <m...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie 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: