Łączę MATLAB z C/C++ za pomocą MATLAB Engine API.Przyspieszenie wywołania Matlab Engine
W moim konkretnym przypadku MATLAB jest wykorzystywana do obliczenia czegoś, a wynik jest drukowany w C. Jednak w całej różnych testów na obu stronach zauważyłem znaczne straty wydajności w C.
Oto przykład z wywołań funkcji MATLAB :
tic;
data = predictIM(data);
toc;
po stronie C zgłoszę podobne funkcje, co następuje:
iMod::Timer_T<high_resolution_clock> t;
engPutVariable(ep, "data", dataContent);
engEvalString(ep, "[posture] = predictIM(data);");
UT_NOTIFY(LV_DEBUG,"The execution took "<<t.seconds());
Moja implementacja zegar w C++ wygląda jak następująco:
template< class Clock >
class Timer_T
{
typename Clock::time_point start;
public:
Timer_T() : start(Clock::now()) {}
typename Clock::duration elapsed() const {
return Clock::now() - start;
}
double seconds() const {
return elapsed().count() *
((double)Clock::period::num/Clock::period::den);
}
};
Powyższy kod MATLAB przebiega w temperaturze około 180 klatek na sekundę, w tym ustawieniu matrycy (data
), podczas gdy kod C, tylko w 24 klatkach. Użyłem tic
/toc
do pomiaru czasu wykonania w MATLAB, podczas gdy moja własna implementacja timera jest używana po stronie C/C++.
Podczas profilowania aplikacji zauważyłem, że wywołania silnika MATLAB są wąskim gardłem. Wiem, że implementacja Linux MATLAB Engine używa nazwanych potoków do łączenia się z MATLAB i zastanawiałem się, czy istnieje sposób na przyspieszenie komunikacji MATLAB z jego silnikiem?
To nie jest C, to C++. –
Prawda. Przepraszam, że nie jest jasne. Zaimplementowałem silnik Matlab w C i obliczyłem czasy w C++ (gdzie używam dalej wyników Matlaba) – Dave
@Dave: Myślę, że nie ma nic, co mógłbyś zrobić naprawdę, Engine API to kolejna warstwa, która dodaje narzut ze względu na wszystkie dane marshaling tam iz powrotem ... Zakładam, że łączysz się z MATLAB raz na starcie i ponownie używasz otwartego połączenia dla każdego obliczenia, prawda? Otwieranie i zamykanie połączenia z procesem MATLAB może być bardzo powolne. – Amro