Mam trochę kodu Matlab, który musi zostać przyspieszony. Poprzez profilowanie zidentyfikowałem określoną funkcję jako sprawcę spowolnienia wykonywania. Ta funkcja nazywa się setki tysięcy razy w pętli.Matlab: Czy wywoływanie tej samej funkcji mexa z pętli powoduje zbyt wiele narzutów?
Moją pierwszą myślą było przekonwertowanie funkcji na mex (używając Matlab Coder), aby przyspieszyć. Jednak wspólny rozsądek programowania mówi mi, że interfejs pomiędzy Matlabem i kodem mex doprowadziłby do pewnego narzutu, co oznacza, że wywoływanie tej funkcji mex tysiące razy nie jest dobrym pomysłem. Czy to jest poprawne? A może Matlab robi trochę magii, gdy jest to ten sam mex, który jest wielokrotnie wywoływany, aby usunąć narzut?
Jeśli jest znaczący głową, myślę restrukturyzacji kodu, tak aby dodać pętlę do samej funkcji i następnie tworząc mex tego. Zanim to zrobię, chciałbym potwierdzić moje założenie, aby uzasadnić czas poświęcony na to.
Aktualizacja:
Próbowałem @ sugestią angainor, a stworzony donothing.m z następującego kodu:
function nothing = donothing(dummy) %#codegen
nothing = dummy;
end
Potem stworzyliśmy funkcję mex od tego jak donothing_mex i próbowałem następujący kod :
tic;
for i=1:1000000
donothing_mex(5);
end
toc;
Rezultatem było to, że milion połączeń z funkcją zajęło około 9 sekund. Nie jest to znaczące obciążenie dla naszych celów, więc na razie myślę, że zmienię wywoływaną funkcję samodzielnie na mex. Jednak wywołanie funkcji z pętli, która wykonuje około miliona razy, wydaje się dość głupim pomysłem z perspektywy czasu, biorąc pod uwagę, że jest to kod krytyczny pod względem wydajności, więc przeniesienie pętli do funkcji mex jest nadal w książkach, ale o znacznie mniejszym priorytecie.
Zdecydowanie przenieś pętlę do kodu. Powinno to wymagać tylko 2 lub 3 dodatkowych linii kodu mex i pozwoli Ci zaoszczędzić prawdopodobnie 8,5 sekundy z tego 9. – twerdster
Sądząc po twoim komentarzu na @ Angainor's odpowiedź, podejście, które robisz, ma posmak [problemu XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), np. MEX, który chcesz utworzyć, aby rozwiązać problem z wydajnością * może * mieć znacznie szybsze rozwiązanie w Matlab, tylko taki, o którym wcześniej nie myślałeś. Czy możesz opublikować esencję obliczeń, które chcesz wykonać w pętli, którą teraz masz? –
@RodyOldenhuis To także dobry punkt. [Przedwczesna optymalizacja jest źródłem wszelkiego zła] (http://shreevatsa.wordpress.com/2008/05/16/premature-optimization-is-the-root-of-all-evil/);) – angainor