2009-08-14 14 views
10

Właśnie napisałem program Matlab w języku C++ jako funkcję mex, aby przyspieszyć działanie, z fantastycznymi rezultatami. Ta decyzja optymalizacyjna była bardzo dobrym pomysłem z przyspieszeniem do 20 razy bez gwintowania. Wciąż mnie ciekawi, na co funkcja mex spędza czas i chce zidentyfikować możliwe wąskie gardła.Profilowanie funkcji mex

Szukam sposobu na profilowanie funkcji mex. Profiler Matlab jest mało przydatny, a pozostałe profilery, które pobrałem (zarówno bezpłatne, jak i próbne), chcą uruchomić plik wykonywalny. Nie jestem mex-guru, ale o ile zrozumiałem, jedynym sposobem na uruchomienie mex jest z poziomu Matlaba. Funkcja mex jest kompilowana do biblioteki dll, ale nazywa się .mex64. Więc ten problem powinien być podobny do profilowania biblioteki DLL. Aby napisać funkcję mex C++, użyłem VS2005 dla jednego użytkownika (tj. Nie wersji zespołowej) i działam na platformie x64.

Czy ktoś wie o dobrym sposobie profilowania funkcji mex? Jakiego narzędzia należy użyć i jak z niego korzystać, kiedy zaczynam od programu Matlab? Czy istnieje inny sposób profilowania kodu C++?

Odpowiedz

8

Jedynym sposobem, w jaki udało mi się to zrobić, jest oddzielenie funkcji wykonującej pracę i zapisanie osobnego opakowania (zamiast funkcji mexFunction), które ładuje pliki .mat danymi testowymi i działa jako samodzielny plik wykonywalny. można to następnie profilować za pomocą np. gprof

+0

Dzięki za cynk. To dobre podejście. Jedynym moim problemem jest to, że dane wejściowe do funkcji mexFunction to duży zbiór dużych struktur matlab. Muszę napisać kod, aby stworzyć wszystkie te rzeczy w opakowaniu, aby móc je uruchomić, co powstrzymuje mnie od zrobienia tego przy jednym i bez żadnej myśli. – AnnaR

+1

nie przestrzegaj. nie możesz stworzyć wszystkich swoich struktur wewnątrz programu matlab i zapisać je w pliku .mat? (cokolwiek, co było poprzednio argumentem wejściowym do twojej funkcji mex, jest teraz zapisywane w pliku .mat i odczytywane przez nowe opakowanie z dysku.) – second

+0

Możliwe jest profilowanie plików mex bezpośrednio za pomocą valgrind. Sprawdź [to] (http : //stackoverflow.com/questions/11220250/how-do-i--profile-a-mex-function-in-matlab/12405131#12405131) odpowiedź. – angainor

3

Czy istnieje sposób, aby uruchomić całość pod VC IDE. Jakbyś mógł powiedzieć "debugować DLL Foo.dll, używając Matlaba jako aplikacji startowej".

Następnie, jeśli pasek funkcji, którego używasz w Foo.dll działa w < 1 s, upewnij się, że Matlab wywołuje go wiele razy, lub dodaj funkcję otoki w bibliotece DLL, aby wywołać ją wiele razy.

Jeśli możesz dojść do tego punktu, możesz użyć narzędzia manual call stack sampling technique, które naprawdę działa, mimo że nie jest popularne lub nie wymaga instalacji narzędzia.

1

Dwa możliwe rozwiązania oprócz tych już zaproponowanych.

  1. Możliwe jest napisanie skryptu, który ładuje dane, uruchamia funkcję mex, a następnie kończy działanie. Następnie możesz pozwolić profilerowi wywołać plik wykonywalny Matlab z tym skryptem. To działało dla mnie z profilowaniem wizualnym nVidii podczas profilowania funkcji mex CUDA.

  2. Jeśli zbudowałeś funkcję mex w Visual Studio, powinieneś być w stanie dołączyć się do procesu Matlaba, a następnie uruchomić funkcję debugowania lub profilowania.