2015-08-20 3 views
0

Я новичок в MATLAB, и я просто пытаюсь выполнить параллельную небольшую программу, но проблема в том, что параллельное выполнение занимает больше времени, чем серийный?Параллельное выполнение в MATLAB


close all 
clear all 
clc 

a= rand(1e6,1); 
b= rand(1e6,1); 
c= zeros(size(a)); 
d= ones(size(c)); 
e= zeros(size(d)); 

tic 
tstart=tic; 
for i=1:length(a) 
    c(i)=a(i)+b(i); 
    d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    c(i)=a(i)+b(i); 
    d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    c(i)=a(i)+b(i); 
    d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
end 
t_normal_for=toc(tstart) 

tstart=tic; 
parfor i=1:length(a) 
    c(i)=a(i)+b(i); 
    d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    c(i)=a(i)+b(i); 
    d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    c(i)=a(i)+b(i); 
    d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
end 
t_parfor=toc(tstart) 

*************************************** 
t_normal_for = 

    0.3860 


t_parfor = 

    2.8403 

Может кто-нибудь помочь! На самом деле у меня на моем компьютере 4 сотрудника, а версия MATLAB - R2014a. Другой вопрос, пожалуйста, могу ли я отправить одну и ту же функцию каждому работнику на моем компьютере?

Спасибо заранее Аммар

+0

где вы открываете свой параллельный бассейн? Открытие одного занимает около 2 секунд, и если это включено в парфорумент времени, я не удивляюсь, что это занимает больше времени. – Adriaan

+0

Я только что запустил тот же код, и он дает мне те же результаты, а также когда я открываю свой параллельный пул перед выполнением кода. Возможно, что массивы a и b сначала отправляются всем работникам, тем самым повторяя ваши данные четыре раза, затем выполняется операция, тогда массивы c, d и e должны быть собраны для вашего клиента. Накладные расходы довольно большие. – Adriaan

ответ

5

У вас есть 1 большая проблема: Ваш код не является .... плохо (без обид). На самом деле это не плохой код, это просто не то, как вы пишете код в Matlab.

Вы пишете код Matlab, если он был C, а matlab - не C! В Matlab c(i)=a(i)+b(i) - c=a+b;. тем быстрее это происходит, так как Matlab оптимизирован для векторизации этих вещей.

Прежде чем думать о оптимизации кода, попробуйте написать его в стиле «Matlab style».

Вторая проблема: Понимание параллельных вычислений.

Параллельные вычисления работают, когда у вас есть ОГРОМНЫЕ проблемы, для чего потребуется минут или, скорее всего, часов, и вы хотите разбить их на более мелкие части. Как это работает, вы отправляете куски работы на разные процессоры. И отправка информации каждому из процессоров занимает A LOT времени, по сравнению с вычислениями. Причина, по которой параллельные вычисления практичны, состоит в том, что проблемы, которые обычно решаются, настолько дороги, что вы не против потратить некоторое дополнительное время на отправку и получение блоков памяти.

A 1e6 x 1 матрица определенно не большая проблема, поэтому не подходит для параллельных вычислений. Особенно, если вы делаете 15 математических операций!

Скорее всего, ваш параллельный вычислительный код занимает 99% времени, чтобы отправить a(i)-f(i) каждому из рабочих и 1% времени на выполнение математических вычислений. Таким образом, вы делаете код r медленнее, потому что вы перемещаете много памяти, чтобы сделать пару умножений!

EDIT: Что я имею в виду, когда говорю, что ваш код плохой?

Легкий пример: Написать свой код векторизации и как вы написали и сравнить время

tic 

    c =a +b ; 
    d =c +b .*a +b ./a +b .*a +b ; 
    e =d +c .*a +b ./a +b .*a +b ; 

    c =a +b ; 
    d =c +b .*a +b ./a +b .*a +b ; 
    e =d +c .*a +b ./a +b .*a +b ; 

    c =a +b ; 
    d =c +b .*a +b ./a +b .*a +b ; 
    e =d +c .*a +b ./a +b .*a +b ; 
toc 
tic 
for i=1:length(a) 
    c(i)=a(i)+b(i); 
    d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    c(i)=a(i)+b(i); 
    d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    c(i)=a(i)+b(i); 
    d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
    e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i); 
end 

Результат:

Elapsed time is 0.016057 seconds. 
Elapsed time is 0.288870 seconds. 

ли то же самое. Тем не менее векторизованный код в 18 раз быстрее!

+0

Привет Андер, Большое спасибо за этот ответ. – ammar

+0

@ammaralabdalazeez Счастливое вам понравилось! Подумайте о том, чтобы принять его, если он вам помог. –

+0

Ander. На самом деле, я просто хочу увидеть разницу между последовательным и параллельным выполнением в MATLAB, – ammar

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