-
Data: 2010-01-23 01:28:58
Temat: no to ile czasu matlab mnozy te duze macierze?
Od: Mariusz Marszałkowski <m...@g...com> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]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;
}
Następne wpisy z tego wątku
- 23.01.10 01:33 Mariusz Marszałkowski
- 23.01.10 09:21 Mariusz Marszałkowski
- 23.01.10 10:01 Wit Jakuczun
- 23.01.10 10:07 Mariusz Marszałkowski
- 23.01.10 10:18 Wit Jakuczun
- 23.01.10 10:19 Mariusz Marszałkowski
- 23.01.10 10:37 Mariusz Marszałkowski
- 24.01.10 10:18 thrunduil
- 24.01.10 12:45 Mariusz Marszałkowski
- 24.01.10 16:33 Mariusz Marszałkowski
- 25.01.10 05:54 bartekltg
- 25.01.10 11:47 Mariusz Marszałkowski
- 25.01.10 12:30 thrunduil
- 25.01.10 12:35 bartekltg
- 25.01.10 13:26 bartekltg
Najnowsze wątki z tej grupy
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
- Młodzi programiści i tajna policja
- Ada 2022 Language Reference Manual to be Published by Springer
- Press Release - AEiC 2023, Ada-Europe Reliable Softw. Technol.
- Ada-Europe - AEiC 2023 early registration deadline approaching
- Ada-Europe Int.Conf. Reliable Software Technologies, AEiC 2023
- Ile cykli zajmuje mnożenie liczb 64-bitowych?
Najnowsze wątki
- 2024-05-26 O co chodzi?
- 2024-05-26 PJ autobus-tramwaj
- 2024-05-26 Renault Trafic i lampka z czerwonym STOP
- 2024-05-26 cena pięciocyfrowa
- 2024-05-26 Re: Jak dobra KE "okrada" złą Rosję "dla Ukrainy"
- 2024-05-25 supercap
- 2024-05-25 Sulzbach => Technischer Rollouter (d/m/w) <=
- 2024-05-25 Warszawa => Senior Account Manager <=
- 2024-05-25 Warszawa => Mid PHP Developer (Laravel) <=
- 2024-05-25 Warszawa => Mid PHP Developer (Laravel) <=
- 2024-05-25 Warszawa => Interactive/Experience Designer <=
- 2024-05-25 Warszawa => Key Account Manager <=
- 2024-05-25 Warszawa => SAP WM Consultant / Execution <=
- 2024-05-25 Warszawa => Key Account Manager <=
- 2024-05-25 Re: znów ten wrocław