Matlab平行計算示例(一)
阿新 • • 發佈:2019-01-07
使用Matlab實現演算法較為簡單,但是涉及for迴圈時,效率比不上C++。對於一個多核處理器,不開多核平行計算,實在是對不住Matlab自帶的平行計算功能。parfor迴圈較為簡單,但是它對for迴圈中的變數要求比較嚴格,稍有不慎就會出錯(我深受其害)。使用Matlab Toolbox中的createJob/createTask可以實現多執行緒的平行計算,其功能與C++中CreateThread類似。這樣的平行計算對函式中的變數要求就沒有那麼嚴格。
Matlab 2010和2014的呼叫函式略有差異,下面列出分別列出一個示例。
1、Matlab 2010
slave_num = 2; jm = findResource; jm.DataLocation = './cache'; if ~isempty(jm.jobs) destroy(jm.jobs) end if ~exist(jm.DataLocation, 'file') mkdir(jm.DataLocation) end sub_list = cell(2, 1); sub_list{1} = [2, 1]; sub_list{2} = [3, 4]; job = createJob(jm, 'PathDependencies', {jm.DataLocation}); for i = 1:slave_num createTask(job, @min, 1, {sub_list(i)}); end submit(job); waitForState(job, 'finished'); destroy(job);
2、Matlab 2014
clear all, close all, clc, slave_num = 2; c = parcluster(); % Create cluster object job = createJob(c); sub_list = cell(2, 1); sub_list{1} = [2, 1]; sub_list{2} = [3, 4]; for i = 1:slave_num createTask(job, @min, 1, {sub_list(i)}); end submit(job); wait(job); out = fetchOutputs(job);
上面兩個示例實現的是同一個功能,即平行計算兩個向量的最小元素。開頭和最後的物件宣告和結果提取使用的函式不同,中間建立任務的函式基本相同。對較少的任務,並不能節省很多時間,有時反而會增加時間開銷;但是當任務較多時,平行計算就會體現出它的優勢,充分利用多核CPU。
Matlab 博大精深,createJob/createTask只是Matlab平行計算中很小的一部分,還有諸如:parfor, batch, spmd, 這些還沒有仔細研究過,有時間需要進一步深入學習。
【參考文獻】:
官方文件:
3、入門版
4、詳細版