Mnożenie skalarne a wydajność

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Mnożenie skalarne a wydajność

Post 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
Awatar użytkownika
maszup
Posty: 57
Rejestracja: 04 sty 2007 00:00
Lokalizacja: Wrocław

Re: Mnożenie skalarne a wydajność

Post autor: maszup »

na przypadku ostatnim (3) moznaby zaoszczedzic z 0.5-1ms wg rysunku.

przypadek (2) to jakas porazka!! ;)
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Re: Mnożenie skalarne a wydajność

Post 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
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: Mnożenie skalarne a wydajność

Post 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?
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Re: Mnożenie skalarne a wydajność

Post 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
ODPOWIEDZ