日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Matlab并行编程方法

發(fā)布時(shí)間:2025/3/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Matlab并行编程方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文講一下matlab中的并行方法與技巧,這里我們不涉及GPU加速,主要考慮for循環(huán)并行和數(shù)據(jù)并行。分為以下幾個(gè)板塊:

1. 怎么并行?

2. parfor vs. SPMD

3. 注意事項(xiàng)及經(jīng)驗(yàn)總結(jié)



-----------------------------------------------------------

1. 如何并行?

1. Request a number of workers;
2. Issue the normal command to run the program. The client program will call on the?workers as needed;
3. Release the workers;

具體到代碼:

[plain]?view plain?copy ?
  • matlabpool?local?2;??
  • ????%parallel?program??
  • matlabpool?close??

  • 其中2是core數(shù)目,注意2是core數(shù)。你的電腦如果是雙核四線程的,那么只能申兩個(gè)(而非4個(gè))matlab local pool。

    具體實(shí)現(xiàn)parallel program呢,主要是通過(guò)parfor(parallel for)和SPMD(single program, multiple data)完成的。




    -----------------------------------------------------------

    2. parfor vs. SPMD

    2.1 什么時(shí)候用parfor

    parfor只用于matlab并行循環(huán)。當(dāng)你需要簡(jiǎn)單計(jì)算的多次循環(huán)迭代時(shí),例如蒙特卡洛(Monte Carlo)模擬,parfor循環(huán)就很有用。parfor將循環(huán)迭代分組,那么每個(gè)worker執(zhí)行迭代的一部分。當(dāng)?shù)臅r(shí)很長(zhǎng)的時(shí)候parfor循環(huán)也是有用的,因?yàn)閣orkers可以同時(shí)執(zhí)行迭代。

    注意當(dāng)循環(huán)中有迭代依賴其他迭代的結(jié)果時(shí)不應(yīng)該使用parfor循環(huán)。每個(gè)迭代都必須不依賴其他迭代。由于parfor循環(huán)內(nèi)有通信消耗,當(dāng)只有小數(shù)量的簡(jiǎn)單計(jì)算時(shí)使用parfor可能得不到什么好處。

    [plain]?view plain?copy ?
  • c?=?1:10;??
  • a?=?ones(10,1);??
  • tic??
  • parfor?i?=?1:length(c)??
  • ????a(i)=?a(i)+?c(i);??
  • end??
  • toc??
  • fprintf('%d\n',a);??


  • 2.2 什么時(shí)候用SPMD(Single Program/Multiple Data)單程序多任務(wù)進(jìn)行任務(wù)并行

    Spmd中的“Single program”方面指的是同一段代碼運(yùn)行在不同的多個(gè)lab上。你在一個(gè)Matlab客戶端上運(yùn)行一個(gè)程序,被標(biāo)志為spmd模塊的其他部分運(yùn)行在其他lab上。當(dāng)這些塊運(yùn)行完畢后,你的程序繼續(xù)在客戶端運(yùn)行。?“Multiple data”方面指的是雖然spmd語(yǔ)句在所有的lab上運(yùn)行相同的代碼,但每一個(gè)lab可以有不同的,獨(dú)有的數(shù)據(jù)。所以多數(shù)據(jù)集可以在多個(gè)lab上同時(shí)被容納。一下是我總結(jié)的SPMD使用的兩個(gè)場(chǎng)景:


    The "single program" aspect of spmd means that the identical code runs on multiple labs. 就是說(shuō)同一段程序應(yīng)用于不同的樣本(數(shù)據(jù)),所以一般針對(duì)隨機(jī)抽樣的并行,如

    [plain]?view plain?copy ?
  • %%?SPMD??
  • %example?1??
  • spmd???
  • A?=?rand(3,2);?%generate?a?matrix?A?for?each?lab(worker)??
  • end??
  • for?i?=?1:length(A)??
  • ????figure;?imagesc(A{i});???
  • end??
  • ??
  • %example?2??
  • a?=?3;??
  • b?=?4;??
  • spmd??
  • ????c?=?labindex();??
  • ????d?=?c+a;??
  • end??
  • c{2}?=?5;??
  • spmd??
  • ????f?=?c*b;??
  • end??
  • for?i?=?1:length(f)??
  • ????fprintf('%d\t',f{i});%access?the?value?of?each?lab??
  • end??

  • 另外,SPMD也可以用于可替代parfor的塊并行,在不同lab(worker)上對(duì)相同或不同的數(shù)據(jù)執(zhí)行不同的并行操作,說(shuō)起來(lái)有些拗口,具體看一下例子就明白了,下面我寫的example3,4分別針對(duì)在不同lab上對(duì)相同數(shù)據(jù)和不同數(shù)據(jù)執(zhí)行不同操作。它們都可以用parfor代替,對(duì)吧,這里我就不寫了,相信大家的能力。。

    [plain]?view plain?copy ?
  • %example3?-?deal?with?same?Data?by?different?parameters??
  • %add?different?values?to?same?array?Data??
  • Data?=?1:100;??
  • spmd??
  • ????switch?labindex??
  • ????????case?1??
  • ????????????Data?=?Data+1;??
  • ????????case?2??
  • ????????????Data?=?Data+2;??
  • ????end??
  • end??
  • %?print?Data{1}?&?Data{2}?for?checking??
  • ??????????????
  • %example4???
  • %add?different?values?for?different?parts?of?array?Data??
  • %?[1:50]+1??
  • %?[51:100]+2??
  • spmd??
  • ????if?labindex?==?1??
  • ????????Data(1:50)?=?Data(1:50)+1;??
  • ????else??
  • ????????Data(51:100)?=?Data(51:100)+2;??
  • ????end??
  • end??

  • 以上是我對(duì)spmd和parfor的理解,歡迎補(bǔ)充指正,其他關(guān)于spmd vs. parfor的可以參考這個(gè)帖子。


    2.3 Composite類型

    spmd中每個(gè)lab返回值以composite存儲(chǔ),如上面[code]example 1中的f就是以composite的形式展現(xiàn)。f{i}為第i個(gè)lab的返回值。最開(kāi)始我們也可以創(chuàng)建Composite對(duì)象并進(jìn)行初始化賦值。

    >>??f = Composite(2);



    -----------------------------------------------------------

    4. 注意事項(xiàng)及經(jīng)驗(yàn)總結(jié)

    注意事項(xiàng)

    1. parfor中慎用(最好勿用)eval幅值。

    一個(gè)程序并行時(shí)要共享內(nèi)存,而eval語(yǔ)句可能使程序進(jìn)入錯(cuò)誤的workspace,因此不要用eval,改用不同index賦值。

    [plain]?view plain?copy ?
  • matlabpool?local?2;??
  • c?=?1:5;??
  • parfor?i?=?1:length(c)??
  • ????a(i)?=?c(i);??
  • end??



  • 2. parfor循環(huán)不能很好利用所有處理器怎么辦?

    是這樣,

    [python]?view plain?copy ?
  • parfor?i?=?1:4??
  • ........??
  • end??

  • 就只能用4個(gè)處理器,而如果不加這個(gè)parfor可能matlab自身的負(fù)載均衡能夠更好地利用CPU。這里我是開(kāi)起來(lái)3個(gè)matlab,比如服務(wù)器上有12個(gè)核。我就給每個(gè)matlab分配4個(gè)core(>>matlabpool local 4),每個(gè)程序里有一個(gè)parfor i = 1:4. 這樣就可以用起來(lái)12個(gè)核。我知道這樣好暴力……囧,有人知道正解的話指條明路吧。。


    3. parfor,spmd不可以相互或者自身嵌套。


    4. parfor使用有很多約束,比如for循環(huán)內(nèi)的表達(dá)式需要顯式表達(dá)(透明性),不依賴前項(xiàng)。如

    parfor i = 3:10

    ? ? ? ?f(i) = f(i-1)+f(i-2);

    end

    是不行滴。。


    歡迎留言其他并行技巧和方法,謝謝!



    Reference:

    1. MATLAB官網(wǎng)——Parallel Computing Toolbox

    2.?詳細(xì)講解并行用法(貌似阿拉伯人寫的……o(╯□╰)o)

    3. 詳細(xì)并行代碼

    4.?多核計(jì)算平臺(tái)中MATLAB并行計(jì)算

    5. Parallel Computing Toolbox?User's Guide


    from:?http://blog.csdn.net/abcjennifer/article/details/17610705#comments

    《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的Matlab并行编程方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。