1 更高級的算法牽扯到更多重的循環和復雜的計算,尤其是現在人工智能的算法尤其如此。有些歷史知識的人能夠了解到,人工智能的很多基本算法其實近百年之前就有了,但是當時的計算機技術達不到去實現這些算法的要求,因此當今計算機的技術和當時已經不是在一個量級上面,因此人工智能等方案才有被重新提上日程,獲得飛速的發展。也就是說,當人的思想超越當今的技術的時候我們只能等待,但是當當今的技術已經能夠趕上人的思想,我們將會無所不能。
2 這一部分的內容主要是充分調用計算機的性能甚至是調用n台計算機形成集群形式使得算法能夠快速的運算和提升整個程序的運行效能。
3 MATLAB2009之后,退出了並行計算工具箱(Parallel Computing Toolbox,PCT)和並行計算服務(Distibuted Computing Server,DCS),通過PCT和DCS用戶可以實現基於多核平台、多處理器平台和集群平台的多種並行計算任務。PCT除了支持通用的上述功能之外還增加了GPU單元的支持。在MATLAB中,可以通過PCT、MEX文件等多種方式利用GPU來完成數據處理功能。
首先要考慮的幾個問題:
1)並行計算的平台:
單計算機MATLAB支持8個worker(2010b)版本、如果需要多台計算機組成集群,需要利用PCT和DCS共同完成,如果需要GPU運算,利用PCT、MEX文件技術來完成。
2)並行計算的復雜程度:
當然MATLAB來進行並行計算省去了很多繁瑣的底層工作,相對快捷和簡單。
比如利用parfor循環,可以對for循環進行並行處理,利用SPMD可以對單個程序多組數據情況進行並行處理。這里要盡量選擇MATLAB並行計算工具箱內置的並行結構。
3)並行計算的數據通信問題:
並行計算的兩個目的:第一是提高計算效率,第二是提高計算機的利用率。第一個問題比較絨里理解就是比如單個問題CPU計算需要10個小時,那么采用10個CPU進行計算可能只需要1.5小時就可以完成。
相見恨晚的功能:profiler 代碼分析器
4 profiler viewer,就會彈出代碼分析器的窗口,然后再窗口輸入想要測試的腳步等。就能得出段腳步那些地方用時最多
可以據此來修正代碼,改進代碼
5 提升代碼運算效率在代碼編寫上注意的幾個問題:
1)盡量用向量化來替代for和while循環的運算。
采用向量化,對於大型的運算,時間要快於for循環或者while循環。
2)還有一些經過優化的向量運算函數:
all,判斷數值陣列是否全部非零
any,判斷數值陣列是否有非零元素
reshape,變化數值陣列的各維元素數據
find,返回非零元素在陣列中的位置和其值
sort,將數組按照升序排列
sum,求數組的和
repmat,擴展陣列
is等函數。。。。
相見恨晚的功能:利用parfor對for循環進行並行(PCT工具箱中的函數)
6 在程序設計中,往往最小化計算量的代碼都是循環。循環分為兩種:一種是固定次數的循環,另一種叫非固定次數的循環(while),在MATLAB程序中,提高循環計算效率往往是提高程序計算效率的關鍵。對於固定次數的循環,一般有兩種類型:一種是循環次數較大,單詞循環的計算量較小;另一種是循環次數較小,單詞循環計算量較大。采用MATLAB提供的parfor關鍵字就可以對這兩種類型的循環實現多核或多處理器並行執行。
7 parpool 命令配置並行計算池(在2010版本之前的命令是matlabpool,后面版本都用這個命令來替代原先的命令)
8 不啟動並行池,直接執行parfor程序不起作用。
9 當新歡次數設為100 000時,parfor執行的時間反而遠遠高於for循環的執行時間。這說明當循環次數較小的時候,通過parfor關鍵字對for循環體進行並行的效率很低。原因比較復雜,這里試着增加循環次數,觀察parfor關鍵字對for循環體進行的效率變化,隨着循環次數的增加,parfor關鍵字對for循環並行金酸的效率開始提高。在實際應用中,如果根據循環次數選擇parfor關鍵字或者選擇for關鍵字完成簡單循環計算?由於MATLAB是解釋型語言,而且已經封裝了對選好進行並行計算的細節。很難通過分析和推導得到比較准確的結果。另外,不同的計算機對應的計算單元有很大差異,例如CPU個數和類型等,因此在parfor循環並行計算分析中,采用測試程序進行測試是十分必要的,這一點在前面已經得到充分的說明。這里,仍然沿用繪制並執行時間曲線的方法進行分析,通過測試程序繪制parfor的執行時間和for的執行時間隨時間次數變化的曲線,人后對比兩個時間曲線分析確定parfor關鍵字執行效率高於for關鍵字的臨界點,即臨街循環次數。
10 parfor的正確用法
1)簡約變量只能出現在簡約賦值操作的表達式中
2) 在同一個parfor循環內,對簡約變量的操作一致
3)如果簡約變量的操作是相乘或者鏈接【】,變量X或出在操作符前面,或處在操作符后面,但是X的位置必須恆定不變。
4)簡約變量賦值應當滿足結合律和交換律
11 parfor程序設計需要考慮的其他問題
1)變量名稱(函數優先)
在MATLAB parfor循環代碼塊中,如果變量在循環之外沒有定義或初始化,則MATLAB采用函數優先的原則,即MATLAB假定次變量為一函數名。
比如執行:
clear
N = 100
a = 1
parfor kk = 1:N
a = a+f(kk)
end
會報錯。
2)顯式使用變量
3)parfor中使用函數句柄
在parfor中調用函數句柄時,需要注意只能采用feval函數調用。如果在parfor循環中使用函數句柄,則代碼MATLAB提示報錯。
比如只能執行
N = 10
B = @sin;
parfor ii = 1:100
A2(ii) = feval(B,ii);
end
4)在parfor中調用遞歸函數
相見恨晚的功能:parpool常用的命令
1)parpool('local',2); % 在已知worker數列的情況下,打開幾個worker
2)parpool; % 在默認條件下啟動並行池,有幾個worker打開幾個workder
3)c = parcluster % 用句柄的形式條用並行池
>> c = parcluster c = Local Cluster Properties: Profile: local Modified: false Host: PC-201709010031 NumWorkers: 2 NumThreads: 1 JobStorageLocation: C:\Users\Administrator\AppData\Roaming\MathWorks\MATLAB\local_cluster_jobs\R2016b RequiresMathWorksHostedLicensing: false Associated Jobs: Number Pending: 0 Number Queued: 0 Number Running: 0 Number Finished: 0 >> parpool(c) Starting parallel pool (parpool) using the 'local' profile ...
4)poolobj = parpool;
delete(poolobj) %刪除並行池
5)啟動和關閉並行池的一組組合方式
>> poolobj = parpool('local',2); Starting parallel pool (parpool) using the 'local' profile ... connected to 2 workers. >> delete(poolobj) Parallel pool using the 'local' profile is shutting down. >> poolobj = parpool; % 默認打開全部worker Starting parallel pool (parpool) using the 'local' profile ... connected to 2 workers. >> delete(poolobj) Parallel pool using the 'local' profile is shutting down.
其中注意到,句柄poolobj有很多參數,當然這個也可以在MATLAB預設里面找到相關設置。但是這里對這些設置都是寫啥東西,進行一下解釋。當然可以用poolobj.內容,進行修改。
NumWorkers 組成並行池的workder個數
AttachedFiles 被發送到workers的文件和文件夾
Idle Timeout 閑置的並行池關閉前分鍾表示的時間范圍
Cluster 群集啟動池,指定為群集對象 因為我們可以用集群化並行運算,如果沒有集群,內容會顯示本地
Connected 並行池中運行的族群
FevalQueue 要在並行池中運行FevalFutures隊列
SpmdEnabled 是否可以運行SPMD代碼
相見恨晚的功能:SPMD並行結構
12 SPMD(Single Program,Multiple Data)是MATLAB支持的另外一種並行結構。其對應的使用方式即相同程序、不同數據。SPMD並行結構比parfor並行解耦股更加靈活,但也引入更加復雜的數據類型和操作方法。
13 假定用戶有一批數據文件需要處理,而且每個文件的處理程序相同,在這種情況下可應用SPMD並行結構。在SPMD並行結構中,用戶可以獲得每個worker的編號labindex和總的worker數據numlabs。這兩項信息在parfor並行結構中是無法獲取的。通過labindex和numlabs用戶可以控制每個worker執行的計算任務。因此SPMD並行結構給用戶提供了更大的自由度,用戶可以控制更多的並行計算的細節。
14 SPMD並行結構需要依賴MATLAB並行計算池執行,因此SPMD並行結構執行之前,用戶必須配置和啟動MATLAB並行計算池。和parfor一樣,用戶既可以啟動本地並行計算池,也可以啟動集群並行計算池。本地並行計算池管理的workder與MATLAB client在同一計算節點中執行,集群並行計算池管理的worker與MATLAB client一般不再同一計算節點中執行。
15 SPMD並行結構通過spmd關鍵字啟動,如下:
spmd a = rand(labindex); end >> a a = Lab 1: class = double, size = [1 1] Lab 2: class = double, size = [2 2] >> class(a) ans = Composite
可以看出a的形式比較奇怪,並不屬於數值陣列,而是一種稱之為composite的變量,關於composite變量,在后面會有詳細結構。讀者暫時可以認為a是一個元組陣列。
在MATLAB並行程序設計中,worker有時也被成為lab。二者區別在於,lab是一個中特殊的worker,各個lab之間可以相互通信和同步。而各個worker之間一般是獨立的。執行SPMD的工作單元成為lab,這也是labindex和numlabs命名的由來。
16 SPMD的使用方法:
spmd
需要並行的主體
end