亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問使用Parfor節省時間和內存?

請問使用Parfor節省時間和內存?

FFIVE 2019-08-03 11:03:15
使用Parfor節省時間和內存?考慮prova.mat在MATLAB中得到如下方法for w=1:100     for p=1:9             A{p}=randn(100,1);      end     baseA_.A=A;     eval(['baseA.A' num2str(w) '= baseA_;'])endsave(sprintf('prova.mat'),'-v7.3', 'baseA')若要了解數據中的實際維度,1x9 cell在……里面A1由以下內容組成9陣列:904x5, 913x5, 1722x5, 4136x5, 9180x5, 3174x5, 5970x5, 4455x5, 340068x5..另一個Aj有相似的成分??紤]以下代碼clear allload provaticparfor w=1:100        indA=sprintf('A%d', w);        Aarr=baseA.(indA).A;        Boot=[];        for p=1:9            C=randn(100,1).*Aarr{p};            Boot=[Boot; C];          end        D{w}=Boot;endtoc如果我運行parfor環帶4本地工人在我的Macbook Pro,它需要1.2秒。頂替parfor帶著for需要0.01秒。根據我的實際數據,時間差是3秒對7秒[矩陣的創建]。C也比較復雜]。如果理解正確,問題是計算機必須發送baseA對于每個本地員工來說,這需要時間和記憶。你能提出一個解決辦法嗎?parfor比for?我以為把所有的細胞保存在baseA是一種節省時間的方法,一開始就加載一次,但也許我錯了。
查看完整描述

2 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

一般信息

很多功能隱式多線程內置,使.parfor當使用這些函數時,循環效率不會比串行函數高。for循環,因為所有的核心都已經被使用了。parfor在這種情況下實際上是一種損害,因為它具有分配開銷,同時與您試圖使用的函數是并行的。

當不使用隱式多線程函數之一時parfor基本上建議在兩種情況下進行迭代:循環中的大量迭代(例如,1e10),或者每次迭代需要很長的時間(例如,eig(magic(1e4)))。在第二種情況下,您可能需要考慮使用spmd(比parfor根據我的經驗)。原因parforfor循環用于短期或快速迭代是正確管理所有工作人員所需的開銷,而不僅僅是進行計算。

查帳這個問題有關在不同員工之間拆分數據的信息。

標桿

電碼

請考慮下面的示例來查看for相對于parfor..如果您還沒有打開并行池,那么首先打開它:

gcp; % Opens a parallel pool using your current settings

然后執行幾個大循環:

n = 1000; % Iteration numberEigenValues = cell(n,1); % Prepare to store the dataTime = zeros(n,1);for ii = 1:ntic
    EigenValues{ii,1} = eig(magic(1e3)); % Might want to lower the magic if it takes too longTime(ii,1) = toc; % Collect time after each iterationendfigure; % Create a plot of resultsplot(1:n,t)title 'Time per iteration'ylabel 'Time [s]'xlabel 'Iteration number[-]';

然后用同樣的方法parfor而不是for..您會注意到,每次迭代的平均時間會增加(我的情況是0.27s到0.39s)。但是要意識到parfor使用所有可用的工人,因此總時間(sum(Time))必須除以計算機中的核數。因此,就我的情況而言,總時間從大約270秒下降到了49秒,因為我有一個八進制處理器。

因此,當每次單獨迭代的時間增加時,使用parfor關于使用for,總時間大大減少了。

結果

這張照片顯示了測試的結果,因為我只是在我的家庭PC上運行它。我用n=1000eig(500)我的電腦有一個i5-750 2.66GHz處理器,有四個核,運行MATLABR201a。正如您所看到的,并行測試的平均值在0.29s左右徘徊,并且有很大的擴展,而串行代碼在0.24s左右相當穩定。然而,總時間從234秒下降到72秒,速度提高了3.25倍。這并不完全是4的原因是內存開銷,如每次迭代所需的額外時間所表示的那樣。內存開銷是由于MATLAB必須檢查每個內核正在做什么,并確保每個循環迭代只執行一次,并且數據被放入正確的存儲位置。


查看完整回答
反對 回復 2019-08-04
  • 2 回答
  • 0 關注
  • 400 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號