eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingmatlab taki wydajny? › Re: matlab taki wydajny?
  • Data: 2010-01-25 06:45:04
    Temat: Re: matlab taki wydajny?
    Od: bartekltg <b...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On 24 Sty, 11:23, thrunduil <t...@w...pl> wrote:
    > On 23 Sty, 10:11, Mariusz Marszałkowski <m...@g...com> wrote:
    >
    > > Przy mnozeniu macierzy wierszowej przez prostokatna juz wiem
    > > na 100% ze matlab nie jest o zaden rzad wielkosci szybszy, tylko
    > > jest dwa razy wolniejszy od procedury napisanej doslownie na
    > > kolanie w C++.
    >
    > to bylo sprawdzane czy sa to tylko domysly?
    >
    > bo podany kod mnozenia macierzy byl >10x wolniejszy od matlaba.

    To byl moj kod wiecz czuje sie wywolany do usprawiedliwien.
    Tamten kod byl napisany przed odrobieniem lekcji i skakal
    po macierzy nie w tej kolejnosci, w jakiej lubi to cache.

    Napisalem trzy wersje mnozenia poziomego wektora przez macierz
    naiwna ze zla kolejnoscia petli, naiwna z dobra kolejnoscia
    i wariacje na temat blokowego mnozenia macierzy.

    n=960. Wszystko, program w cpp i matlab dostawaly piorytet real time.

    naiwny, złe petle 51.345
    naiwny, ok 7.923
    blok32 8.705
    blok16 6.865
    blok8 4.886
    blok4 5.476

    MATLAB 8.899
    tic,for j=1:960,w=v*M;end;toc

    Mam nadzieje, ze tym razem nie strzelilem babola;)


    void mnoz (double *w,double *M,double *v,int n)
    {//petle ok
    for (int i=0;i<n;i++)
    {
    v[i]=0;
    }
    for (int i=0;i<n;i++)
    {
    for (int j=0;j<n;j++)
    v[j]=w[i]*M[n*i+j];
    }
    }

    void mnoz_naiw(double *w,double *M,double *v,int n)
    {//zle petle
    for (int i=0;i<n;i++)
    {
    v[i]=0;
    }
    for (int j=0;j<n;j++)
    for (int i=0;i<n;i++)
    v[j]=w[i]*M[n*i+j];

    }


    template<class T, int SN>
    void blokmnoz (T *w,T *M,T *v,int n)
    {
    for (int i=0;i<n;i++)
    {
    v[i]=0;
    }
    for (int i=0;i<n;i+=SN)
    {
    for (int j=0;j<n;j+=SN)
    {
    for (int ii=i;ii<i+SN;ii++)
    {
    for (int jj=j;jj<j+SN;jj++)
    v[jj]=w[ii]*M[n*ii+jj];
    }
    }
    }
    }

    pozdrawiam
    bartekltg

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: