-
11. Data: 2010-01-24 16:33:46
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com>
On 24 Sty, 13:45, Mariusz Marszałkowski <m...@g...com> wrote:
> On 24 Sty, 11:18, thrunduil <t...@w...pl> wrote:
>
> > On 23 Sty, 11:37, Mariusz Marszałkowski <m...@g...com> wrote:
>
> > > Wiec na razie bazuje na tym, ze moj kod (napisany na kolanie)
> > > dziala 6s na intel atom N270, a matlab 2.5s na niewiadomym
> > > sprzecie.
>
> > dany kod dla AxB gdzie A,B = 1024x1024, czas = 2.13 sec.
> > matlab dla AxB, czas = .168 sec
>
> > czyli matlab jest 12x szybszy.
>
> Jak był kod kompilowany?
> Jaka maszyna?
> Pozdrawiam
Mam takie wyniki:
Matlab 0.68
Ten kod który zamieściłem 2.25
Czyli matlab jest szybszy 3.3 razy.
Pozdrawiam
-
12. Data: 2010-01-25 05:54:16
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: bartekltg <b...@g...com>
On 24 Sty, 17:33, Mariusz Marszałkowski <m...@g...com> wrote:
> Mam takie wyniki:
> Matlab 0.68
> Ten kod który zamieściłem 2.25
> Czyli matlab jest szybszy 3.3 razy.
Pod wplywem linkow z poprzedniego watku zaczalem troszke
eksperymentowac,
wyniki dojrzaly chyba do wyjscia na swiat
Dla uproszczenia sobie zycia testuje tylko macierze o rozmierze
bedacym wielokrotnoscia 192 (NWW(64,24)). Wyniki wrzucam dla 960.
Mierzone w kilka razy w petli, biore najlepszy wynik (praktycznie sie
nie roznily),
watek mial ustawione priorytet real time.
Indeksowanie: C(i,,j) = B(i,k)*C(k,j)
lub w rozwinieciu na c:
C[i*N+j] += A[i*N+k]*B[k*N+j]; (*)
1. Algorytm naiwny, ijk
46.6s
2. Prosta sztuczka, w ostatniej petli chcemy isc po kolei po pamieci,
a nie skakac. Patrzymy na (*) i ustalamy koljnosc petli na ikj.
Wynik, 10.23s $ razy lepiej.
3. Kod z konkursu. Wywalilem czesc wielowatkowa, bo mam jeden rdzen.
Korzysta on tam z fortranowskiego sposobu zapisu macierzy,
ale to nie ma znaczenia dla szybkosci. Wkladajac mu macierze
w odwrotnej kolejnosci dostajemy to samo (bo (B' *A')'=A*B)
Jesli to ja czegos nie popsulem:), wynik niewiele lepszy:
9.644s.
4. Wstepna transpozycja. Kolega machnal. Przed wykonaniem
wlasciwego sumowania przepisujemy macierz do tymczasowej
tablicy i tranponujemy ja. Kolejnosc ijk.
Kolejne przyszpieszenie 8.177s
5. Mnozymy blokami wielkosci SNxSN a bloki metoda ikj.
Kod niewiele mniej czytelny niz w ikj. W zaleznosci
od SN
8: 3.572 16: 3.262
24: 2.771 32: 2.634
48: 2.725 64: 2.574
Znaczna poprawa. Zeszlismy ponizej 2.6s, 18 razy lepiej niz naiwnie.
6. Kod z http://lwn.net/Articles/255364/ trzeci w 6.2.1
Ten sam algorytm, napisany (wg autora) tak, aby podpowiedziec
kompilaorowi
jak ma optymalizowac.
W zaleznosci od SN:
8: 4.634 16: 3.081
24: 2.624 32: 2.418
48: 2.206 64: 2.189
Ponizej 2.2s. Kilkanascie procent lepiej.
7. MATLAB.
piorytet wysoki, kilka prob, wybrana najlepsza
1.48s
30 razy lepiej niz naiwnie, nadal niepomijalnie szybciej niz
to, co udalo mi sie bez przesadnego siedzenia(1.7razy wolniej)
nad kodem lub wyszukiwania(1.5 razy wolniej) w sieci wycisnac z c++.
Jako bonus, kody (tylko moje, a noz cos poknocilem):
pozdrawiam
bartekltg
template <class T,int SM> void dgemm_bikj(T *A, T *B, T *C, int N)
{
int i,j,k,ii,kk,jj;
for (i = 0; i < N; i+=SM)
for (k = 0; k < N; k+=SM)
for (j = 0; j < N; j+=SM)
for (ii = i; ii < i+SM; ii++)
for (kk = k; kk < k+SM; kk++)
for (jj = j; jj < j+SM; jj++)
C[ii*N+jj] += A[ii*N+kk]*B[kk*N+jj];
}
void dgemm_ikj(double *A, double *B, double *C, int N)
{
int i,j,k;
for (i = 0; i < N; i++)
for (k = 0; k < N; k++)
for (j = 0; j < N; j++)
C[i*N+j] += A[i*N+k]*B[k*N+j];
}
void dgemm_ijk(double *A, double *B, double *C, int N)
{
int i,j,k;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
for (k = 0; k < N; k++)
C[i*N+j] += A[i*N+k]*B[k*N+j];
}
-
13. Data: 2010-01-25 11:47:13
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com>
On 25 Sty, 06:54, bartekltg <b...@g...com> wrote:
> On 24 Sty, 17:33, Mariusz Marszałkowski <m...@g...com> wrote:
>
> > Mam takie wyniki:
> > Matlab 0.68
> > Ten kod który zamieściłem 2.25
> > Czyli matlab jest szybszy 3.3 razy.
>
> 4. Wstepna transpozycja. Kolega machnal. Przed wykonaniem
> wlasciwego sumowania przepisujemy macierz do tymczasowej
> tablicy i tranponujemy ja. Kolejnosc ijk.
> Kolejne przyszpieszenie 8.177s
Czy wstępna transpozycja to jest to co ja zapisałem, czy chodzi
o innego kolegę? :) U mnie działa wstępna transpozycja 3.3 razy
wolniej niż matlab.
Jak były kompilowane procedury? Na niektórych platformach
sprzętowych są duże zyski dzięki opcjom -O3 i -fprofile-generate/use.
Także ważne jest aby mieć najnowszą wersję gcc.
Pozdrawiam
-
14. Data: 2010-01-25 12:30:49
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: thrunduil <t...@w...pl>
On 24 Sty, 13:45, Mariusz Marszałkowski <m...@g...com> wrote:
> > czyli matlab jest 12x szybszy.
> Jak był kod kompilowany?
> Jaka maszyna?
laptop z pewnie jakims duo core.
Mam inne wyniki, macierze 1024x1024
Matlab: 0.114798 sec
Kod c: 2.07 sec
Visual studio
/Ox /Oi /Ot /Oy /GT /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D
"_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"Release\\" /Fd"Release
\vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt
Intel Core 2 Quad Q9300, 4x32 KB L1, 2x3072KB L2,
-
15. Data: 2010-01-25 12:35:10
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: bartekltg <b...@g...com>
On 25 Sty, 12:47, Mariusz Marszałkowski <m...@g...com> wrote:
> Czy wstępna transpozycja to jest to co ja zapisałem, czy chodzi
> o innego kolegę? :) U mnie działa wstępna transpozycja 3.3 razy
> wolniej niż matlab.
Nie, inny (nie bierze tu udzialu w dyskusji). Procedura na kolanie,
bardzo
mozliwe, ze da sie ja znacznie poprawic. Moze w wolnej chwili
sprawdze.
BTW, zbilem do(dla tych samych warunkow co poprzednio) 1.86s:)
> Jak były kompilowane procedury? Na niektórych platformach
> sprzętowych są duże zyski dzięki opcjom -O3 i -fprofile-generate/use.
> Także ważne jest aby mieć najnowszą wersję gcc.
VC++2008 express
/Ox(czyli /O2 i sporo dodatkow, O3 nie ma.) /Ob2 (inline co sie da)
/Ot(preferuj szybkosc nad rozmiarem) /GL(global) /arch:SSE (nie mam
SSE2).
pozdrawiam
bartekltg
-
16. Data: 2010-01-25 13:26:58
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: bartekltg <b...@g...com>
On 23 Sty, 10:21, Mariusz Marszałkowski <m...@g...com> wrote:
> > >> tic;a*b;toc
>
> powinno chyba być c=a*b ?
Powinno byc. Pozniej sprawdzalem, roznicy nie ma.
> > Elapsed time is 2.585347 seconds.
>
> Na jakim sprzecie matlab mial taki wynik?
Althon XP 1700, ale tylko sily wyzsze wiedza, na ile obecnie krecony:)
pozdrawiam
bartekltg
-
17. Data: 2010-01-25 13:45:24
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: bartekltg <b...@g...com>
On 25 Sty, 13:30, thrunduil <t...@w...pl> wrote:
> On 24 Sty, 13:45, Mariusz Marszałkowski <m...@g...com> wrote:
>
> > > czyli matlab jest 12x szybszy.
> > Jak był kod kompilowany?
> > Jaka maszyna?
>
> laptop z pewnie jakims duo core.
>
> Mam inne wyniki, macierze 1024x1024
> Matlab: 0.114798 sec
> Kod c: 2.07 sec
Rzad wielkosci proporcji miedzy algorytmem z transponowaniem
a matlabem zgadza z moimi wynikami.
> Visual studio
> /Ox /Oi /Ot /Oy /GT /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D
> "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"Release\\" /Fd"Release
> \vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt
>
> Intel Core 2 Quad Q9300, 4x32 KB L1, 2x3072KB L2,
Sprobuj jeszcze dodac /arch:SSE2 z code generation.
pozdrawiam
bartekltg
-
18. Data: 2010-01-25 14:45:09
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com>
On 25 Sty, 14:45, bartekltg <b...@g...com> wrote:
> On 25 Sty, 13:30, thrunduil <t...@w...pl> wrote:
>
> > On 24 Sty, 13:45, Mariusz Marszałkowski <m...@g...com> wrote:
>
> > > > czyli matlab jest 12x szybszy.
> > > Jak był kod kompilowany?
> > > Jaka maszyna?
>
> > laptop z pewnie jakims duo core.
>
> > Mam inne wyniki, macierze 1024x1024
> > Matlab: 0.114798 sec
> > Kod c: 2.07 sec
>
> Rzad wielkosci proporcji miedzy algorytmem z transponowaniem
> a matlabem zgadza z moimi wynikami.
>
> > Visual studio
> > /Ox /Oi /Ot /Oy /GT /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D
> > "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"Release\\" /Fd"Release
> > \vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt
>
> > Intel Core 2 Quad Q9300, 4x32 KB L1, 2x3072KB L2,
>
> Sprobuj jeszcze dodac /arch:SSE2 z code generation.
>
Na niektórych architekturach, na niektórych programach,
obserwowałem, że gcc wypada znacznie lepiej niż VC. Może
własnie z powodu gcc mam lepszy wynik. Jutro może
zajdę chwilę czasu, to spróbuję skompilować w GCC Twoje
procedury.
Pozdrawiam serdecznie.
-
19. Data: 2010-01-25 16:20:43
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: thrunduil <t...@w...pl>
On 25 Sty, 15:45, Mariusz Marszałkowski <m...@g...com> wrote:
> On 25 Sty, 14:45, bartekltg <b...@g...com> wrote:
>
>
>
> > On 25 Sty, 13:30, thrunduil <t...@w...pl> wrote:
>
> > > On 24 Sty, 13:45, Mariusz Marszałkowski <m...@g...com> wrote:
>
> > > > > czyli matlab jest 12x szybszy.
> > > > Jak był kod kompilowany?
> > > > Jaka maszyna?
>
> > > laptop z pewnie jakims duo core.
>
> > > Mam inne wyniki, macierze 1024x1024
> > > Matlab: 0.114798 sec
> > > Kod c: 2.07 sec
>
> > Rzad wielkosci proporcji miedzy algorytmem z transponowaniem
> > a matlabem zgadza z moimi wynikami.
>
> > > Visual studio
> > > /Ox /Oi /Ot /Oy /GT /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D
> > > "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"Release\\" /Fd"Release
> > > \vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt
>
> > > Intel Core 2 Quad Q9300, 4x32 KB L1, 2x3072KB L2,
>
> > Sprobuj jeszcze dodac /arch:SSE2 z code generation.
>
> Na niektórych architekturach, na niektórych programach,
> obserwowałem, że gcc wypada znacznie lepiej niż VC. Może
> własnie z powodu gcc mam lepszy wynik. Jutro może
> zajdę chwilę czasu, to spróbuję skompilować w GCC Twoje
> procedury.
http://www.ddj.com/cpp/184401976
troche stare,
ale na podstawie tych testow VS (ver 7) na pewno nie jest wolniejszy
od gcc (ver 3.4)
Nowsze gcc i tak nie chodzi pod windows (korzystajac z mingw).
-
20. Data: 2010-01-25 16:27:35
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: marszi <w...@g...com>
On 25 Sty, 17:20, thrunduil <t...@w...pl> wrote:
> On 25 Sty, 15:45, Mariusz Marszałkowski <m...@g...com> wrote:
>
>
>
> > On 25 Sty, 14:45, bartekltg <b...@g...com> wrote:
>
> > > On 25 Sty, 13:30, thrunduil <t...@w...pl> wrote:
>
> > > > On 24 Sty, 13:45, Mariusz Marszałkowski <m...@g...com> wrote:
>
> > > > > > czyli matlab jest 12x szybszy.
> > > > > Jak był kod kompilowany?
> > > > > Jaka maszyna?
>
> > > > laptop z pewnie jakims duo core.
>
> > > > Mam inne wyniki, macierze 1024x1024
> > > > Matlab: 0.114798 sec
> > > > Kod c: 2.07 sec
>
> > > Rzad wielkosci proporcji miedzy algorytmem z transponowaniem
> > > a matlabem zgadza z moimi wynikami.
>
> > > > Visual studio
> > > > /Ox /Oi /Ot /Oy /GT /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D
> > > > "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"Release\\" /Fd"Release
> > > > \vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt
>
> > > > Intel Core 2 Quad Q9300, 4x32 KB L1, 2x3072KB L2,
>
> > > Sprobuj jeszcze dodac /arch:SSE2 z code generation.
>
> > Na niektórych architekturach, na niektórych programach,
> > obserwowałem, że gcc wypada znacznie lepiej niż VC. Może
> > własnie z powodu gcc mam lepszy wynik. Jutro może
> > zajdę chwilę czasu, to spróbuję skompilować w GCC Twoje
> > procedury.
>
> http://www.ddj.com/cpp/184401976
>
> troche stare,
> ale na podstawie tych testow VS (ver 7) na pewno nie jest wolniejszy
> od gcc (ver 3.4)
> Nowsze gcc i tak nie chodzi pod windows (korzystajac z mingw).
Ja mam pod windows 4.4.0, i to juz od jakiegoś czasu. Różnica w
szybkosci
niektorych programamow była bardo duza. Najlatwiej pobrac gcc wraz
qtcreaorem.
Pozdrawiam
Mariusz Marszalkowski (sorry, nie ze swojego konta odpisuje)