matlab 多核并行编程
在使用matlab處理大數(shù)據(jù),編程需要注意兩個問題:并行運算和釋放內(nèi)存。matlab也提供了并行計算的功能,甚至能用GPU加速。并行計算工具箱,叫做parallel computing toolbox.它的使用方法,可以從matlab的幫助獲得。
Parallel Computing Toolbox(并行計算工具箱)中加入了并行循環(huán)parfor-loops,對于每一步可以獨立于其他步的循環(huán),計算效率可以有較大幅度的提高。以前簡單的for循環(huán)for-loop是順序的(sequentially)執(zhí)行每一步循環(huán)體(statement),parfor-loop是通過將各個循環(huán)體分配到不同的節(jié)點上進行并行計算。所以parfor的要求是循環(huán)體之間相互獨立,結果各不影響,Matlab的編輯器會自動幫你檢查循環(huán)體的結果是否影響。
當你初始化一個matlab進程時,這個進程被稱為Matlab Client,它起著和用戶交互和調(diào)度的作用。在并行計算工具箱中,通過matlabpool可以打開多個matlab進程,這些進程被稱為Matlab Worker。并行循環(huán)parfor-loop的各個循環(huán)就是隨機的分配到這些Matlab Worker上進行同時的計算。最后再返回給Matlab Client. 在一個多核桌面上可以本地同時運行四個 worker ,如果與 MATLAB Distributed Computing Server 集成,就可以使用集群中任意數(shù)量的機器作為worker了。
parfor就是paralle+for,也就是并行的for循環(huán),怎么個并行法?簡單理解就是,matlab會弄出幾個虛擬的小pc,比如一個算i=1:50部分循環(huán),一個算i=51:90部分循環(huán),再來一個算i=91:100部分循環(huán),當然數(shù)字是瞎編的,這主要想說matlab將一個大循環(huán)分成小塊,然后這些小塊并行計算,最后再合在一起。這樣有一個問題,因為普通的循環(huán)是從i=1算到i=100,一個接一個算,如果下一次循環(huán)要依賴上一次循環(huán)怎么辦?如果出現(xiàn)這種情況,那就不能用matlab的parfor了。用parfor的前提條件就是,循環(huán)的每次迭代獨立,不相互依賴。
parfor關鍵字的使用
(1). 由于for關鍵字引導的循環(huán)通常為串行運行,如果改為parfor則可以由多個worker以并行方式執(zhí)行。
(2). parfor可以將n次循環(huán)分解為獨立不相關的m部分,然后將各部分分別交給一個worker執(zhí)行。
(3). 循環(huán)執(zhí)行的結果應該與n次循環(huán)執(zhí)行的順序無關。
parfor中的變量類型
(1). 簡約變量
一般parfor中各次循環(huán)對應的運算應該相互獨立,但簡約操作可以在多次循環(huán)內(nèi)同時對一個變量操作。這種變量稱為簡約變量。例如下方代碼中a就是簡約變量。
簡約操作包括+ - * .* & | [,] [;] {,} {;} min max union intersect。
同一個parfor循環(huán)對簡約變量的操作必須一致,即必須是同一種簡約操作符。而且與操作符的相對位置也必須一致。
簡約變量賦值表達式應該滿足結合律和交換律。* [] {}底層有特殊處理保證結果的正確性。
(2). 切片變量
parfor中可能需要讀取或?qū)懭雙arfor之外的矩陣,讀取寫入位置與循環(huán)變量相關。這樣就需要向worker傳輸大量的數(shù)據(jù)。
矩陣如果被Matlab識別為切片變量,則數(shù)據(jù)可以分段傳輸?shù)礁鱳orker,提高傳輸效率。
切片變量矩陣的大小是不可在parfor中改變的,且為了保證Matlab識別正確,每次循環(huán)中只能讀取由同一個索引值索引的切片,如a[i] a[i+1]同時出現(xiàn)則a不被識別為切片變量。
(3). 臨時變量
作用域局限于parfor內(nèi),parfor結束后不存在。不影響parfor之前聲明的同名變量。
(4). 循環(huán)變量
如上例中的i,表示當前循環(huán)的id。
(5). 廣播變量
在parfor之前賦值,在parfor內(nèi)只進行讀取操作。
(6). 各種變量區(qū)分的例子
下例中,parfor中的tmp是臨時變量,parfor結束后tmp的值依然是5,不受臨時變量的影響。
broadcast是廣播變量,每次循環(huán)中的值不變。
redued是簡約變量,Matlab對其的值將分段由各worker計算后送回主進程處理。
sliced為切片變量,數(shù)據(jù)傳輸有優(yōu)化提升。
i為循環(huán)變量
worker配置
在運行程序之前,需要配置worker。否則如前文所說,parfor循環(huán)將以普通for循環(huán)的形式運行,無法并行。
啟動和關閉并行計算功能
啟動:
CoreNum=7; %調(diào)用的處理器個數(shù) if matlabpool('size')<=0 %之前沒有打開matlabpool('open','local',CoreNum); else %之前已經(jīng)打開disp('matlab pool already started'); end關閉:
matlabpool close如果代碼還在調(diào)試階段,可以暫時不關閉matlabpool,反復開關浪費時間得很。另外,matlab關閉后,matlabpool也會自動關閉,所以如果不是海量代碼,可以不用關閉的
一個使用parfor-loop的例子:
%example of parfor-loop %本地worker數(shù)通常等于cpu的核數(shù) matlabpool open local 2; parfor i=1:1024 A(i) = sin(i*2*pi/1024); end plot(A); matlabpool close;這里講述的方法僅針對多核機器做并行計算的情況。設機器的CPU核心數(shù)量是CoreNum雙核機器的CoreNum2,依次類推。CoreNum以不等于核心數(shù)量,但是如果CoreNum小于核心數(shù)量則核心利用率沒有最大化,如果CoreNum大于核心數(shù)量則效率反而可能下降。因此單核機器就不要折騰并行計算了,否則速度還更慢。
matlab使用并行計算常出現(xiàn)的問題
(1). 用parfor的運算時間反而比用for的時間更長
parfor 對于執(zhí)行時間很短的循環(huán)沒有時間提升甚至會更慢,因為把任務分配到每一個并行線程里面也要時間,說白了就是核心程序耗時太短,分配任務以及matlab和worker之間的通信可能占據(jù)了主要時間。好比去坐飛機到一個地方,如果機場比較遠,而且要去的目的地不是很遠,雖然飛機節(jié)約下來時間,但是去機場路上的時間就把省下來的時間又耗出去了。要計算足夠復雜的問題才能看出提速的效果,簡單的計算反而更慢。
(2). matlab并行運算錯誤,透明度違例錯誤
Error using parallel_function. Transparency violation error. See Parallel Computing Toolbox documentation about Transparency.
可能循環(huán)程序中使用了clear, 可將需要clear掉的編程,使用空集來代替。比如
clear A 換成 A= []; 注意 A在程序中的位置。
下面給出查詢CPU信息。
Linux 關于如何查詢CPU核心數(shù)
(1). 查看邏輯CPU個數(shù)
cat /proc/cpuinfo |grep "processor"|sort -u|wc -l(2). 由于有超線程技術有必要查看一下物理CPU個數(shù)
grep "physical id" /proc/cpuinfo|sort -u|wc -l grep "physical id" /proc/cpuinfo|sort -u(3). 查看每個物理CPU內(nèi)核個數(shù)
grep "cpu cores" /proc/cpuinfo|uniq(4). 每個物理CPU上邏輯CPU個數(shù)
grep "siblings" /proc/cpuinfo|uniq(5). 判斷是否開啟了抄超線程
如果多個邏輯CPU的”physical id”和”core id”均相同,說明開啟了超線程
或者換句話說
邏輯CPU個數(shù) > 物理CPU個數(shù) * CPU內(nèi)核數(shù) 開啟了超線程
邏輯CPU個數(shù) = 物理CPU個數(shù) * CPU內(nèi)核數(shù) 沒有開啟超線程
(6). 一次性查詢所有信息
下面給出判斷電腦的系統(tǒng)性能,并開啟并行運算
%-------------------------------------------------------------------------- clear;clc;close all%-------------------------------------------------------------------------- % Load an example dataset provided with matlab load house_dataset In = houseInputs'; Out = houseTargets';%-------------------------------------------------------------------------- % Find capabilities of computer so we can best utilize them.% Find if gpu is present ngpus=gpuDeviceCount; disp([num2str(ngpus) ' GPUs found']) if ngpus>0lgpu=1;disp('GPU found')useGPU='yes'; elselgpu=0;disp('No GPU found')useGPU='no'; end% Find number of cores ncores=feature('numCores'); disp([num2str(ncores) ' cores found'])% Find number of cpus import java.lang.*; r=Runtime.getRuntime; ncpus=r.availableProcessors; disp([num2str(ncpus) ' cpus found'])if ncpus>1useParallel='yes'; elseuseParallel='no'; end[archstr,maxsize,endian]=computer; disp([...'This is a ' archstr ...' computer that can have up to ' num2str(maxsize) ...' elements in a matlab array and uses ' endian ...' byte ordering.'...])% Set up the size of the parallel pool if necessary npool=ncores;% Opening parallel pool CoreNum=npool; %調(diào)用的處理器個數(shù) if matlabpool('size')<=0 %之前沒有打開matlabpool('open','local',CoreNum); else %之前已經(jīng)打開disp('matlab pool already started'); end方法二,直接替換 %Opening parallel pool 下面的代碼即可
% Opening parallel pool if ncpus>1ticdisp('Opening parallel pool')% first check if there is a current poolpoolobj=gcp('nocreate');% If there is no pool create oneif isempty(poolobj)command=['parpool(' num2str(npool) ');'];disp(command);eval(command);elsepoolsize= poolobj.NumWorkers;disp(['A pool of ' poolsize ' workers already exists.'])end% Set parallel optionsparoptions = statset('UseParallel',true);tocend本文參考:
http://blog.sina.com.cn/s/blog_6295beb60101dl8o.html
http://blog.csdn.net/yuzg86/article/details/7542056
http://www.ilovematlab.cn/thread-332708-1-1.html
http://zhidao.baidu.com/question/1367310944286874379.html
http://blog.csdn.net/caozhk/article/details/38234293?utm_source=tuicool&utm_medium=referral
http://blog.sina.com.cn/s/blog_866e7fa70101cv08.html
http://blog.renren.com/share/254666329/11478405569?from=0101010202&ref=hotnewsfeed&sfet=102&fin=6&ff_id=254666329
http://blog.sina.com.cn/s/blog_45eac6860100lzlk.html
http://www.cnblogs.com/dongzhiquan/archive/2012/02/16/2354977.html
總結
以上是生活随笔為你收集整理的matlab 多核并行编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人如何申请银行POS机?银行POS机申
- 下一篇: iOS核心动画之CALayer(1)