http://www.ilovematlab.cn/thread-24488-1-1.html
发表于 2009-3-11 08:57
关于MATLAB多线程计算(单核下和双核下的)
http://www.ilovematlab.cn/thread-16397-1-1.html
http://www.zhizhihu.com/html/y2010/2306.html
这个不能这样想!
1:是否多核执行任务,是由操作系统分配任务,跟Matlab本身没有关系。
2:你的并行计算,其实是多线程计算。Matlab 2007以后版本支持这些。要想并行计算,首先你要写这样的程序(我们论坛已经讨论过这个),然后程序交给Matlab, Matlab交给系统。
也就是说,即使是单核,也可能多线程。明白区别?
1.对于多核运行,需要编写合适的程序,这个我同意,但是,通过编写程序以及设置相关的系统环境,可以实现多核同时执行任务,所以不是和matlab没有关系,只是现在matlab对于多核的支持还有限,仅能实现部分程序的多核运算。总之,多核运算的实现和matlab是有关系的,对于编程者和matlab开发者来说,实现多核运算都是必然的趋势。
2.原帖说的是多核并行计算,不再是简单的多线程,而是多个物理核心。对于matlab这样经常是CPU占用100%的程序来说,在单核心上同时开多个线程几乎没什么意义,实际上不是真正的并行计算,因为哪个线程运行起来其它的线程都得等待。而多核运算,即使每个核心开一个线程,也是真正的多个线程同时运行,即所谓并行计算。所以多核心并行计算是能够提升运算效率的,是不能和单核心的多线程并论的。
以上说法可能还不成熟,欢迎讨论。
1. 点 “我的电脑", 选择 "属性”.
2. 点击 高级
3. 点击 环境变量
4. 添加如下系统变量
变量名称 值
---------- -------
BLAS_VERSION mkl.dll
OMP_NUM_THREADS 2
详细的文件看blas.spec文件的配置
NUMBER_OF_PROCESSORS 2
小弟的电脑就是双核的,计算一个东西要两个小时,可看到cpu都是50%的运行,有什么方法提高cpu的利用率呢??
刚才试了一下,我使用的MATLAB2010可以多核运行的。需要多核多线程跑的算法,在之前要让matlab在本地建立4个“实验室”(我的机器是4核,所以是4个)
>> matlabpool local 4
Starting matlabpool using the 'local' configuration ... connected to 4 labs.
显示正在进行多核配置,一会说,连接到4个“实验室”。我理解就是在本地虚拟出4台可以运行matlab的工作站,这样用分布式计算工具箱可以进行并行计算(matlabpool这个命令好像是在并行计算工具箱里的)。观察windows任务管理器,可以发现一共有5个MATLAB.exe进程。其中一个占内存较多的,我理解是主控的,他基本不干活,只负责分配,进行计算时他的cpu占用率只有1~2%,剩下四个进程专门用来计算的,跑起来各占cpu 25%左右。看上去还是每个matlab进程单核运算,但是一下开4个进程,所以能把cpu用满。
如果后续还需要多核运算,就直接用parfor好了,不用每次都用matlabpool命令。那个配置一次就好。
算完了,不再跑了,临退出时关闭配置就行。
>> matlabpool close
Sending a stop signal to all the labs ... stopped.
下面是我一个M文件的程序,测测4核并行计算和单核计算的差距,很简单。
function testtime
runtimes = 1e9;
dummy1 = 0;
dummy2 = 0;
%matlabpool local 4
tic
%for x= 1:runtimes;
parfor x= 1:runtimes;
dummy1 = dummy1 + x;
dummy2 = 2 * x + 1;
end
toc
plot([1 2], [dummy1, dummy2]);
第一次用普通for语句,单核跑,6.09秒
>> testtime
Elapsed time is 6.094267 seconds.
第二次用parfor语句,4核跑,1.63秒
>> matlabpool local 4
Starting matlabpool using the 'local' configuration ... connected to 4 labs.
>> testtime
Elapsed time is 1.631350 seconds.
>> matlabpool close
加速比 6.09 / 1.63 = 3.736,将近4倍(还有开销吧),还比较可观。
1:是否多核执行任务,是由操作系统分配任务,跟Matlab本身没有关系。
2:你的并行计算,其实是多线程计算。Matlab 2007以后版本支持这些。要想并行计算,首先你要写这样的程序(我们论坛已经讨论过这个),然后程序交给Matlab, Matlab交给系统。
也就是说,即使是单核,也可能多线程。明白区别?
多核多线程设置
刚开始接触matlab并行计算,以前旧电脑从不考虑这些的
小本i7四核八线程16G内存,64位win7和matlab 2012b,任务管理器显示有8个框
当用普通for循环,只有一个框接近100%,cpu使用率只有12%左右
默认配置下,键入matlabpool,右下角提示4个
然后使用parfor,进程中也能看到5个叫做matlab的,一个接近400M,其他4个接近200M
但为什么只有4个框接近100%,cpu使用率只有50%左右?如何充分使用资源
使用matlabpool 是建议1个核(core)对应一块pool(worker)所以建议出现默认4个,可以试下,
setenv('OMP_NUM_THREADS', '8');
或
setenv 'OMP_NUM_THREADS' 8
getenv 'OMP_NUM_THREADS'
图形界面的设置如下Home-parallel-mange cluster profile,修改NumWorkers为8,再次打开matlabpool,右下角显示8,运行cpu100%满负荷
顺便说下,小本风扇顿时惨厉的狂豪;内存共9个叫做Matlab的,一个主的接近3G,其他8个接近200M,我的16G内存快接近一半了
MATLAB多线程
http://blog.sina.com.cn/s/blog_48a0eb290100q9gc.html
MATLAB先天的多线程残疾,给编写实时程序带来了致命的打击。一般情况只能按堆栈的形式,排队执行Matlab命令,可是无巧不成书,有时我们偏偏需要进行多线程和实时编程。
比如:
1.我想实时更新一个电子表的时间,也就是每1s读取一次系统时间或者自动加1s
2.我需要这个程序在10s后终止
明显这些需要,使用一般的Matlab编程是没法或者说很难实现的。
还好Matlab自知在这方面亏欠大家太多,提供了唯一一个多线程的实现方法——Timer对象
一、Timer对象的创建
T = timer
T = timer('PropertyName1', PropertyValue1, 'PropertyName2', PropertyValue2,...)
括号中的参数可以在创建Timer是给出,也可以通过以后的set/get命令设置和读取
二、Timer属性参数
1.属性设置
(1)创建的时候直接赋值
%创建一个Timer对象变量TaskTimer,并给出部分参数
TaskTimer=timer(...
'Name','Matlabsky',...
'TimerFcn',@ExecuteTask,...
'ErrorFcn',@ExecuteError,...
'Period',1,...
'ExecutionMode','fixedrate');
(2)使用set/get设置和读取
%创建一个默认的Timer对象
TaskTimer=timer
set(TaskTimer,'Name','Matlabsky','TimerFcn',@ExecutTask)
get(TaskTimer,'Name')
其实set/get的使用方法不只这个,还其他形式,特别是在同时设置多个句柄的多个属性时,特别方便,感兴趣的网友可以直接参考Matlab的帮助文档
(3)使用结构体设置
TaskTimer=timer
TaskTimer.Name='Matlabsky'
TaskTimer.TimerFcn=@ExecutTask
2.常用属性(下面是几个比较重要的,希望大家掌握)
(1)ExecutionMode 执行的模式
就是确定TimerFcn执行周期计算的始末点
'singleShot' :只能执行一次,故Period属性不起作用,其他模式都可以执行多次
'fixedSpacing' :上一次TimerFcn执行完毕时刻到下一次TimerFcn被加入队列时刻之间的间隔
'fixedDelay' :上一次开始执行到下一次被加入队列之间的间隔
'fixedRate' :前后两次被加入到执行语句队列时刻之间的间隔
(2)Period 时间间隔(执行周期)
也就是每个Period执行一次TimerFcn,执行周期到底指的是哪两个时刻之间的间隔由ExecutionMode决定
(3)StartDelay 启动时延
从启动Timer开始到第一次把TimerFcn的加入到Matlab的执行语句队列中去的时延, 默认值为0s
(4)TasksToExecute 执行次数
TimerFcn被执行的次数,默认为1次,设置多次时需要设置执行周期Period
(5)TimerFcn Timer函数
是Timer对象的核心,Timer的多线就是通过执行这个TimerFcn来实现的,也是Timer对象的必选参数
当然还有其它属性,但是相对来说比较次要,更详细的说明,感兴趣网友可以自己查看MATLAB帮助文档
三、回调函数callback
1.callback的建立
Timer对象的回调函数有TimerFcn、ErrorFcn、StartFcn和StopFcn,其中TimerFcn是必选的
Timer的所有回调函数callback,至少有两个输入参数obj和event,其经典格式为
- function my_callback_fcn(obj,event,p1, p2)
- %by dynamic
- %see also http://www.matlabsky.com
- 092.15
- %
- %obj和event为必选输入参数
- %
- %obj就是前面创建的Timer对象,它包含着Timer的所有参数
- %
- %event是一个结构体,包含Type和Data两个字段,Type保存的是当前的Timer对象执行的时间,比如StartFcn、StopFcn等
- %
- %而Data还是一个结构体,包含time一个字段,保存的是执行该事件的系统时间
- %
- %所以event的使用是event.Type获取Timer到底在执行哪个事件,event.Data.time或者执行该时间的系统时间
- %
- %p1,p2...等是其它自定义的输入参数,根据需要在自己添加
2.回调函数的属性值
- 回调函数 属性值
- function myfcn(obj,event) set(T,'StartFcn','myfcn')或者T.StartFcn='myfcn'(下同)
- function myfcn(obj,event) set(T,'StartFcn',@myfcn)(同上)
- function myfcn(obj,event,p1,p2) set(T,'StartFcn',{'myfcn',p1,p2})或者T.StartFcn={'myfcn',p1,p2}(下同)
- function myfcn(obj,event,p1,p2) set(T,'StartFcn',{@myfcn,p1,p2})(同上)
3.回调函数实例
- function TimerFcn_callback(obj,event,var)
- txt=' event occurred at ';
- event_type = event.Type;%获取当前事件
- event_time = datestr(event.Data.time);
- msg = [event_type txt event_time];
- disp('Hello it's Matlabsky Timer Object Demo')
- disp('Now! Begin...')
- disp(msg)
- x=2*pi*[-1:0.01:1];
- y=var*sin(var*x)+var
- plot(x,y)
四、Timer对象应用实例
- function matlabsky_timer_demo
- %
- %by dynamic
- %see also http://www.matlabsky.com
- 09.1.23
- %
- clc
- %创建Timer对象
- T = timer('TimerFcn',@TimerFcn, 'StartDelay',10,'StartFcn',@StartFcn);
- %启动Timer
- start(T);
- %开始循环
- while T.userdata=='f'
- disp('Love Matlab Love Matlabsky——Timer Object Demo');
- pause(1)
- end
- %终止Timer
- stop(T);
- function TimerFcn(obj, event)
- s后终止程序
- obj.userdata='t';
- disp(['the BeiJing time is ' datestr(event.Data.time)])
- disp('10s Has Escaped, Following The Orde of TimerFcn, Now I Have To Stop This Progam!')
- function StartFcn(obj,event)
- obj.userdata='f';
- disp(['the BeiJing time is ' datestr(event.Data.time)])
- disp('The Timer Object Demo Begin Now!')
程序运行结果为
- the BeiJing time is 17-Feb-2009 13:36:05
- The Timer Object Demo Begin Now!
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- the BeiJing time is 17-Feb-2009 13:36:15
- 10s Has Escaped, Following The Orde of TimerFcn, Now I Have To Stop This Progam!
这里还一个Timer对象在【股票浏览器】GUI中的应用的实例,感兴趣的可以看看http://www.matlabsky.com/thread-656-1-1.html
五、与Timer相关的其它函数
timer 创建Timer对象
set/get 设置/获取Timer属性
start 启动Timer
startat 在指定时间启动Timer
stop 终止Timer
disp 显示Timer所有属性
timerfind 找出内存中可见的Timer
timerfindall 找出内存中的所有Timer
wait 等待Timer执行完了以后在执行后面的命令行
delete 从内存中删除Timer
刚开始接触matlab并行计算,多核多线程设置
http://blog.sciencenet.cn/blog-363372-667068.html
当用普通for循环,只有一个框接近100%,cpu使用率只有12%左右
默认配置下,键入matlabpool,右下角提示4个
然后使用parfor,进程中也能看到5个叫做matlab的,一个接近400M,其他4个接近200M
但为什么只有4个框接近100%,cpu使用率只有50%左右?如何充分使用资源
getenv 'OMP_NUM_THREADS'
顺便说下,小本风扇顿时惨厉的狂豪;内存共9个叫做Matlab的,一个主的接近3G,其他8个接近200M,我的16G内存快接近一半了
http://blog.sciencenet.cn/blog-363372-667068.html