Sunday, December 13, 2015

Matlab: Parallel Process

Summary

并行处理对于耗时很长很长的程序至关重要,它的思路是空间换时间,将一条处理流在空间允许前提下提升至多条。
此处,介绍并行处理功能将以函数parfor为主要切入点,它比较容易理解和掌握。Matlab中涉及并行处理的函数还有很多,以后在逐渐补充之。

parfor

函数parfor与for语句定义几乎一致,不同在于:循环起止数值必须是有限整数,或者这一区间是可以用表达式代表的一个连续整数的行向量。M定义最大数量的Matlab Workers(什么是worker?),他们运行parfor循环中语句,M只能是非负整数。默认情况下,Matlab利用尽可能多的workers。如果被设定上限,Matlab利用的workers不会超过这个数量,即是存在更多的空间。如果请求数量大于实际情况,Matlab只能在声明之处使用最大数量可利用的workers。注意循环体内各循环必须是独立的,比如按顺序第900次与其他各次过程均不存在联系,放在400次之前运行依然得到相同的结果,这就是各次独立原则。
我在这里举例说明一些情况:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
clear;
clc;

n=100;

disp('parfor');
timebegin=tic;
cur_data=date;
cur_time=fix(clock);
str1=sprintf('%s %.2d:%.2d:%.2d', cur_data, cur_time(4), cur_time(5), cur_time(6)); 
fprintf('Time Begin: ');
fprintf(str1);
fprintf('\n');

dirpath='./sub1';
parfor ii=1:n
    txtname=[num2str(ii), '.txt'];
    txtpath=[dirpath, '/', txtname];
    fid=fopen(txtpath, 'wt');
    fclose(fid);
    fclose('all');
    disp(num2str(ii));
end

cur_data=date;
cur_time=fix(clock);
str2=sprintf('%s %.2d:%.2d:%.2d', cur_data, cur_time(4), cur_time(5), cur_time(6)); 
fprintf('Time End: ');
disp(str2);
timespan=toc(timebegin);
fprintf('Time Span: %.4f s\n', timespan);
上面代码创建100个txt文件,并输出每次创建文件的序号,如Fig. 1,它的顺序不是按照1至100排列的,但不损害结果的正确。
Fig. 1

Transparency

若运行parfor返回错误:See Parallel Computing Toolbox documentation about Transparency,这表示parfor代码Body违反了透明性原则(Transparency)。
透明性原则的定义是The body of a parfor-loop or spmd block must be transparent, meaning that all references to variables must be "visible" (i.e., occur in the text of the program).函数parfor循环主体必须是完全透明的,这指的是所有与变量相关的内容必须是可见的。
这种透明性原则下诸如函数save、load、eval等都是不能出现在parfor代码主体中的,若仍要实现以上函数的功能,其实也很简单,把这些函数包装成子函数(subfunction)调用即可,此时代码主体不违反透明性原则。

Cannot Be Classified

对于此类错误the variable XX in a parfor cannot be classified.,原因是XX在循环之前已被赋值,导致循环体之内不能再被赋值,这种情况可以考虑如下解决方式
1
2
3
4
5
XX=[];
parfor ii=1:n
    value=??
    XX=AddData(XX, value);
end

References

1 comment:

  1. SEGA GENESIS - GAN-GAMING
    SEGA GENESIS. GENESIS-HANDS. Genesis (JP-EU). NA. NA. poormansguidetocasinogambling NA. https://vannienailor4166blog.blogspot.com/ SEGA sol.edu.kg GENESIS-HANDS. NA. 바카라 사이트 SEGA GENESIS. NA. GENESIS-HANDS. NA. www.jtmhub.com

    ReplyDelete