Есть ли издержки, когда файл C ++ mex заканчивается и передает данные обратно в MATLAB? - PullRequest
1 голос
/ 18 сентября 2011

Я написал 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.и т. д.

Если бы кто-нибудь мог пролить свет на этот вопрос, он был бы очень признателен.

Большое спасибо

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Я думаю, что вы правы относительно того, что задержка пропорциональна размеру данных.Я понял это после моего поста!Я также запустил код с таймингами в C ++, используя GetTickCount, и получаю почти то же самое время, что и с tic / toc.

Я использую intel i5 для тестирования многопоточности.Кажется, что разделение не является четным, однако кажется странным, что оно всегда в конце, а не в расчетах.Два ядра доходят до 100% в начале кода и остаются там до конца.Я предполагаю, что один поток должен заканчиваться раньше другого, хотя из циклов они должны быть очень равномерно распределены между двумя потоками и не отличаться на 20%.

Спасибо за ваш ответ.Теперь я удовлетворен тем, что нет никаких издержек при передаче данных между MATLAB и файлом mex.Я просто разбираюсь с многопоточным кодированием C ++ !!!

1 голос
/ 18 сентября 2011

Я могу вызывать функцию mex (которая также использует OpenMP) в моей системе, передавая и выводя довольно большой объем данных (около 100 МБ, около 6 МБ) менее чем за миллисекунду в соответствии с tic / toc, что скорее означает, что любая последующая обработка MatLab в моем случае очень минимальна.

Какой класс данных вы возвращаете (реальные или сложные матрицы, массивы ячеек, структурные массивы или что-то еще) и сколько данных?

Помните, что OpenMP, возможно, не сможет распараллелить весь ваш код, часто в конце необходим шаг сокращения, или разделение вычислений может быть неравномерным, так что один процессор занимает больше времени, или у вас может быть кусок обработки без OpenMP псевдокомментарии. Но я не думаю, что возвращение в MatLab вызывает задержку, которую вы видите.

...