2009-09-22 1 views
4

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

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?

ответ

6

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

3

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

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

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

0

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

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

0

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

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

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