Strona 1 z 1

Mnożenie skalarne a wydajność

: 24 sty 2008 12:56
autor: vugie
Trochę ciekawostka, trochę pytanie...

Piszę program, w którym wykonuje się baaardzo dużo skalarnych mnożeń wektorów. Zrobiłem VI, który testuję szybkość działania czterech pozornie ekwiwalentnych algorytmów (patrz załącznik, LV821). Najszybszy okazał się ostatni, a najwolniejszy trzeci (skopiowany z darmowej biblioteki MGI). Pytanie brzmi: czy da się jeszcze szybciej?

Do mierzenia czasu użyłem stopera z OpenG (bo nie cierpię Flat Sequence). Jak ktoś nie ma, to może sobie zrobić według "screenshotu" poniżej :)

tick count-------------------->output
error in ----------------------> error out

Re: Mnożenie skalarne a wydajność

: 25 sty 2008 06:26
autor: maszup
na przypadku ostatnim (3) moznaby zaoszczedzic z 0.5-1ms wg rysunku.

przypadek (2) to jakas porazka!! ;)

Re: Mnożenie skalarne a wydajność

: 25 sty 2008 09:27
autor: vugie
faktycznie przyspiesza jakieś 1.5%

Co ciekawe formula node działa tak samo szybko jak ten najszybszy, ale ma też stosunkowo dużą zmienność czasu działania
a skrypt jest taki:
float c=0;
int i;
for(i=0;i<3;++i)
c+=a*b;

z pętlą czy bez pętli działa tak samo szybko, a jak się usunie wszyskie white spacy to nawet ciut szybciej.

Próbowałem jeszcze MathScripta, ale zanim w ogóle cokolwiek uruchomiłem tak mi zamulił komputer, że się poddałem

Re: Mnożenie skalarne a wydajność

: 25 sty 2008 12:56
autor: jogurt_owocowy
U mnie to wygląda inaczej niż u Was (czasy uśrednione po kilkudziesięciu próbach): (0) 71,92 ms
(1) 64,84 ms (2) 62,58 ms (3) 61,56 ms
Albo zależy to od procesora (u mnie Sempron 2600+) albo od wersji LV (8.5). A wygrywa... Formula Node:
[img]http://www.labview.pl/uploads/veir/fast ... cation.gif[/img]
To potwierdzałoby tezę postawioną gdzieś w tym wątku, że Formula Node jest ogólnie szybki z wyjątkiem indeksowania tablic, ale... Jeśli takie benchmarki mają być miarodajne, to jednak wypadałoby do mnożenia nie używać stałych. Odkąd do LV wprowadzono Constant Folding (można by ogłosić konkurs na jakąś polską nazwę) takie mnożenie stałych może nie mówić nic. Przykładowo po zamknięciu stałych klastrów w subviaju (przez co LV nie używa dla nich foldingu) wyniki zmieniają się diametralnie:
(0) 378,2 ms (1) 601,6 ms (2) 642,6 ms (3) 364,6 ms
a rozwiązanie z obrazka - 453,2 ms.
A tak z ciekawości dlaczego przechowujesz wektory w formie klastrów a nie tablic?

Re: Mnożenie skalarne a wydajność

: 25 sty 2008 13:19
autor: vugie
A tak z ciekawości dlaczego przechowujesz wektory w formie klastrów a nie tablic?
A bo zrobiłem 2 wersje dla tego benchmarka - dla klastrów i dla tablic. I dla klastrów działał szybciej. Sprawdzałem też na innych operacjach.
Ja puszczałem ten benchmark u siebie dla 300 mln przekręceń pętli, bo dopiero wtedy wskazania dla formula node się stabilizowały. A i tak były wachnięcia w granicach 1-2% (czasem szybciej, czasem wolniej od ostatniego). Dlatego zdecydowałem się na rozwiązanie ostatnie, zmodyfikowane przez fonzo