1. 程式人生 > >Matlab平行計算示例(一)

Matlab平行計算示例(一)

        使用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、詳細版