Когда Matlab выбирает поток при использовании codegen и parfor

Кажется, я один из немногих, кто использует кодировщик Matlab (команда codegen) для ускорения, судя по тому факту, что в сети так мало обсуждений или помощи. Я получил невероятное ускорение от этого в некоторых случаях. Я никогда не видел, чтобы это было задокументировано, но когда я создаю файл MEX, используя codegen из скрипта Matlab с циклом parfor, он часто передает полученный MEX. Parfor в функциях порождает несколько процессов, которые часто менее эффективны, чем просто многопоточность (я делаю вывод из всего этого, наблюдая за вершиной в Linux и видя несколько 100% процессов в функциях Matlab, но один, например, 1000% процесс при запуске преобразованного MEX). Сейчас я работаю над случаем, когда я действительно мог бы использовать ускорение, но я не вижу доказательств использования нескольких потоков в MEX, хотя parfor работает в базовой функции. Кто-нибудь знает, что может быть зависания, или как кодер выбирает, когда поток?


person Mastiff    schedule 10.09.2013    source источник
comment
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.2013
comment
Вы можете указать максимальное количество потоков, используя вход NumThreads для parfor. Однако, насколько я знаю, не задокументировано, как выбирается количество потоков до этого максимума. Возможно, @Edric узнает, если он слушает?   -  person Sam Roberts    schedule 11.09.2013
comment
@SamRoberts: вы можете использовать переменные среды для управления максимальным количеством потоков. Попробуйте установить setenv('OMP_NUM_THREADS','8') перед запуском скомпилированной MEX-функции. Обратите внимание, что это может повлиять и на другие встроенные функции, которые также являются многопоточными (я думаю, что это влияет на Intel MKL, предоставляющий подпрограммы BLAS/LAPACK/FFT).   -  person Amro    schedule 13.09.2013


Ответы (1)


Он будет выполнять только сам цикл parfor, кодеру было бы опасно догадываться, и невозможно вычислить, где имеется соответствующий параллелизм.

Если бы я был на вашем месте, я бы попытался поставить parfor вместо любого места в коде Matlab, которое я мог бы.

А теперь как определить, приемлем ли цикл для распараллеливания:

  1. Использует ли он какие-либо результаты из предыдущего расчета, если да, то не пытайтесь, серьезно, это только усугубит ситуацию.
  2. Использует ли он IO в какой-либо форме, если да, то не надо, это замедлит его и уберет из кода любой детерминизм

  3. Есть ли петля для замены парфора? Если нет, то вам придется иметь дело с производительностью, потому что может не распараллеливать ничего.

person violet_white    schedule 22.10.2013