找回密码
 注册
Simdroid-非首页
查看: 243|回复: 14

了解一下Matlab、Mathematica、Maple等对多线程的支持情况

[复制链接]
发表于 2010-12-28 07:27:56 | 显示全部楼层 |阅读模式 来自 山东淄博
可以这样测试,写一个动画程序,在动画运行的时候,在主窗口进行其他运算,如果软件允许这样,应该对多线程有很好的支持能力。

以下是Forcal支持多线程的例子(用OpenFC演示)。图片中有三个窗口:上面的OpenFcGl窗口在动态演示三维图形,Plot窗口在动态演示二维图形,而OpenFC主窗口界面正在进行计算。


OpenFC下载:http://www.forcal.net/xiazai/forcal9/openfc32w.rar

演示过程(OpenFC要按readme设置一下):

1、运行OpenFC后,执行菜单 命令->函数图像->多边形模式例子。
2、粘贴以下代码到OpenFC主窗口,执行菜单 计算->编译为临时模块并执行。

  1. !using("fc2d","math");
  2. init(::A,B,max)= max=500, A=array[max].free(), B=array[max].free();
  3. f(x,y,n,t:i,u,d,static,k:A,B,max)=
  4. {
  5.     x=A,y=B,n=fmod(++k,max+1),
  6.     u=-9,d=18/max,i=0,(i<n).while{
  7.         x[i]=u*sin[u], y[i]=u*cos[u]^2,
  8.         u=u+d, i++
  9.     },
  10.     1
  11. };
  12. Plot{Iclear, Ixdynamic : 1, Itimer : 1, 100,
  13.      Iiarray : HFor("f"),Adot,Ashape,Vdiamond,Acolor,Vred
  14. };
复制代码
3、在OpenFC主窗口输入任意代码并执行(当然,耗时不能太长)。
发表于 2010-12-28 20:30:06 | 显示全部楼层 来自 新加坡
Simdroid开发平台
我个人对“程序或者软件的多线程支持”的理解是这样的:如果一个程序或者软件支持多线程,那么我们可以把一部分代码放到后台运行从而我们可以继续用常规的方式使用该软件。另外一种多线程支持就是我们可以把某段代码以多个线程并行处理以期在多核的电脑上获得加速的效果。

我对Mathematica和Mapple都不熟悉,我猜它们并不支持多线程,这里主要说说我对matlab的理解:matlab本身并不支持多线程。matlab对m代码的执行是单线程的,在交互界面上运行matlab语句也是单线程的。也就是说我们无法在matlab中以后台方式运行某段代码,同时继续使用matlab。

不过matlab的GUI程序能够给人一种“支持多线程”的效果,比如我们可以在GUI程序中获得某种耗时的算法的实际进展(progressing status),这时界面上的各控件仍然有效,我们也可以实现对算法的“暂停、继续、终止”等操作。

至于对于多核电脑更好的利用,比如实现并行处理,matlab需要用到其他的工具箱:应该可以实现分布式并行计算包括MPI,多线程(OpenMP,threads (win32以及Linux)等),甚至可以使用CUDA来利用GPU做并行处理。

一点拙见,欢迎讨论。另外我对OpenFC也不熟悉,不知它是否真的支持多线程,楼主不妨多给点介绍。

最后祝大家新年愉快!

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-29 07:19:15 | 显示全部楼层 来自 山东淄博
我个人对“程序或者软件的多线程支持”的理解是这样的:如果一个程序或者软件支持多线程,那么我们可以把一部分代码放到后台运行从而我们可以继续用常规的方式使用该软件。另外一种多线程支持就是我们可以把某段代码 ...
taohe 发表于 2010-12-28 20:30

谢谢taohe 的讨论!

多线程是个复杂的概念,我的理解也不是很完全,只能通过几个例子与大家探讨。

1、用C/C++、Fortran等设计一个程序时,即便自己没有使用多线程技术,但程序运行时也可能是多线程的。

   例如【循序渐进Forcal例程】中的例子:http://www.forcal.net/sysm/forcal9/fchtm/helloforcal.htm

   再比如你使用了OpenMP或CUDA中的函数,这些库中的许多函数(估计)会开启多个线程,使用多个CPU进行计算以加快速度。这些库任意程序都可以用,不仅是matlab。若Forcal封装了OpenMP和CUDA中的函数,就加入了OpenMP和CUDA的支持,而且会运行地很好。

2、如果设计一个函数、或者一个库、或者一个计算引擎,让它支持多线程并发执行,那么这个函数、库或引擎中的所有函数都必须是可重入型函数。

   参考:http://baike.baidu.com/view/3330203.htm

   设计一个函数、或者一个库是支持多线程的,似乎比较容易,但设计一个多线程的计算引擎应该是困难的,很难保证计算引擎中不使用全局变量。从这个角度讲Matlab、Mathematica、Maple、Forcal,以及很多的脚本都不支持多线程。

3、如果我们在程序中互斥地使用Matlab、Mathematica、Maple、Forcal,以及其他脚本引擎,那么可以设计出很好的多线程程序。

   以Forcal为例,进一步说就是:设计一个多线程程序,有多个线程并发执行,各个线程使用某种技术互斥地使用Forcal资源即可。在Forcal系统中,推荐使用MForcal的UseForcal函数。

   参考FC2D库中Plot函数的实现:http://www.forcal.net/sysm/forcal9/fchtm/fc2d.htm

   Plot函数运行时将启动一个线程绘图窗口,然后就返回了,可以做其他事情,而Plot的线程窗口可根据需要与其他线程一起互斥地使用Forcal资源。

   例如在以下例子中,函数f相当于一个回调函数,Plot的线程窗口每隔100毫秒就调用一次函数f。

  1. !using("fc2d","math");
  2. init(::A,B,max)= max=500, A=array[max].free(), B=array[max].free();
  3. f(x,y,n,t:i,u,d,static,k:A,B,max)=
  4. {
  5.     x=A,y=B,n=fmod(++k,max+1),
  6.     u=-9,d=18/max,i=0,(i<n).while{
  7.         x[i]=u*sin[u], y[i]=u*cos[u]^2,
  8.         u=u+d, i++
  9.     },
  10.     1
  11. };
  12. Plot{Iclear, Ixdynamic : 1, Itimer : 1, 100,
  13.      Iiarray : HFor("f"),Adot,Ashape,Vdiamond,Acolor,Vred
  14. };
复制代码
回复 不支持

使用道具 举报

发表于 2010-12-29 09:22:26 | 显示全部楼层 来自 新加坡
对于你提出的第一点,我不敢苟同。如果程序代码没有使用多线程技术,那么编译后的程序在运行时是绝对不可能是多线程的。如果需要用到多线程,程序代码必须包含相应的代码(比如使用OpenMP的编译指令,或者使用线程库函数(win32的线程,或者Linux上的pthread等,boost等),同时在编译的时候可能还需要打开某些编译选项。也就是说迄今为止,所有的Fortran,c/c++编译器无法智能的产生可以在运行时自动支持多线程的程序。听说新的C++标准有可能在明年发布,其中将正式加入对线程的支持,届时可以在C++程序中像调用其他的标准库函数那样来使用线程了,但是我们仍然需要调用相应的线程函数,否则程序在运行时仍然不支持多线程。

从【循序渐进Forcal例程】中的例子也可以看出,作者之所以建议大家使用多线程来调用forcal,就是因为forcal本身不支持多线程,如果需要进行的计算非常耗时,或者由于逻辑错误不慎进入死循环,调用forcal的程序也将失去相应。这是可以理解的。相信大家都有过类似的经验,比如用notepad不小心打开一个很大(几百兆字节)的一个文本文件的时候,程序就会短暂失去相应。

罗里啰嗦好像说了很多,主要是阐述自己对楼上称述的第一点的不同的理解,只是针对相关技术的讨论,如有冒犯之处,还请见谅。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-12-29 10:01:21 | 显示全部楼层 来自 北京
本帖最后由 rocwoods 于 2010-12-29 11:45 编辑

Mathematic和Maple不熟。根据我的理解,目前MATLAB中唯一实现多线程的方式就是利用timer构造一个定时器对象,而且定时器对象可以不止一个。通过Timer对象的几个强大的属性:StartFcn,StopFcn,TimerFcn,ErrorFcn,Period等可以实现多线程的功能。这方面我的书里写了一些,一个简单的例子可以看看这个:(这个帖子8楼,效果图图片如下):
http://forum.simwe.com/viewthread.php?tid=882701&highlight=

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-29 10:33:39 | 显示全部楼层 来自 山东淄博
对于你提出的第一点,我不敢苟同。如果程序代码没有使用多线程技术,那么编译后的程序在运行时是绝对不可能是多线程的。如果需要用到多线程,程序代码必须包含相应的代码(比如使用OpenMP的编译指令,或者使用线程库 ...
taohe 发表于 2010-12-29 09:22

呵呵,讨论技术问题,哪能谈得上冒犯呢,感谢您的讨论。

可能我的第一点还没有描述清楚。

我的意思是如果设计一个单线程的程序,也就是说自己没有进行多线程设计,但由于使用的库函数可能会开启多个线程,那么这个程序就有多个线程了。可以通过windows的任务管理器查看到底有多少个线程在运行。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-29 10:45:21 | 显示全部楼层 来自 山东淄博
Mathematic和Maple不熟。根据我的理解,目前MATLAB中唯一实现多线程的方式就是利用timer构造一个定时器对象,而且定时器对象可以不止一个。通过Timer对象的几个强大的属性:StartFcn,StopFcn,TimerFcn,ErrorFcn, ...
rocwoods 发表于 2010-12-29 10:01

感谢rocwoods !我也搜到了类似的一些说明。

我想知道,如果这个动画是通过matlab主程序启动的,那么在动画运行的时候,还能通过matlab主窗口运行其他程序吗?

如果这个动画被编译成了独立的程序,那么是否还能加上这样一个功能:在动画演示的时候,程序还能进行其他一些使用matlab脚本引擎的计算?

当然不管是绘制动画,还是计算,耗时应该少。

因为:

多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
回复 不支持

使用道具 举报

发表于 2010-12-29 10:49:14 | 显示全部楼层 来自 新加坡
...
呵我的意思是如果设计一个单线程的程序,也就是说自己没有进行多线程设计,但由于使用的库函数可能会开启多个线程,那么这个程序就有多个线程了。可以通过windows的任务管理器查看到底有多少个线程在运行。
...
wanglu 发表于 2010-12-29 10:33


这是完全有可能的,比如FFTW3就支持多线程并行计算。

另外感谢楼上rocwoods版主的补充,使用定时器是在程序中实现多任务的一种常用的技术。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-29 11:03:10 | 显示全部楼层 来自 山东淄博
将脚本设计成彻底支持多线程的,也不是没有可能(在脚本内部设计成互斥访问共享资源即可),但这样似乎整体效率会更低。

感觉多线程的机制由外部来实现更好,程序员可以更有效地利用资源。
回复 不支持

使用道具 举报

发表于 2010-12-29 11:42:08 | 显示全部楼层 来自 北京
感谢rocwoods !我也搜到了类似的一些说明。

我想知道,如果这个动画是通过matlab主程序启动的,那么在动画运行的时候,还能通过matlab主窗口运行其他程序吗?

如果这个动画被编译成了独立的程序,那么是否还 ...
wanglu 发表于 2010-12-29 10:45

这是可以的,譬如我写的那个函数,在主窗口运行AchaseB启动这个动画后,还可以照样在MATLAB中运行其他程序。你可以试试看。
回复 不支持

使用道具 举报

发表于 2010-12-29 12:34:47 | 显示全部楼层 来自 新加坡
纠正一下自己的帖子里的错误:我在自己的第一个帖子中说过matlab不支持多线程。这其实是不对的,在比较新的matlab(比如R2007b)中,有些内部函数就已经支持多线程并行处理的。有兴趣的可以看看Loren的下面这篇博文:
http://blogs.mathworks.com/loren ... ing-multithreading/

昨晚回帖的时候有点草率了,抱歉。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-29 15:51:43 | 显示全部楼层 来自 山东淄博
这是可以的,譬如我写的那个函数,在主窗口运行AchaseB启动这个动画后,还可以照样在MATLAB中运行其他程序。你可以试试看。
rocwoods 发表于 2010-12-29 11:42

恩,是的,这正是我要看到的效果。也找了几个动画例子,但没有此效果。呵呵。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-29 16:04:24 | 显示全部楼层 来自 山东淄博
脚本对多线程的支持,似乎可以从好几个角度去理解。

1、脚本封装了OpenMP或CUDA中的多线程函数,就加入了OpenMP或CUDA多线程并行计算的支持。

2、脚本自己提供并行计算语句,并行执行程序,加快速度。似乎并行需依靠多线程吧?这个还不是很理解。

3、使用脚本引擎进行混合编程时,在多个线程中互斥地使用脚本引擎,共享脚本资源且相互协作完成任务。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-29 16:08:57 | 显示全部楼层 来自 山东淄博
我想Mathematica、Maple等也可以实现我开始提出的问题吧?

也就是说rocwoods的例子用Mathematica、Maple等也应该可以实现吧?即动画演示的同时,主程序也能运行其他程序。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-30 07:31:11 | 显示全部楼层 来自 山东淄博
MATLAB目前只提供了利用timer构造定时器对象实现多线程,按道理说,应该能提供更多的支持多线程的方法。实际上,多个线程只要互斥地使用MATLAB资源即可,不知哪个地方使得这一点难以实现?

另外,使用MATLAB脚本引擎进行混合编程时,如何在多个线程中互斥地使用MATLAB脚本引擎,哪位朋友有例子可以参考一下?

也希望看到Mathematica、Maple等对多线程支持的介绍。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-5 05:15 , Processed in 0.081494 second(s), 21 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表