Я написал mex-файл, используя C ++, чтобы увеличить скорость медленных циклов for в MATLAB.Я написал две версии, одна без openMP и одна с.Достигнутые результаты были очень хорошими, однако при тестировании времени, которое я заметил, из-за многопоточности неожиданный результат: задержка по времени, когда mex-файл возвращается обратно в MATLAB.
Я запускаю программычерез мастер-файл в MATLAB, который вызывает обе версии mex-файла и время их, используя tic-toc;он также рассчитывает сами циклы.После завершения каждого mex-файла время отображается в командном окне MATLAB по мере выполнения следующего вычисления.Кроме того, когда запускается многопоточный mex-файл, это очевидно из наблюдения за использованием процессора, так как оба процессора достигают 100%.Код имеет формат
Initial data generation for inputs....;
tic;
[Output] = mex_unthreaded(inputs...);
Time_unthreaded = toc
tic;
[Output_threaded] = mex_threaded(inputs...);
Time_threaded = toc
tic;
MATLAB loops...;
Time_MATALB = toc
Из не-openMP mex-файла не очевидно, когда C ++ возвращается обратно в MATLAB, так как нет никаких определенных изменений в использовании процессора.Однако при запуске mex-файла openMP существует очевидная конечная точка для кода C ++, когда он возвращается обратно в MATLAB: загрузка ЦП снижается.Это означает, что я могу примерно рассчитать время C ++ от наблюдения за использованием процессора.Похоже, что с момента, когда нагрузка на ЦП снижается, и до появления времени в MATLAB наблюдается примерно 20-процентная задержка.Например, наблюдая за использованием процессора, я получаю ~ 300 с для того, чтобы процессор был на 100%, а затем дополнительные ~ 75 с, пока MATLAB не зарегистрирует ~ 377 с за счет времени tic-toc.
Я могу только думать, что этоЭто своего рода издержки при передаче данных обратно в MATLAB, так как время задержки увеличивается по мере увеличения выводимых данных.Причина, по которой меня не устраивает этот результат, заключается в том, что я думал, что данные были обработаны в C ++ указателями на MATLAB mxArrays в памяти MATLAB.Поэтому не должно быть никакой передачи какой-либо информации.
Вторая возможность, о которой я подумал, заключается в том, что MATLAB может выполнять некоторую форму анализа данных после окончания работы файла mex, например, max-mins.и т. д.
Если бы кто-нибудь мог пролить свет на этот вопрос, он был бы очень признателен.
Большое спасибо