2015-08-20 92 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秒,如果這包括在parfor時間林沒有驚訝它需要更長的時間。 – 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風格」來編寫它。

第二個問題:瞭解並行計算。

並行計算適用於存在巨大問題時,需要幾分鐘或幾小時的時間,並且希望將它們拆分爲更小的部分。它的工作方式是將大量工作發送給不同的處理器。與計算相比,將信息發送到每個處理器需要時間A LOT。並行計算的實際原因是因爲通常解決的問題在計算上非常昂貴,您不介意花費一些額外的時間來發送和接收內存塊。

A 1e6 x 1矩陣定義爲不是是個大問題,因此不適合並行計算。特別是,如果你正在做的是15數學運算!

很可能您的並行計算代碼需要99%的時間將a(i)-f(i)發送給每位工作人員,並且1%的時間進行數學計算。因此,你正在讓你的代碼變得更慢,因爲你正在移動大量內存來進行幾次乘法運算!

編輯:當我說你的代碼不好時,我的意思是什麼?

簡單的例子:編寫代碼矢量和你寫的和比較的時間

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