1

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

+0

'parfor' в MALTAB работает на фоне рабочих процессов. MATLAB Coder преобразует 'parfor'-loops в многопоточный код C/C++, используя OpenMP (поиск' #pragma omp' в сгенерированном коде): http://www.mathworks.com/help/coder/ref/parfor.html , http://www.mathworks.com/help/coder/ug/acceleration-of-matlab-algorithms-using-parallel-for-loops-parfor.html – Amro

+0

Вы можете указать максимальное количество потоков, используя 'NumThreads' ввод в 'parfor'. Однако, насколько я знаю, не указано, как выбрано количество потоков до этого максимума. Возможно, Эдди узнает, если он слушает? –

+0

@SamRoberts: вы можете использовать переменные среды для управления максимальным количеством потоков. Попробуйте установить 'setenv ('OMP_NUM_THREADS', '8')' перед запуском скомпилированной MEX-функции. Обратите внимание, что это может повлиять и на другие встроенные функции, которые также многопоточны (я думаю, что на Intel MKL, поддерживающие процедуры BLAS/LAPACK/FFT) – Amro

ответ

0

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

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

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

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

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

Смежные вопросы