Кажется, я один из немногих, кто использует кодировщик Matlab (команда codegen) для ускорения, судя по тому факту, что в сети так мало обсуждений или помощи. Я получил невероятное ускорение от этого в некоторых случаях. Я никогда не видел, чтобы это было задокументировано, но когда я создаю файл MEX, используя codegen из скрипта Matlab с циклом parfor, он часто передает полученный MEX. Parfor в функциях порождает несколько процессов, которые часто менее эффективны, чем просто многопоточность (я делаю вывод из всего этого, наблюдая за вершиной в Linux и видя несколько 100% процессов в функциях Matlab, но один, например, 1000% процесс при запуске преобразованного MEX). Сейчас я работаю над случаем, когда я действительно мог бы использовать ускорение, но я не вижу доказательств использования нескольких потоков в MEX, хотя parfor работает в базовой функции. Кто-нибудь знает, что может быть зависания, или как кодер выбирает, когда поток?
Когда Matlab выбирает поток при использовании codegen и parfor
Ответы (1)
Он будет выполнять только сам цикл parfor, кодеру было бы опасно догадываться, и невозможно вычислить, где имеется соответствующий параллелизм.
Если бы я был на вашем месте, я бы попытался поставить parfor вместо любого места в коде Matlab, которое я мог бы.
А теперь как определить, приемлем ли цикл для распараллеливания:
- Использует ли он какие-либо результаты из предыдущего расчета, если да, то не пытайтесь, серьезно, это только усугубит ситуацию.
Использует ли он IO в какой-либо форме, если да, то не надо, это замедлит его и уберет из кода любой детерминизм
Есть ли петля для замены парфора? Если нет, то вам придется иметь дело с производительностью, потому что может не распараллеливать ничего.
person
violet_white
schedule
22.10.2013
parfor
в MALTAB работает в фоновых рабочих процессах. MATLAB Coder преобразуетparfor
-циклы в многопоточный код C/C++ с помощью OpenMP (ищите#pragma omp
в сгенерированном коде): mathworks.com/help/coder/ref/parfor.html, mathworks.com/help/coder/ug/ - person Amro   schedule 11.09.2013NumThreads
дляparfor
. Однако, насколько я знаю, не задокументировано, как выбирается количество потоков до этого максимума. Возможно, @Edric узнает, если он слушает? - person Sam Roberts   schedule 11.09.2013setenv('OMP_NUM_THREADS','8')
перед запуском скомпилированной MEX-функции. Обратите внимание, что это может повлиять и на другие встроенные функции, которые также являются многопоточными (я думаю, что это влияет на Intel MKL, предоставляющий подпрограммы BLAS/LAPACK/FFT). - person Amro   schedule 13.09.2013