-
1. Data: 2010-01-23 01:28:58
Temat: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com>
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;
}
-
2. Data: 2010-01-23 01:33:42
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com>
Poprawka, powinno być:
#define N (1024)
#define M (1024)
#define K (1024)
Wrzucalem do excela na malych rozmiarach i przez
pomylke zostawilem. Sorry.
-
3. Data: 2010-01-23 09:21:27
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com>
On 21 Sty, 09:41, bartekltg <b...@g...com> wrote:
> On 21 Sty, 09:22, thrunduil <t...@w...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
-
4. Data: 2010-01-23 10:01:28
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Wit Jakuczun <w...@g...com>
On 23 Sty, 02:28, Mariusz Marszałkowski <m...@g...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
-
5. Data: 2010-01-23 10:07:46
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com>
On 23 Sty, 11:01, Wit Jakuczun <w...@g...com> wrote:
> On 23 Sty, 02:28, Mariusz Marszałkowski <m...@g...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).
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
-
6. Data: 2010-01-23 10:18:56
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Wit Jakuczun <w...@g...com>
On 23 Sty, 11:07, Mariusz Marszałkowski <m...@g...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
-
7. Data: 2010-01-23 10:19:53
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com>
On 23 Sty, 11:18, Wit Jakuczun <w...@g...com> wrote:
> On 23 Sty, 11:07, Mariusz Marszałkowski <m...@g...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.
>
Dobry pomysl.
-
8. Data: 2010-01-23 10:37:34
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com>
On 23 Sty, 11:19, Mariusz Marszałkowski <m...@g...com> wrote:
> On 23 Sty, 11:18, Wit Jakuczun <w...@g...com> wrote:
>
> > On 23 Sty, 11:07, Mariusz Marszałkowski <m...@g...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.
>
> Dobry pomysl.
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.
-
9. Data: 2010-01-24 10:18:04
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: thrunduil <t...@w...pl>
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.
-
10. Data: 2010-01-24 12:45:24
Temat: Re: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com>
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