S�awa i nagroda!!!
Konkursowym wyzwaniem jest opracowanie od podstaw i ca�kowicie samodzielnie jak najszybszej funkcji bestdgemm
mno�enia dw�ch macierzy NxN, tzn. implementacja dzia�ania algebry liniowej
C = AB.
Mo�na u�ywa� dowolnego (ale poprawnego ;-) algorytmu mno�enia macierzy: zwyk�ego z GALu ("wiersz razy kolumna"), Strassena, itd. Mo�na stosowa� (niemal) dowolne sztuczki: programowanie w assemblerze, masywn� r�wnoleg�o��, OpenMP, itp. S� tak�e pewne warunki formalne przyj�cia rozwi�zania:
Uwaga! W trakcie konkursu mog� pojawia� si� jakie� w�tpliwo�ci, uwagi, itp. powoduj�ce kosmetyczne (mam nadziej�) zmiany w zadaniu. Prosz� wi�c �ledzi� na bie��co modyfikacje tej strony!
Funkcja powinna mie� nast�puj�cy format wywo�ania:
void bestdgemm(double *A, double *B, double *C, int N);
Umawiamy si�, �e tablice A
, B
, C
s� jednowymiarowe d�ugo�ci N2,
ich elementami s� liczby typu double
i zachodzi nast�puj�ca relacja pomi�dzy elementami tabicy w programie,
a abstrakacyjnym tworem matematycznym, jakim jest macierz:
A[(j-1)*N+i-1]
= Ai,j, dla i,j = 1..N (analogicznie dla B
, C
).
Podstawowym (lecz niekoniecznie jedynym) kryterium oceny funkcji jest ca�kowity czas dzia�ania (real time) nast�puj�cego programu, kt�ry wywo�uje funkcj� bestdgemm
:
- /*
- Standardowa kompilacja:
- gcc -o testdgemm -static -O3 -funroll-loops -malign-double -fopenmp testdgemm.c bestdgemm.c -lblas -lpthread -lgfortran -lm
- Uruchomienie:
- time ./testdgemm
- Wyniki na students.mimuw.edu.pl:
- [przykry@students ProgramyC]$ time ./testdgemm
- [ 16.......]
- [ 32.......]
- [ 64.......]
- [ 128.......]
- [ 256.......]
- [ 512.......]
- [1024.......]
- [2048.......]
-
- real 3m43.872s
- user 3m38.312s
- sys 0m2.373s
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #define MAXN 2048 /* maksymalny rozmiar macierzy; w testach mo�e by� wi�cej lub mniej */
- #define MULT 2 /*skok w rozmiarze macierzy; je�li badam macierz wymiaru K, to nast�pna ma wymiar MULT*K; w testach mo�e mie� inn� warto��, np. 3 */
- #define DONE fprintf(stderr,".")
- #define mtxalloc(N) malloc((N)*(N)*sizeof(double))
- #define mtxinit(A,N) {int i; for(i=0; i < (N)*(N); A[i]=i++);} /* lub cos podobnego */
- /* macierze kwadratowe *//* wymiar macierzy */"[%4d"/* 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() */"]\n");
- } /* for... */
Testy podstawowe wykonam poleceniem time ./testdgemm na komputerze z procesorem Intel Core 2 Duo E6550, w razie w�tpliwo�ci skorzystam z bardziej precyzyjnych metod pomiaru.
Je�li w komentarzu do funkcji bestdgemm
nie zostanie zaznaczone inaczej, program testuj�cy zostanie skompilowany poleceniem jak powy�ej.
W komentarzu do funkcji warto tak�e za��czy� uzyskane przez siebie wyniki na students.mimuw.edu.pl. Niestety nie mo�emy wykorzysta� students.mimuw.edu.pl jako maszyny referencyjnej, bo czasy wykonania podlegaj� du�ym fluktuacjom.
Konkurs odbywa si� w trzech kategoriach:
Por�wnanie wszystkich wynik�w we wszystkich kategoriach zamieszcz� na tej stronie najwcze�niej w czerwcu (je�li autor zastrze�e sobie anonimowo��, podam tylko jego nick).
Nagroda zostanie wr�czona zwyci�zcy w najszerszej z mo�liwych kategorii.
Dzi�kuj� wszystkim zawodnikom i gratuluj� niesamowitych czas�w!!! Zawody by�y naprawd� emocjonuj�ce, a kolejno�� zawodnik�w zmienia�a jak w kalejdoskopie. Cho� najszybszy program napisa� p. Skrzypczy�ski, to zwyci�y� p. Maczy�ski. Niestety, program p. Skrzypczy�skiego zak�ada, �e wymiar macierzy jest wielokrotno�ci� liczby 4.
Mam nadziej�, �e w przysz�orocznej edycji dojdzie do prawdziwie morderczego starcia!
Miejsce | Zawodnik | Czas (s) | Nades�any kod | Wynik i uwagi |
---|---|---|---|---|
ATLAS | 5.5 | |||
Krzysztof Skrzypczy�ski | 11.1 | bestdgemm.c | Niestety nie dzia�a dla niekt�rych wymiar�w macierzy | |
1. | Kornel Maczy�ski | 32.7 | bestdgemm.c | Najszybszy na MIM. Szybszy od std BLAS. |
BLAS | 69.2 | |||
Sebastian Chojniak | 84.2 | Niestety �le/nie dzia�a dla macierzy du�ych wymiar�w | ||
2. | Radomir Mastalerz | 486.2 | bestdgemm.c |
Pomiary czasu na komputerze LABowym, Dell Precision 390, z procesorem Intel(R) Core(TM)2 CPU DualCore 6600 2.40GHz, 4MB cache. Wielokrotnie mno�ono macierze wymiaru od 16 do 2048. Punktem odniesienia by�y standardowe BLASy ze students oraz ATLAS niestety z nieco innej (prawdopodobnie troch� szybszej - dzi�kuj� p. Skrzypczy�skiemu za zwr�cenie uwagi) maszyny, Intel Core 2 Duo DualCore E6550 2.30GHz, 4MB cache.