eGospodarka.pl
eGospodarka.pl poleca

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

    On 21 Sty, 10:08, thrunduil <t...@w...pl> wrote:

    > > No to sie okazuje, ze narzut matlaba dla niewielkich wektorkow jest
    > > spory.
    >
    > To nie ma nic wspolnego z narzutem Matlaba.

    Zakład?

    > To sie nie skaluje liniowo. Kod mnozenia gdy prawa strona jest
    > macierza robi pewna sztuczke - blocking, podstawowy kod mnozenia ma
    > conajmniej szesc zagniezdzonych petli w taki sposob aby potrzebne
    > rzeczy byly w pamieci cache.
    > Cache misses dla L2 to koszt rzedu 200-300 cykli procesora. Unikniecie
    > wiec koniecznosci czytania pamieci daje duze oszczednosci.
    > Da sie to zrobic gdy prawa strona jest macierza, Gdy mnozy sie
    > wielkokrotnie przez wektor z prawej strony wykorzystanie pamieci jest
    > duzo gorsze, stad roznica efektywnosci. Narzut petli powinien byc
    > zaniedbywalny.

    To nie ma nic wspolnego z pamiecia, przynajmniej nie tak, jak
    sugerujesz.
    Jesli by mialo, to moj prosty kod (podany na koncu) tez by mizernie
    dzialal.
    Ale on nie chec, 1000 roznych mnozen wektorka dlugosci 1000
    przez macierz 1000x1000 liczy w niecale 6s.

    Dwa razy wolniej niz matlab liczac iloczyn 2 macierzy,
    ale tez ponad dwa razy szybciej niz analogiczne petla
    w matlabie:

    ||>> tic,for j=1:1000,a*v;end;toc
    ||
    ||Elapsed time is 15.379616 seconds.

    Czyli rozdrabnianie wywoluje jakis narzyt nie tylko
    przez gorsze wykorzystywanie pamieci.

    Chyba, ze cos w kodzie jest zle. Wektor wejsciowy zalezy od
    tego, co sie wpisze, wynik jest takze wypisywany ('potrzebny').
    W kazdej petli korzystam z innego wektora (kawalka znacznie
    dluzszego wektora)..

    pozdrawiam
    bartekltg

    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>

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

    int _tmain(int argc, _TCHAR* argv[])
    {
    double *w;double *M;double *v;
    clock_t start,end;
    double dif;

    int n,r;
    scanf("%d %d",&n,&r);

    srand(r);//coby jakos dziwnie nie zoptymalizowalo

    w=new double [n*n];
    v=new double [n*n];
    M=new double [n*n];

    for (int i=0;i<n*n;i++)
    v[i]=rand()*1.024894;
    for (int i=0;i<n*n;i++)
    M[i]=rand()*1.894;

    start=clock();
    for (int i=0;i<n;i++) //n razy podrzucamy rozne wektorki
    mnoz(&w[i*n],M,&v[i*n],n);
    end=clock();

    double aku=1;
    for (int i=1;i<n*n;i++)
    aku+=w[i]*w[i-1]; //coby wynik byl potrzebny i kod nie wyparowal
    printf("\n%.2le \n",aku);
    dif = difftime (end,start);
    printf ("\n%.2lf \n", double(end-start)/double(CLOCKS_PER_SEC) );
    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: