Gdy Scilab okazuje się za wolny...
23.09.2010 | aktual.: 23.09.2010 23:14
Scilab to znany (szczególnie wśród studentów) pakiet naukowy wykorzystywany w wielu dziedzinach - od prostych obliczeń, przez macierze, algebrę liniową, przetwarzanie sygnałów, statystykę itp. W przeciwieństwie do swojego głównego konkurenta - GNU Octave - nie stara się być klonem Matlaba (a przynajmniej nie dąży do 100% kompatybilności).
Przy porównywaniu tego typu pakietów istotne są dwie kwestie: możliwości i wydajność. Za sprawą Xcos (odpowiednik Matlab/Simulink) Scilab zdaje się mieć większą funkcjonalość od Octave. Posiada również własny edytor o nazwie SciNotes oraz centrum do zarządania modułami ATOMS. Kwestię wydajności można prześledzić przy pomocy tego benchmarka.
Aktualnie trwają przygotowania do wydania wersji 5.3.0 pakietu Scilab. W wersji tej skupiono się szczególnie na poprawie wydajności ("new performance improvements including first HPC features"). Trwają również prace nad wykorzystaniem mocy GPU do obliczeń.
Scilab został stworzony z myślą o obliczeniach numerycznych i w tych sprawdza się dobrze. Gorzej radzi sobie z typowymi zadaniami stawianymi językom programowania, np. z pętlą for. Wydajność tego typu operacji można poprawić stosując podprogramy napisane w językach niższego poziomu np. Fortranie. Niedawno na forum Scilaba toczyła się dyskusja nad użyciem takiego właśnie podprogramu. Istnieje jednak proste rozwiązanie, do którego instrukcję można znaleźć na stronie kompilatora g95.
Na początku podano przykład wykorzystujący pętlę. Można domyślać się, że osiągnięto w ten sposób wzrost wydajności w sensie jakościowym, nie podano natomiast o ile szybciej dzięki temu wykonywane są obliczenia. Zastosujmy zatem podany przykład napisany w Scilabie oraz z wykorzystaniem podprogramu napisanego w Fortranie realizującego to samo zadanie.
a=rand(m,n); b=%pi; tic(); //SUBROUTINE foof(c,a,b,n,m) //INTEGER :: n,m //DOUBLE PRECISION :: a(*),b,c(*) //DO i = 1,m*n // c(i) = sin(a(i))+b //END DO //END SUBROUTINE foof c=call("foof",a,2,"d",b,3,"d",n,4,"i",m,5,"i","out",[m,n],1,"d"); t1=toc(); printf('Scilab + Fortran SUBROUTINE: %6.3f \n',t1) // "Scilab is working with double precision floats." // http://wiki.scilab.org/Scilab_precision d=zeros(m,n); tic(); for i=1:m*n, d(i)=sin(a(i))+b; end t2=toc(); printf('Scilab: %6.3f \n',t2)
Uzyskane czasy obliczeń przedstawiono na poniższym wykresie:
Z wykresu można łatwo odczytać, że zastosowanie w podanym przykładzie podprogramu napisanego w Fortranie pozwala na obniżenie czasu wykonywania pętli ponad 100x.
Do obliczeń wykorzystano laptop z procesorem Intel Core 2 Duo T7100 @1.80GHz 1.80GHz z systemem Windows Vista (32bit), Scilab 5.2.2, G95 0.92.