Programming and Application(编程与应用)


Content(目录)




Linux


MySQL
Office















 
PCNow 30-Day Free Trial, Remote PC Access
 
Logo_234x60

局域网内多机协同完成复杂任务的方法与实现


局域网内多机协同完成复杂任务的方法与实现

董占山
我在使用MATLAB来实现一个动态模拟模型时遇到了一个令我十分头疼的事,那就是模型的运行时间过长,如果使用优化软件包搜寻最优参数,只用单机需要很长时间才能完成。开始的时候我的模拟运行一遍需要近3个小时,如果搜寻优化参数,这估计需要几个月甚至几年的时间。这种情况是不能接受的,我只有另外寻找其他途径。
优化模型:使用MATLAB提供的Profiler工具,我找到了模型中最消耗时间的部分,对其进行优化,得到了十分满意的效果。主要对如下方面进行了优化:
a. 减少函数的调用,不仅仅指自己写的函数,对内建函数的调用也要尽可能地减少;
b. 不用或少用全局变量以及结构变量;
c. 预先申请数据空间,减少动态改变数组大小的语句;
d. 将所有调用函数集中到一个函数中,使用mcc命令将其编译成mex格式的可执行文件;
e. 尽可能将循环化为向量,然后进行矩阵运算;
采用并行计算:MATLAB并没有提供并行计算的功能,但是我们可以想出办法来实现并行计算。在我办公室的局域网中有一个11台计算机的集合体,只要有一种办法让每个计算机干一小部分任务,从而可以实现并行计算。我的实现办法十分简单,在主机(master)上就是将任务分割成几个等分,分别将他们写入到文件中,在奴役(slave)机上读取这些文件,并进行计算。奴役机一直在监视主机分配的任务,直到主机发出任务完成的命令。
数据分发:在分发数据或读取结果时可能会出现某种冲突,比如这里主程序刚建立文件,奴役程序就开始读取数据,结果是可想而知的,程序会中断运行。为了解决这个问题,可以采用如下的策略,先在盘上写一个小文件,然后再写数据文件,等数据文件写完后,再删除这个小文件。在另一个程序中,先判断数据文件是否就绪,如果就绪,再判断那个作为指标的小文件是否存在,如果不存在,说明程序可以安全度取数据了。使用这种策略,将不会发生任何冲突。下面是两个示例程序,一个是主程序,一个奴役程序。
MASTER.M
function [dap] = master(x,xdata,nummachines)
if nargin < 3
    nummachines = 6;
end

for i=2:nummachines
    save(['slave' num2str(i) 'ok.txt'],'i','-ascii');
end
switch nummachines
    case 1
        slave1data = xdata;
    case 4
        slave1data = xdata(:,1:28);
        slave2data = xdata(:,29:48);
        slave3data = xdata(:,49:60);
        slave4data = xdata(:,61:end);
    case 6
        slave1data = xdata(:,1:20);
        slave2data = xdata(:,21:36);
        slave3data = xdata(:,37:47);
        slave4data = xdata(:,48:55);
        slave5data = xdata(:,56:66);
        slave6data = xdata(:,67:end);
end

for i=2:nummachines
    save(['slave' num2str(i) 'x.txt'],'x','-ascii');
    save(['slave' num2str(i) 'data.txt'],['slave' num2str(i) 'data'],'-ascii');
end

for i=2:nummachines
    delete(['slave' num2str(i) 'ok.txt']);
end

dap = atclocktrainfun(x,slave1data);

for i=2:nummachines
    while ~exist(['slave' num2str(i) 'result.txt'])
    end
end

for i=2:nummachines
    while exist(['slave' num2str(i) 'resultok.txt'])
    end
end

for i=2:nummachines
    dap = [dap load(['slave' num2str(i) 'result.txt'])];
    delete(['slave' num2str(i) 'result.txt']);
end
SLAVE.M
function slave(i)
i
STOP = 0;
save(['slave' num2str(i) 'resultok.txt'],'i','-ascii');
while ~STOP
    STOP = exist('stop.txt');
    if STOP, break; end

    while ~exist(['slave' num2str(i) 'x.txt'])
        STOP = exist('stop.txt');
        if STOP, break;end
    end
    
    while ~exist(['slave' num2str(i) 'data.txt']);
        STOP = exist('stop.txt');
        if STOP, break;end
    end

    while exist(['slave' num2str(i) 'ok.txt']);
        STOP = exist('stop.txt');
        if STOP, break;end
    end
    
    x = load(['slave' num2str(i) 'x.txt']);
    xdata = load(['slave' num2str(i) 'data.txt']);
    delete(['slave' num2str(i) 'x.txt']);
    delete(['slave' num2str(i) 'data.txt']);

    target = atclocktrainfun(x,xdata);
    
    save(['slave' num2str(i) 'result.txt'],'target','-ascii');
    delete(['slave' num2str(i) 'resultok.txt']);
end
©董占山Zhanshan Dong

Post comments(留言)

Name(名字):

Comment(内容):


由Google提供

SunfineData Products|U's Bargain Network|Contact Me(与我联系)
© 1998-, 董占山, 版权所有, 欢迎转载文章链接。
转载文章和软件请注明出处(http://articles.sunfinedata.com/)。