Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

no to ile czasu matlab mnozy te duze macierze?

13 views
Skip to first unread message

Mariusz Marszałkowski

unread,
Jan 22, 2010, 8:28:58 PM1/22/10
to
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;
}

Mariusz Marszałkowski

unread,
Jan 22, 2010, 8:33:42 PM1/22/10
to

Poprawka, powinno być:

#define N (1024)
#define M (1024)
#define K (1024)

Wrzucalem do excela na malych rozmiarach i przez
pomylke zostawilem. Sorry.

Mariusz Marszałkowski

unread,
Jan 23, 2010, 4:21:27 AM1/23/10
to
On 21 Sty, 09:41, bartekltg <bartek...@gmail.com> wrote:
> On 21 Sty, 09:22, thrunduil <thrund...@wp.pl> wrote:
> Dwie rownowazne operacje (1000 wektorow mnozymy przez macierz 1000 na
> 1000),
> tylko raz w petli, a raz zwijamy w paczuszke. Jak wynikalo z
> sasiedniego
> postu, algorytm jest ten sam bo matlab korzysta z n^3.
>
> >> tic;a*b;toc
powinno chyba być c=a*b ?


> Elapsed time is 2.585347 seconds.
Na jakim sprzecie matlab mial taki wynik?

Pozdrawiam

Wit Jakuczun

unread,
Jan 23, 2010, 5:01:28 AM1/23/10
to
On 23 Sty, 02:28, Mariusz Marszałkowski <mmars...@gmail.com> wrote:
> 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
>
Jak to się ma do przykładów z tego konkursu? Może porównaj Twój kod z
kodem
z konkursu. Będziesz miał od razu porównanie z ATLASem. Matlab
powinien być
na poziomie ATLASu (nie gorzej).

Pozdrawiam,
Wit Jakuczun

Mariusz Marszałkowski

unread,
Jan 23, 2010, 5:07:46 AM1/23/10
to

Ten konkurs jest bardzo niejasno opisany, dlatego postanowiłem
porownac czas wykonania bezpośrednio z czasem matlaba.

Cytuje:
"poniższa sekwencja jest przykładowa i w testach może
ulec zmianie: istotne jest, że występuje w niej kilka kolejnych
wywołań bestdgemm() */

Nie wiem ile wywolan dla jakich macierzy o jakich rozmiarach bylo.

Pozdrawiam

Wit Jakuczun

unread,
Jan 23, 2010, 5:18:56 AM1/23/10
to
On 23 Sty, 11:07, Mariusz Marszałkowski <mmars...@gmail.com> wrote:

> Ten konkurs jest bardzo niejasno opisany, dlatego postanowiłem
> porownac czas wykonania bezpośrednio z czasem matlaba.
>
> Cytuje:
> "poniższa sekwencja jest przykładowa i w testach może
> ulec zmianie: istotne jest, że występuje w niej kilka kolejnych
> wywołań bestdgemm() */
>
> Nie wiem ile wywolan dla jakich macierzy o jakich rozmiarach bylo.
>

Ja sugerowałem, żebyś wziął np. najlepszą metodę z tego konkursu (kod
źródłowy) i skompilował ją u siebie a następnie porównał czas dla
testu,
który podajesz powyżej.

Pozdrawiam,
Wit Jakuczun

Mariusz Marszałkowski

unread,
Jan 23, 2010, 5:19:53 AM1/23/10
to
Dobry pomysl.

Mariusz Marszałkowski

unread,
Jan 23, 2010, 5:37:34 AM1/23/10
to

Niestety mój kompilator nie kompiluje najszybszego programu. Z jakiś
powodów mingw32 w wesji 4.4.0 nie zostalo wyposazone w pthread.
Poza tym najszybszy kod uzywa SSE2, nie wiem czy maszyna na
ktorej to kompiluje ma SSE2, mingw najwyrazniej tez nie ma. Kolejna
sprawa: najszybszy algorytm ten uzywa strassena (a przynajmniej ma
procedure o takiej nazwie)

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.

Pozdrawiam serdecznie.

thrunduil

unread,
Jan 24, 2010, 5:18:04 AM1/24/10
to
On 23 Sty, 11:37, Mariusz Marszałkowski <mmars...@gmail.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.

Mariusz Marszałkowski

unread,
Jan 24, 2010, 7:45:24 AM1/24/10
to

Jak był kod kompilowany?
Jaka maszyna?
Pozdrawiam

Mariusz Marszałkowski

unread,
Jan 24, 2010, 11:33:46 AM1/24/10
to

Mam takie wyniki:
Matlab 0.68
Ten kod który zamieściłem 2.25
Czyli matlab jest szybszy 3.3 razy.

Pozdrawiam

bartekltg

unread,
Jan 25, 2010, 12:54:16 AM1/25/10
to
On 24 Sty, 17:33, Mariusz Marszałkowski <mmars...@gmail.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];
}

Mariusz Marszałkowski

unread,
Jan 25, 2010, 6:47:13 AM1/25/10
to
On 25 Sty, 06:54, bartekltg <bartek...@gmail.com> wrote:
> On 24 Sty, 17:33, Mariusz Marszałkowski <mmars...@gmail.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

thrunduil

unread,
Jan 25, 2010, 7:30:49 AM1/25/10
to
On 24 Sty, 13:45, Mariusz Marszałkowski <mmars...@gmail.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,

bartekltg

unread,
Jan 25, 2010, 7:35:10 AM1/25/10
to
On 25 Sty, 12:47, Mariusz Marszałkowski <mmars...@gmail.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

bartekltg

unread,
Jan 25, 2010, 8:26:58 AM1/25/10
to
On 23 Sty, 10:21, Mariusz Marszałkowski <mmars...@gmail.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


bartekltg

unread,
Jan 25, 2010, 8:45:24 AM1/25/10
to
On 25 Sty, 13:30, thrunduil <thrund...@wp.pl> wrote:
> On 24 Sty, 13:45, Mariusz Marszałkowski <mmars...@gmail.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

Mariusz Marszałkowski

unread,
Jan 25, 2010, 9:45:09 AM1/25/10
to
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.

thrunduil

unread,
Jan 25, 2010, 11:20:43 AM1/25/10
to

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).

marszi

unread,
Jan 25, 2010, 11:27:35 AM1/25/10
to

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)


bartekltg

unread,
Jan 25, 2010, 11:44:03 AM1/25/10
to
On 25 Sty, 15:45, Mariusz Marszałkowski <mmars...@gmail.com> wrote:
>
> Na niektórych architekturach, na niektórych programach,
> obserwowałem, że gcc wypada znacznie lepiej niż VC. Może

Hmm, szlyszalem odwrotnie;)

> własnie z powodu gcc mam lepszy wynik. Jutro może

Masz lepsze wyniki bo masz lepszy komputer;)
Jesli mowisz o porownywaniu do matlaba, to podejrzewam
ze nie dales mu sie wykazac (daj najzyzszy piorytet i testuj
w petli for j=1:10,tic;c=a*b;toc,end;)

Najlepsza procedura zchodze do 1.86 przy 1.48 matlabem
dla n=960 i 15.45s przy 11s matlabem.
Uwazasz, ze gcc znacznie wiecej wyciagnie;>

> zajdę chwilę czasu, to spróbuję skompilować w GCC Twoje
> procedury.

gcc mam nieswieze, z devcpp.
Opcje
-fexpensive-optimizations -O3 -march=athlon-xp -msse

I wyniki tragiczne:( ikj z 10 -> 6
bolkowa spadla do 6s (z ) :(
Blokowa, ktorej tu nie podawalem, z zabawa wskaznikami etc,
zeby podpowiedziec kompilatorowi, jak sie nie napracowac,
a ktora daje pewne przyszpieszenie w VC tu tez spadla,
ale nie tak znacznie z 1.86 zroblo sie 2.57.
Widac, ze optymalizuje znacznie gorzej.

Ale jak mowilem, gcc prehistoryczne.

Probowalem sciagnac cos nowszego, ale mingw wyskakuje mi
tez z gcc 3.4, devcpp juz zdechlo. Podpowiedz, czego szukac
tak, zeby sie nie narobic;)

pozdrawiam
bartekltg

thrunduil

unread,
Jan 25, 2010, 12:40:20 PM1/25/10
to
On 25 Sty, 17:27, marszi <w.marszalkow...@gmail.com> wrote:

> Ja mam pod windows 4.4.0, i to juz od jakiegoś czasu. Różnica w


skad wziac nowsza wersje gcc?
wlasnie sprawdzilem, ze nawet w cygwinie jest tylko 3.4.

Mariusz Marszałkowski

unread,
Jan 25, 2010, 2:24:14 PM1/25/10
to

Tak jak pisalem, pod windows najprosciej wraz z qtcreator.
W googlach poszukac qtcreator.
Pozdrawiam serdecznie

Mariusz Marszałkowski

unread,
Jan 25, 2010, 2:44:35 PM1/25/10
to
On 25 Sty, 17:44, bartekltg <bartek...@gmail.com> wrote:
> On 25 Sty, 15:45, Mariusz Marszałkowski <mmars...@gmail.com> wrote:
>
>
>
> > Na niektórych architekturach, na niektórych programach,
> > obserwowałem, że gcc wypada znacznie lepiej niż VC. Może
>
> Hmm, szlyszalem odwrotnie;)
Roznie to jest. Kiedys (3-4 lata temu) z najczesciej VC wypadal
nieznacznie (5-7%) lepiej. Od owych 3-4 lat, w moich testach znacznie
czesciej
wypada lepiej GCC. Bywa ze jeden kompilator generuje kod 2 razy
szybszy
niz drugi. Oczywiscie to zalezy od kodu i od maszyny docelowej. GCC
ma duzo opcji do kompilacji, dobrac te opcje to wyzwanie. Jest nawet
program ktory metoda prob i bledow dobiera opcje kompilacji.

> Masz lepsze wyniki bo masz lepszy komputer;)

Mowie o wzglednym wyniku. Moj kod dziala 3.3 razy
wolniej niz matlab na tym samym sprzecie. Procedura
ktora Ty wkleiles dziala 1.5 raza wolniej niz matlab, ale
Twojej juz nie testowalem tak dokladnie. Mam tone innego
kodu do testowania/optymalizowania i nie mam czasu :)

> Jesli mowisz o porownywaniu do matlaba, to podejrzewam
> ze nie dales mu sie wykazac (daj najzyzszy piorytet i testuj
> w petli for j=1:10,tic;c=a*b;toc,end;)

Tak to polecilem komus zrobic. Jeszcze musze zapytac o
wersje matlaba, moze macie nowszego matlaba i dlatego
wypada u Was lepiej?


> Najlepsza procedura zchodze do 1.86 przy 1.48 matlabem
> dla n=960 i 15.45s przy 11s matlabem.
> Uwazasz, ze gcc znacznie wiecej wyciagnie;>

Kwestia szczescia :) Np. najlepsza Twoja procedura po
dolaczeniu kodu dla profilera (a wiec obciazona dodatkowym
kodem) dzial szybciej niz skompilowana normalnie! Zeby
dobrze kompilowac gcc trzeba miec duzo doswiadczenia i
intuicji :)


> > zajdę chwilę czasu, to spróbuję skompilować w GCC Twoje
> > procedury.
>
> gcc mam nieswieze, z devcpp.
> Opcje
>  -fexpensive-optimizations -O3 -march=athlon-xp -msse

Ja daje bez -march i bez -mtune, uznalem ze to byloby
nie w porzadku wobec matlaba, bo jego kod zadziala na
kazdym kompie :) Po mtune i march program moze nie
dzialac na innym kompie.


> I wyniki tragiczne:( ikj z 10 -> 6
> bolkowa spadla do 6s (z ) :(
> Blokowa, ktorej tu nie podawalem, z zabawa wskaznikami etc,
> zeby podpowiedziec kompilatorowi, jak sie nie napracowac,
> a ktora daje pewne przyszpieszenie w VC tu tez spadla,
> ale nie tak znacznie z 1.86 zroblo sie 2.57.
> Widac, ze optymalizuje znacznie gorzej.

Chwilka :) Wkskazniki nie podpowiadaja kompilatorowi
jak optymalizowac, tylko uniemozliwiaja optymalizacje. Jesli
uzywa sie wskaznikow, trzeba wykonac cala prace samemu
za kompilator. Czasami to sie oplaca, a czasami nie.

> Ale jak mowilem, gcc prehistoryczne.
>
> Probowalem sciagnac cos nowszego, ale mingw wyskakuje mi
> tez z gcc 3.4, devcpp juz zdechlo. Podpowiedz, czego szukac
> tak, zeby sie nie narobic;)

Jesli pod winde, to najnowszy QtCreator. Pod linuxa robi ktos
to za mnie i nie umiem polecic, zawsze mam podstawiona najnowsza
wersje pod nos :)


> pozdrawiam
Rowniez :)


Wojciech Jaczewski

unread,
Jan 25, 2010, 4:10:37 PM1/25/10
to
Mariusz Marsza�kowski wrote:

> [...]


> Jest nawet
> program ktory metoda prob i bledow dobiera opcje kompilacji.

Pami�tasz mo�e jego nazw�?

Mariusz Marszałkowski

unread,
Jan 25, 2010, 5:13:39 PM1/25/10
to
On 25 Sty, 22:10, Wojciech Jaczewski <wjacz...@o2.pl> wrote:

> Mariusz Marszałkowski wrote:
> > [...]
> > Jest nawet
> > program ktory metoda prob i bledow dobiera opcje kompilacji.
>
> Pamiętasz może jego nazwę?

Niestety zapomnialem, sleroza.
Kiedys nazwe i linka do strony podawalem na tym forum:

http://tech.groups.yahoo.com/group/progszach/

ale juz nie pamietam.

Trzeba by przeszukac :/

Pozdrawiam

Wojciech Jaczewski

unread,
Jan 25, 2010, 6:02:48 PM1/25/10
to
Mariusz Marsza�kowski wrote:

> On 25 Sty, 22:10, Wojciech Jaczewski <wjacz...@o2.pl> wrote:

>> Mariusz Marsza�kowski wrote:
>> > [...]
>> > Jest nawet
>> > program ktory metoda prob i bledow dobiera opcje kompilacji.
>>

>> Pami�tasz mo�e jego nazw�?
>

> Niestety zapomnialem, sleroza.
> Kiedys nazwe i linka do strony podawalem na tym forum:
>
> http://tech.groups.yahoo.com/group/progszach/

Dzi�ki.
Poszukam sobie. Nie jest to dla mnie jako� szczeg�lnie pilne, ale kiedy�
poeksperymentuj� i mo�e zdob�d� troch� dodatkowej wiedzy, przydatnej do
dyskutowania na m�j ulubiony temat na grupie pl.comp.lang.java - czyli na
temat optymalizacji, jakie to mo�e wykona� kompilator statyczny, a jakie to
niby cuda wyczynia JVM...

bartekltg

unread,
Jan 25, 2010, 7:37:22 PM1/25/10
to
On 25 Sty, 20:44, Mariusz Marszałkowski <mmars...@gmail.com> wrote:
> On 25 Sty, 17:44, bartekltg <bartek...@gmail.com> wrote:> On 25 Sty, 15:45, Mariusz Marszałkowski <mmars...@gmail.com> wrote:

> ktora Ty wkleiles dziala 1.5 raza wolniej niz matlab, ale
> Twojej juz nie testowalem tak dokladnie.

1.86 do 1.46
i 15.4 do 11.6
Czyli sie zgadza (no, moze sugerowac jednak przewage VC;))

> Tak to polecilem komus zrobic. Jeszcze musze zapytac o
> wersje matlaba, moze macie nowszego matlaba i dlatego
> wypada u Was lepiej?

Czyli robisz testy na sprzecie podobnym, a nie tym samym?

> Kwestia szczescia :) Np. najlepsza Twoja procedura po
> dolaczeniu kodu dla profilera (a wiec obciazona dodatkowym
> kodem) dzial szybciej niz skompilowana normalnie! Zeby

Cuda jakies;>

> dobrze kompilowac gcc trzeba miec duzo doswiadczenia i
> intuicji :)

Ale ja kompilowalem VC. Tez bawiac sie opcjami.
Wszelkie info dla profilera wywalone. asm wyglada dosc ladnie.

> Ja daje bez -march i bez -mtune, uznalem ze  to byloby
> nie w porzadku wobec matlaba, bo jego kod zadziala na

Jego strata. To jest wlasnie przewaga kodu nad gotowcem,
mozna skompilowac go pod wlasna maszyne.

> kazdym kompie :) Po mtune i march program moze nie
> dzialac na innym kompie.

Jest mi z tego powodu niezmiernie przykro - bedzie
trzeba przebudowac kod na tamtym kompie.

> Chwilka :) Wkskazniki nie podpowiadaja kompilatorowi
> jak optymalizowac, tylko uniemozliwiaja optymalizacje. Jesli

To sa 'sztuczki' typu: w ostatniej petli C[N*i+j] zamieniamy
na CC[j] a 'CC=C+N*i;' spychamy pare poziomow nizej.
Takie optymalizacje moglby robic kompilator, jednak
oba (VC i gcc) przyszpieszyly po takiej operacji.


> Jesli pod winde, to najnowszy QtCreator. Pod linuxa robi ktos
> to za mnie i nie umiem polecic, zawsze mam podstawiona najnowsza
> wersje pod nos :)

Cos sciagnalem, okazalo sie, ze to _wymaga_ minwg:)
teraz sciaga sie qt-sdk-win-opensource-2010.01, moze tam jest..

pozdrawiam
bartekltg

Mariusz Marszałkowski

unread,
Jan 25, 2010, 8:12:40 PM1/25/10
to
On 26 Sty, 01:37, bartekltg <bartek...@gmail.com> wrote:
> On 25 Sty, 20:44, Mariusz Marszałkowski <mmars...@gmail.com> wrote:
>
> > On 25 Sty, 17:44, bartekltg <bartek...@gmail.com> wrote:> On 25 Sty, 15:45, Mariusz Marszałkowski <mmars...@gmail.com> wrote:
> > ktora Ty wkleiles dziala 1.5 raza wolniej niz matlab, ale
> > Twojej juz nie testowalem tak dokladnie.
>
> 1.86 do 1.46
> i 15.4 do 11.6
> Czyli sie zgadza (no, moze sugerowac jednak przewage VC;))
>
> > Tak to polecilem komus zrobic. Jeszcze musze zapytac o
> > wersje matlaba, moze macie nowszego matlaba i dlatego
> > wypada u Was lepiej?
>
> Czyli robisz testy na sprzecie podobnym, a nie tym samym?
Identyczny sprzęt.


> > Kwestia szczescia :) Np. najlepsza Twoja procedura po
> > dolaczeniu kodu dla profilera (a wiec obciazona dodatkowym
> > kodem) dzial szybciej niz skompilowana normalnie! Zeby
>
> Cuda jakies;>

To jeszcze nic... Wlasnie obserwuje jak na innym programie,
jak po dodaniu statycznej tablicy do ktorej nie ma jeszcze
zadnego odwolania w kodzie, program z 300sekund spowolnil
do 358s :) Inaczej rozlozone dane i juz taki spadek wydajnosci. I
co mam na to poradzic?


> > dobrze kompilowac gcc trzeba miec duzo doswiadczenia i
> > intuicji :)
>
> Ale ja kompilowalem VC. Tez bawiac sie opcjami.
> Wszelkie info dla profilera wywalone. asm wyglada dosc ladnie.

Ok, mowie tak na zas ze kompilacja GCC nie jest trywialna :)


> > Ja daje bez -march i bez -mtune, uznalem ze  to byloby
> > nie w porzadku wobec matlaba, bo jego kod zadziala na
>
> Jego strata. To jest wlasnie przewaga kodu nad gotowcem,
> mozna skompilowac go pod wlasna maszyne.

Moze i racja. Ale akurat na tej maszynie na ktorej byl mierzony
czas matlaba -march i mtune zupelnie nic nie dalo. A kod
przyspieszal z danymi dla profilera :) Moze profiler wplywa
jakos na dzialanie funkcji clock? Nie wiem... zglupialem
gdy zobaczylem ze kod z info dla profilera dziala krocej.

> > kazdym kompie :) Po mtune i march program moze nie
> > dzialac na innym kompie.
>
> Jest mi z tego powodu niezmiernie przykro - bedzie
> trzeba przebudowac kod na tamtym kompie.
>
> > Chwilka :) Wkskazniki nie podpowiadaja kompilatorowi
> > jak optymalizowac, tylko uniemozliwiaja optymalizacje. Jesli
>
> To sa 'sztuczki' typu: w ostatniej petli C[N*i+j] zamieniamy
> na CC[j] a 'CC=C+N*i;' spychamy pare poziomow nizej.
> Takie optymalizacje moglby robic kompilator, jednak
> oba (VC i gcc) przyszpieszyly po takiej operacji.

GCC robi bardzo duzo, ale trudno jest sie posluzyc
jego opcjami. W helpie do GCC widzialem bardzo podobny
przyklad do mnozenia macierzy, z ktorego wynika ze GCC umie
sam zaminiec dwie petle:

for i = 1, N
for j = 1, N

na cztery:

for i = 1, N, step
for j = 1, N, step
for ii=1,step
for jj=1,step

Podobnie jest opcja w ktorej podaje sie ilosc pamieci
cache. Moze ktos lepiej poslugujacy sie GCC czyta
ten watek i nam troche opowie o mozliwosciach GCC?


> > Jesli pod winde, to najnowszy QtCreator. Pod linuxa robi ktos
> > to za mnie i nie umiem polecic, zawsze mam podstawiona najnowsza
> > wersje pod nos :)
>
> Cos sciagnalem, okazalo sie, ze to _wymaga_ minwg:)
> teraz sciaga sie qt-sdk-win-opensource-2010.01, moze tam jest..

Ah tak, sa wersje z kompilatorem i bez.

Pozdrawiam


Kicer

unread,
Jan 27, 2010, 6:24:46 AM1/27/10
to
Mariusz Marsza�kowski wrote:

> On 25 Sty, 17:44, bartekltg <bartek...@gmail.com> wrote:

>> On 25 Sty, 15:45, Mariusz Marsza�kowski <mmars...@gmail.com> wrote:
>>
>>
>>
>> > Na niekt�rych architekturach, na niekt�rych programach,
>> > obserwowa�em, �e gcc wypada znacznie lepiej ni� VC. Mo�e


>>
>> Hmm, szlyszalem odwrotnie;)
> Roznie to jest. Kiedys (3-4 lata temu) z najczesciej VC wypadal
> nieznacznie (5-7%) lepiej. Od owych 3-4 lat, w moich testach znacznie
> czesciej
> wypada lepiej GCC. Bywa ze jeden kompilator generuje kod 2 razy
> szybszy
> niz drugi. Oczywiscie to zalezy od kodu i od maszyny docelowej. GCC
> ma duzo opcji do kompilacji, dobrac te opcje to wyzwanie. Jest nawet
> program ktory metoda prob i bledow dobiera opcje kompilacji.

by�o kiedys na kt�rejs grupie, nie pamietam na kt�rej;)
http://www.linux-
kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf

--
Michaďż˝ Walenciak
Kicer86 at gmail dot com
http://kicer.elsat.net.pl
gg: 3729519

bartekltg

unread,
Jan 29, 2010, 11:24:56 AM1/29/10
to
On 26 Sty, 02:12, Mariusz Marszałkowski <mmars...@gmail.com> wrote:

> To jeszcze nic... Wlasnie obserwuje jak na innym programie,
> jak po dodaniu statycznej tablicy do ktorej nie ma jeszcze
> zadnego odwolania w kodzie, program z 300sekund spowolnil
> do 358s :) Inaczej rozlozone dane i juz taki spadek wydajnosci. I
> co mam na  to poradzic?

Kontrolowac wyrównanie?

> Ok, mowie tak na zas ze kompilacja GCC nie jest trywialna :)

Ale nie jest to tez wiedza tajemna. Chyba.


> Podobnie jest opcja w ktorej podaje sie ilosc pamieci
> cache. Moze ktos lepiej poslugujacy sie GCC czyta
> ten watek i nam troche opowie o mozliwosciach GCC?


Mam g++ 4.4.cos, chyba 0 z qtcreatora. Niestety, nadal mimo
roznych opcji, w tym floop-unroling i podobnych daja jakies 20%
gorsze wyniki niz VC (z duza iloscia opcji, ale nic wymyslnego,
/fp:precise, co ciekawe, 'fast' pogarsza wyniki).

Jakies pomysly na magiczne opcje dla gcc?

pozdrawiam
bartekltg

Mariusz Marszałkowski

unread,
Jan 30, 2010, 12:33:19 AM1/30/10
to
On 29 Sty, 17:24, bartekltg <bartek...@gmail.com> wrote:
> On 26 Sty, 02:12, Mariusz Marszałkowski <mmars...@gmail.com> wrote:
>
> > To jeszcze nic... Wlasnie obserwuje jak na innym programie,
> > jak po dodaniu statycznej tablicy do ktorej nie ma jeszcze
> > zadnego odwolania w kodzie, program z 300sekund spowolnil
> > do 358s :) Inaczej rozlozone dane i juz taki spadek wydajnosci. I
> > co mam na  to poradzic?
>
> Kontrolowac wyrównanie?
Na co dzien mierze czasu roznych wersji programu. Czasami
po innej kolejnosci wcielania naglowkow kod jest 20% szybszy/
wolniejszy :)


> > Ok, mowie tak na zas ze kompilacja GCC nie jest trywialna :)
>
> Ale nie jest to tez wiedza tajemna. Chyba.

Tajemna nie, ale uzytkownik kompilatora musialby wiedziec
naprawde bardzo duzo, aby przewidzec ze kod dodatkowo
obciazony pomiarem czasu (tym dla profilera) zadziala
szybciej. Bez tej wiedzy trzeba sprawdzic milion kombinacji
opcji i wybrac najszybsza :)

>
> > Podobnie jest opcja w ktorej podaje sie ilosc pamieci
> > cache. Moze ktos lepiej poslugujacy sie GCC czyta
> > ten watek i nam troche opowie o mozliwosciach GCC?
>
> Mam g++ 4.4.cos, chyba 0 z qtcreatora. Niestety, nadal mimo
> roznych opcji, w tym floop-unroling i podobnych daja jakies 20%
> gorsze wyniki niz VC (z duza iloscia opcji, ale nic wymyslnego,
> /fp:precise, co ciekawe, 'fast' pogarsza wyniki).

Ciekawe, w moich pomiarach rzadko VC wygrywa. Ale raz
widzialem jak VC wygenerowal kod az dwa razy szybszy.


> Jakies pomysly na magiczne opcje dla gcc?
>

Raczej nie pomoge, osobiscie uzywam go tylko w
najprostszy sposob:
g++ -O3 -march=native -mtune=native -fomit-frame-poionter -fprofile-
generate[use] *.cpp

Pod poniższym linkiem jest 50 stron o opcjach optymalizacji :)

http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options

Przy mnozeniu macierzy najbardziej ciekawia mnie opcje:
-floop-block
l1-cache-size

Pozdrawiam

bartekltg

unread,
Jan 30, 2010, 8:51:10 AM1/30/10
to
On 30 Sty, 06:33, Mariusz Marszałkowski <mmars...@gmail.com> wrote:

> Na co dzien mierze czasu roznych wersji programu. Czasami
> po innej kolejnosci wcielania naglowkow kod jest 20% szybszy/
> wolniejszy :)

Czary.
:)

> Tajemna nie, ale uzytkownik kompilatora musialby wiedziec
> naprawde bardzo duzo, aby przewidzec ze kod dodatkowo
> obciazony pomiarem czasu (tym dla profilera) zadziala
> szybciej. Bez tej wiedzy trzeba sprawdzic milion kombinacji
> opcji i wybrac najszybsza :)

Zawsze wydawalo mi sie, ze to ma wiedziec kompilator.
Czlowiek ma mu jedynie sugerowac, dawac wskazowki
-f_optymalizuj_ile_sie_da -fwole_kod-szybszy_niz_mniejszy(*).
-f_nie_zalezy_mi_na_czasie_kompilacji_rob_dowolne_sztuczki

Z, tym, ze przy (*) ine ma to byc naiwne rozwijanie czego sie da,
kompilator powinien tez wiedziec, ze nieraz kod mniejszy bedzie
szybszy.

> Ciekawe, w moich pomiarach rzadko VC wygrywa. Ale raz
> widzialem jak VC wygenerowal kod az dwa razy szybszy.

> > Jakies pomysly na magiczne opcje dla gcc?
>
> Raczej nie pomoge, osobiscie uzywam go tylko w
> najprostszy sposob:
> g++ -O3 -march=native -mtune=native -fomit-frame-poionter -fprofile-
> generate[use] *.cpp

> Pod poniższym linkiem jest 50 stron o opcjach optymalizacji :)
>

> http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Opt...

50 stron. Zeby dosignac wersje z wylikanymi opacjami:)

Prawde mowiac, budujac konkretne programy pewnie siega sie
po cos w rodzaju intelowskiego kompilatora cpp ktory bedzie
jeszcze szybszy.

> Przy mnozeniu macierzy najbardziej ciekawia mnie opcje:
> -floop-block
> l1-cache-size

Na oko robi to to, co my zrobilismy recznie.
Moze robi to lepiej, trzeba bedzie kiedys sprawdzic.

pozdrawiam i koncze (chyba sie na razie temat wyczerpal)
bartekltg

Mariusz Marszałkowski

unread,
Jan 30, 2010, 7:01:55 PM1/30/10
to

Temat jest ciekawy, ale niestety musze optymalizowac inny kod :/

Pozdrawiam rowniez

0 new messages