MATLAB: функция выполняет 4 рекурсивных вызова. У меня 4-х ядерный процессор. Можно ли распараллелить? - PullRequest
4 голосов
/ 22 сентября 2009

У меня есть 4-ядерный процессор и рекурсивная функция Matlab, которая выполняет четыре рекурсивных вызова:

function J = do_stuff(I)

if some_condition(I)
    J = blah_blah(I);
else
    [I1,I2,I3,I4] = split4(I);

    J1 = do_stuff(I1);
    J2 = do_stuff(I2);
    J3 = do_stuff(I3);
    J4 = do_stuff(I4);

    J = join4(J1,J2,J3,J4);
end

Есть ли способ присвоить do_stuff(I1) ядру 1, do_stuff(I2) ядру 2 и т. Д. До ядра 4?

Ответы [ 4 ]

6 голосов
/ 22 сентября 2009

Нет способа сделать это в базовом Matlab, но Parallel Computing Toolbox предоставляет эту (и другие) функциональные возможности. Вы должны создать массив [I1,I2,I3,I4], а затем использовать параллельную карту для отображения do_suff через этот массив.

3 голосов
/ 23 сентября 2009

Невозможно назначить вычисление непосредственно процессору в MATLAB. Однако есть несколько способов использовать больше процессоров.

Во-первых, есть ряд операций, которые неявно многопоточные в MATLAB. Если blah_blah () в значительной степени опирается на линейную алгебру или поэлементные вычисления, такие как sin или log, работа обычно распределяется по вашим 4 ядрам операционной системой. Эта функциональность просто поставляется с MATLAB.

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

0 голосов
/ 29 сентября 2009

Если вы не хотите платить за Parallel Computing Toolbox, вы можете взглянуть на этот многоядерный пакет . В зависимости от того, над чем вы работаете и сколько у вас данных, это может сработать для вас.

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

Надеюсь, это поможет.

0 голосов
/ 24 сентября 2009

Как полагают другие респонденты, Parallel Computing Toolbox обеспечивает необходимую вам функциональность. Но прежде чем купить его и реализовать свою функцию, подумайте, что вы хотите сделать на первом уровне рекурсивных вызовов. В своем нынешнем виде ваш псевдокод создаст еще 4 вызова для каждого из оригинальных 4. Это может или не может быть тем, что вы хотите.

Лично я думаю, что я бы подошел к этому не с учетом parallel_map, а со встроенным планировщиком заданий и средством createTask.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...