mpi并行计算程序单机多线程可以运行,为什么多机计算时出现错

浅谈多核CPU、多线程与并行计算_Linux教程_Linux公社-Linux系统门户网站
你好,游客
浅谈多核CPU、多线程与并行计算
来源:Linux社区&
作者:delacroix_xu
笔者用过MPI和C#线程池,参加过比赛,有所感受,将近一年来,对多线程编程兴趣一直不减,一直有所关注,决定写篇文章,算是对知识的总结吧。有说的不对的地方,欢迎各位大哥们指正:)
1.CPU发展趋势
核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16核32线程),我们如何来面对这突如其来的核心数目的增加?编程也要与时俱进。笔者斗胆预测,CPU各个核心之间的片内总线将会采用4路组相连:),因为全相连太过复杂,单总线又不够给力。而且应该是非对称多核处理器,可能其中会混杂几个DSP处理器或流处理器。
2.多线程与并行计算的区别
(1)多线程的作用不只是用作并行计算,他还有很多很有益的作用。
还在单核时代,多线程就有很广泛的应用,这时候多线程大多用于降低阻塞(意思是类似于
if(flag==1)
这样的代码)带来的CPU资源闲置,注意这里没有浪费CPU资源,去掉sleep(1)就是纯浪费了。
阻塞在什么时候发生呢?一般是等待IO操作(磁盘,数据库,网络等等)。此时如果单线程,CPU会干转不干实事(与本程序无关的事情都算不干实事,因为执行其他程序对我来说没意义),效率低下(针对这个程序而言),例如一个IO操作要耗时10毫秒,CPU就会被阻塞接近10毫秒,这是何等的浪费啊!要知道CPU是数着纳秒过日子的。
所以这种耗时的IO操作就用一个线程Thread去代为执行,创建这个线程的函数(代码)部分不会被IO操作阻塞,继续干这个程序中其他的事情,而不是干等待(或者去执行其他程序)。
同样在这个单核时代,多线程的这个消除阻塞的作用还可以叫做&并发&,这和并行是有着本质的不同的。并发是&伪并行&,看似并行,而实际上还是一个CPU在执行一切事物,只是切换的太快,我们没法察觉罢了。例如基于UI的程序(俗话说就是图形界面),如果你点一个按钮触发的事件需要执行10秒钟,那么这个程序就会假死,因为程序在忙着执行,没空搭理用户的其他操作;而如果你把这个按钮触发的函数赋给一个线程,然后启动线程去执行,那么程序就不会假死,继续相应用户的其他操作。但是,随之而来的就是线程的互斥和同步、死锁等问题,详细见有关文献。
现在是多核时代了,这种线程的互斥和同步问题是更加严峻的,单核时代大都算并发,多核时代真的就大为不同,为什么呢?具体细节请参考有关文献。我这里简单解释一下,以前volatile型变量的使用可以解决大部分问题,例如多个线程共同访问一个Flag标志位,如果是单核并发,基本不会出问题(P.S.在什么情况下会出问题呢?Flag有多个,或者是一个数组,这时候只能通过逻辑手段搞定这个问题了,多来几次空转无所谓,别出致命问题就行),因为CPU只有一个,同时访问这个标志位的只能有一个线程,而多核情况下就不太一样了,所以仅仅volatile不太能解决问题,这就要用到具体语言,具体环境中的&信号量&了,Mutex,Monitor,Lock等等,这些类都操作了硬件上的&关中断&,达到&原语&效果,对临界区的访问不被打断的效果,具体就不解释了,读者可以看看《现代操作系统》。
(2)并行计算还可以通过其他手段来获得,而多线程只是其中之一。
其他手段包括:多进程(这又包括共享存储区的和分布式多机,以及混合式的),指令级并行。
ILP(指令级并行),x86架构里叫SMT(同时多线程),在MIPS架构里与之对应的是super scalar(超标量)和乱序执行,二者有区别,但共同点都是可以达到指令级并行,这是用户没法控制的,不属于编程范围,只能做些有限的优化,而这有限的优化可能只属于编译器管辖的范畴,用户能做的甚少。
(3)典型的适于并行计算的语言
Erlang和MPI:这两个前者是语言,后者是C++和Fortran的扩展库,效果是一样的,利用多进程实现并行计算,Erlang是共享存储区的,MPI是混合型的。
C#.NET4.0:新版本4.0可以用少量代码实现并行For循环,之前版本需要用很繁琐的代码才能实现同样功能。这是利用了多线程实现并行计算。Java和C#3.5都有线程池(ThreadPool),也是不错的很好用的多线程管理类,可以方便高效的使用多线程。
CUDA,还是个初生牛犊,有很大的发展潜力,只不过就目前其应用领域很有限。其目前只能使用C语言,而且还不是C99,比较低级,不能使用函数指针。个人感觉这由于硬件上天生的局限性(平均每个核心可用内存小,与系统内存通讯时间长),只适用于做科学计算,静态图像处理,视频编码解码,其他领域,还不如高端CPU。等以后GPU有操作系统了,能充分调度GPU资源了,GPU就可以当大神了。游戏中的物理加速,实际上多核CPU也能很好的做到。
其他语言。。。恩。。留作将来讨论。
3.线程越多越好吗?什么时候才有必要用多线程?
线程必然不是越多越好,线程切换也是要开销的,当你增加一个线程的时候,增加的额外开销要小于该线程能够消除的阻塞时间,这才叫物有所值。
Linux自从2.6内核开始,就会把不同的线程交给不同的核心去处理。Windows也从NT.4.0开始支持这一特性。
什么时候该使用多线程呢?这要分四种情况讨论:
a.多核CPU&&计算密集型任务。此时要尽量使用多线程,可以提高任务执行效率,例如加密解密,数据压缩解压缩(视频、音频、普通数据),否则只能使一个核心满载,而其他核心闲置。
b.单核CPU&&计算密集型任务。此时的任务已经把CPU资源100%消耗了,就没必要也不可能使用多线程来提高计算效率了;相反,如果要做人机交互,最好还是要用多线程,避免用户没法对计算机进行操作。
c.单核CPU&&IO密集型任务,使用多线程还是为了人机交互方便,
d.多核CPU&&IO密集型任务,这就更不用说了,跟单核时候原因一样。
4.程序员需要掌握的技巧/技术
(1)减少串行化的代码用以提高效率。这是废话。
(2)单一的共享数据分布化:把一个数据复制很多份,让不同线程可以同时访问。
(3)负载均衡,分为静态的和动态的两种。具体的参见有关文献。
本文永久更新链接地址:
相关资讯 & & &
& (06月14日)
& (11/21/:08)
& (11月17日)
& (12/31/:41)
& (01/25/:39)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:7&分页:FireHawk发信人: FireHawk (FireHawk), 信区: NumComp
标&&题: [求助]MPI并行程序单机多线程可以运行,为什么多机计算时出现错
发信站: 水木社区 (Thu Jun 18 21:36:48 2015), 站内 && 最近弄了一个基于MPI的Fortran计算程序,采用非阻塞方式进行通信。在单机多线程时,没有问题,扩展性还行。但是准备进行多机并行时,出现类似如下的错误:
forrtl:severe&157& program Exception-access violation
stack trace terminated abnormally
job aborted
rank: none: exit code
0:&&&&jd1: 157: process 0 exited without calling finalize
1:&&&&jd1: 123
2:&&&&jd1: 123
3:&&&&jd1: 157: process 3 exited without calling finalize
4:&&&&jd2: 123
5:&&&&jd2: 123
6:&&&&jd2: 123
7:&&&&jd2: 123 && 经过测试发现,可能是在进行数据发送和接收时出现了错误,但是每次出现错误使程序无法运行的位置不是固定的,而且这个位置也会随着线程数发生显著变化。比如我如果用采两台机子各一个线程进行并行测试时,程序出错的位置就被推后了不少。 && 请问有经验的大牛,这个问题一般是怎么产生的呢?是程序设计问题还是与两台机子的硬件环境有关系呢?该怎么排查解决呢?万分感谢,我已经被这问题折磨一周了。
-- && ※ 来源:·水木社区 ·[FROM: 113.200.79.*]
Tony庄主发信人: Tommy003 (Tony庄主), 信区: NumComp
标&&题: Re: [求助]MPI并行程序单机多线程可以运行,为什么多机计算时出
发信站: 水木社区 (Thu Jun 18 21:53:42 2015), 站内 &&&& 我也是搞CFD模拟的,尝试了好多次几台电脑并行计算,始终没有搞成功。在这里希望你能成功,到时候分享一下经验,谢谢。 && 【 在 FireHawk 的大作中提到: 】
: 最近弄了一个基于MPI的Fortran计算程序,采用非阻塞方式进行通信。在单机多线程时,没有问题,扩展性还行。但是准备进行多机并行时,出现类似如下的错误:
: forrtl:severe&157& program Exception-access violation
: ...................
&& -- && ※ 来源:·水木社区 ·[FROM: 123.157.71.*]
建议刑法设立卢瑟罪和猥琐罪发信人: ruster (建议刑法设立卢瑟罪和猥琐罪), 信区: NumComp
标&&题: Re: [求助]MPI并行程序单机多线程可以运行,为什么多机计算时出
发信站: 水木社区 (Sat Jun 20 10:37:19 2015), 站内 && 像是send-recieve的时候某个参数的类型错了 && 【 在 FireHawk (FireHawk) 的大作中提到: 】
: 最近弄了一个基于MPI的Fortran计算程序,采用非阻塞方式进行通信。在单机多线程时,没有问题,扩展性还行。但是准备进行多机并行时,出现类似如下的错误:
: forrtl:severe&157& program Exception-access violation
: ...................
国家枪毙局执行纲要:
1.数量与质量兼顾,保证数量,尽量超额完成任务。
2.枪毙,注射和电椅,凌迟并行,发展交通肇事等新型执行手段。
3.枪毙温拿和枪毙卢瑟搭配,温拿优先。
4.子弹费五毛七分和日元均可,鼓励五毛。 &&&& ※ 来源:·水木社区 newsmth.net·[FROM: 59.44.151.*]
FireHawk发信人: FireHawk (FireHawk), 信区: NumComp
标&&题: Re: [求助]MPI并行程序单机多线程可以运行,为什么多机计算时出
发信站: 水木社区 (Sat Jun 20 10:49:45 2015), 站内 && 好的,我试试。那为啥单机多线程时没问题呢?
【 在 ruster 的大作中提到: 】
: 像是send-recieve的时候某个参数的类型错了
-- && ※ 来源:·水木社区 ·[FROM: 117.136.25.*]
建议刑法设立卢瑟罪和猥琐罪发信人: ruster (建议刑法设立卢瑟罪和猥琐罪), 信区: NumComp
标&&题: Re: [求助]MPI并行程序单机多线程可以运行,为什么多机计算时出
发信站: 水木社区 (Sat Jun 20 10:50:50 2015), 站内 && 存储空间对位不一样,另外也可能有些东西共享数据了 &&&& 【 在 FireHawk (FireHawk) 的大作中提到: 】
: 好的,我试试。那为啥单机多线程时没问题呢?
国家枪毙局执行纲要:
1.数量与质量兼顾,保证数量,尽量超额完成任务。
2.枪毙,注射和电椅,凌迟并行,发展交通肇事等新型执行手段。
3.枪毙温拿和枪毙卢瑟搭配,温拿优先。
4.子弹费五毛七分和日元均可,鼓励五毛。 &&&& ※ 来源:·水木社区 newsmth.net·[FROM: 59.44.151.*]
FireHawk发信人: FireHawk (FireHawk), 信区: NumComp
标&&题: Re: [求助]MPI并行程序单机多线程可以运行,为什么多机计算时出
发信站: 水木社区 (Sat Jun 20 10:52:23 2015), 站内 && 哦。好的,我再调试一下。谢谢师兄!
【 在 ruster 的大作中提到: 】
: 存储空间对位不一样,另外也可能有些东西共享数据了
-- && ※ 来源:·水木社区 ·[FROM: 117.136.25.*]
慢性子发信人: jman (慢性子), 信区: NumComp
标&&题: Re: [求助]MPI并行程序单机多线程可以运行,为什么多机计算时出
发信站: 水木社区 (Sun Jun 21 22:17:48 2015), 站内 && 使用什么方案? &&&& 【 在 Tommy003 (Tony庄主) 的大作中提到: 】
: 标&&题: Re: [求助]MPI并行程序单机多线程可以运行,为什么多机计算时出
: 发信站: 水木社区 (Thu Jun 18 21:53:42 2015), 站内
: 我也是搞CFD模拟的,尝试了好多次几台电脑并行计算,始终没有搞成功。在这里希望你能成功,到时候分享一下经验,谢谢。
: 【 在 FireHawk 的大作中提到: 】
: : 最近弄了一个基于MPI的Fortran计算程序,采用非阻塞方式进行通信。在单机多线程时,没有问题,扩展性还行。但是准备进行多机并行时,出现类似如下的错误:
: : forrtl:severe&157& program Exception-access violation
: : ...................
: ※ 来源:·水木社区 ·[FROM: 123.157.71.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 36.45.172.*]
文章数:7&分页:
抽奖到手软!将狂欢进行到底!trackbacks-0
http://blog.csdn.net/delacroix_xu/article/details/5928121
最近发觉自己博客转帖的太多,于是决定自己写一个原创的。笔者用过MPI和C#线程池,参加过比赛,有所感受,将近一年来,对多线程编程兴趣一直不减,一直有所关注,决定写篇文章,算是对知识的总结吧。有说的不对的地方,欢迎各位大哥们指正:)
1.CPU发展趋势
核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16核32线程),我们如何来面对这突如其来的核心数目的增加?编程也要与时俱进。笔者斗胆预测,CPU各个核心之间的片内总线将会采用4路组相连:),因为全相连太过复杂,单总线又不够给力。而且应该是非对称多核处理器,可能其中会混杂几个DSP处理器或流处理器。
2.多线程与并行计算的区别
(1)多线程的作用不只是用作并行计算,他还有很多很有益的作用。
还在单核时代,多线程就有很广泛的应用,这时候多线程大多用于降低阻塞(意思是类似于
if(flag==1)
这样的代码)带来的CPU资源闲置,注意这里没有浪费CPU资源,去掉sleep(1)就是纯浪费了。
阻塞在什么时候发生呢?一般是等待IO操作(磁盘,数据库,网络等等)。此时如果单线程,CPU会干转不干实事(与本程序无关的事情都算不干实事,因为执行其他程序对我来说没意义),效率低下(针对这个程序而言),例如一个IO操作要耗时10毫秒,CPU就会被阻塞接近10毫秒,这是何等的浪费啊!要知道CPU是数着纳秒过日子的。
所以这种耗时的IO操作就用一个线程Thread去代为执行,创建这个线程的函数(代码)部分不会被IO操作阻塞,继续干这个程序中其他的事情,而不是干等待(或者去执行其他程序)。
同样在这个单核时代,多线程的这个消除阻塞的作用还可以叫做&并发&,这和并行是有着本质的不同的。并发是&伪并行&,看似并行,而实际上还是一个CPU在执行一切事物,只是切换的太快,我们没法察觉罢了。例如基于UI的程序(俗话说就是图形界面),如果你点一个按钮触发的事件需要执行10秒钟,那么这个程序就会假死,因为程序在忙着执行,没空搭理用户的其他操作;而如果你把这个按钮触发的函数赋给一个线程,然后启动线程去执行,那么程序就不会假死,继续相应用户的其他操作。但是,随之而来的就是线程的互斥和同步、死锁等问题,详细见有关文献。
现在是多核时代了,这种线程的互斥和同步问题是更加严峻的,单核时代大都算并发,多核时代真的就大为不同,为什么呢?具体细节请参考有关文献。我这里简单解释一下,以前volatile型变量的使用可以解决大部分问题,例如多个线程共同访问一个Flag标志位,如果是单核并发,基本不会出问题(P.S.在什么情况下会出问题呢?Flag有多个,或者是一个数组,这时候只能通过逻辑手段搞定这个问题了,多来几次空转无所谓,别出致命问题就行),因为CPU只有一个,同时访问这个标志位的只能有一个线程,而多核情况下就不太一样了,所以仅仅volatile不太能解决问题,这就要用到具体语言,具体环境中的&信号量&了,Mutex,Monitor,Lock等等,这些类都操作了硬件上的&关中断&,达到&原语&效果,对临界区的访问不被打断的效果,具体就不解释了,读者可以看看《现代操作系统》。
(2)并行计算还可以通过其他手段来获得,而多线程只是其中之一。
其他手段包括:多进程(这又包括共享存储区的和分布式多机,以及混合式的),指令级并行。
ILP(指令级并行),x86架构里叫SMT(同时多线程),在MIPS架构里与之对应的是super scalar(超标量)和乱序执行,二者有区别,但共同点都是可以达到指令级并行,这是用户没法控制的,不属于编程范围,只能做些有限的优化,而这有限的优化可能只属于编译器管辖的范畴,用户能做的甚少。
(3)典型的适于并行计算的语言
Erlang和MPI:这两个前者是语言,后者是C++和Fortran的扩展库,效果是一样的,利用多进程实现并行计算,Erlang是共享存储区的,MPI是混合型的。
C#.NET4.0:新版本4.0可以用少量代码实现并行For循环,之前版本需要用很繁琐的代码才能实现同样功能。这是利用了多线程实现并行计算。Java和C#3.5都有线程池(ThreadPool),也是不错的很好用的多线程管理类,可以方便高效的使用多线程。
CUDA,还是个初生牛犊,有很大的发展潜力,只不过就目前其应用领域很有限。其目前只能使用C语言,而且还不是C99,比较低级,不能使用函数指针。个人感觉这由于硬件上天生的局限性(平均每个核心可用内存小,与系统内存通讯时间长),只适用于做科学计算,静态图像处理,视频编码解码,其他领域,还不如高端CPU。等以后GPU有操作系统了,能充分调度GPU资源了,GPU就可以当大神了。游戏中的物理加速,实际上多核CPU也能很好的做到。
其他语言。。。恩。。留作将来讨论。
3.线程越多越好吗?什么时候才有必要用多线程?
线程必然不是越多越好,线程切换也是要开销的,当你增加一个线程的时候,增加的额外开销要小于该线程能够消除的阻塞时间,这才叫物有所值。
Linux自从2.6内核开始,就会把不同的线程交给不同的核心去处理。Windows也从NT.4.0开始支持这一特性。
什么时候该使用多线程呢?这要分四种情况讨论:
a.多核CPU&&计算密集型任务。此时要尽量使用多线程,可以提高任务执行效率,例如加密解密,数据压缩解压缩(视频、音频、普通数据),否则只能使一个核心满载,而其他核心闲置。
b.单核CPU&&计算密集型任务。此时的任务已经把CPU资源100%消耗了,就没必要也不可能使用多线程来提高计算效率了;相反,如果要做人机交互,最好还是要用多线程,避免用户没法对计算机进行操作。
c.单核CPU&&IO密集型任务,使用多线程还是为了人机交互方便,
d.多核CPU&&IO密集型任务,这就更不用说了,跟单核时候原因一样。
红色代表针对计算密集型的讨论(多核加快计算速度);
绿色代表针对IO密集型的讨论(就是避免因为IO而程序卡死);
4.程序员需要掌握的技巧/技术
(1)减少串行化的代码用以提高效率。这是废话。
(2)单一的共享数据分布化:把一个数据复制很多份,让不同线程可以同时访问。
(3)负载均衡,分为静态的和动态的两种。具体的参见有关文献。
阅读(...) 评论()高性能计算习题及答案_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
高性能计算习题及答案
上传于||文档简介
&&计​算​机​及​通​信​专​业​研​究​生​课​程​必​备
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩12页未读,继续阅读
你可能喜欢并行计算跟多线程的区别 - 高性能计算当前位置:& &&&并行计算跟多线程的区别并行计算跟多线程的区别&&网友分享于:&&浏览:39次并行计算和多线程的区别有哪位大神能说下多线程和并行计算的区别啊,哪个是cup分时间分别计算每个任务,哪个是多个cpu分别计算每个任务,海望详细解释下,困扰半年多了也没找到定数
------解决方案--------------------这概念困扰半年还不如写一个月代码------解决方案--------------------多线程是一个线程只能运行在一个CPU,多个线程可以运行在多个CPU;并行计算是一个线程可以运行在多个CPU。。
不知道我理解的对不对,大牛指点一下
------解决方案--------------------好吧,&并行计算式多个线程运行在多个cpu上,&多线程是多个线程运行在一个cpu上,&并行计算基本是依赖多线程的。
如果多个线程在一个cpu上那么就是伪并行------解决方案--------------------引用:多线程是一个线程只能运行在一个CPU,多个线程可以运行在多个CPU;并行计算是一个线程可以运行在多个CPU。。
不知道我理解的对不对,大牛指点一下
不是这个意思吧,线程已经是最小单位了,一个线程只能运行在一个CPU上吧------解决方案--------------------按照我的理解&进程是一个独立运行的程序&线程进程中的并发执行的单位
多线程只是并行计算的一种方式
openmp&&运行在单节点上&单进程&多线程&多线程共用本地所有的核
MPI&运行在单节点或者多节点上&&多进程&&一般来说每个进程占用一个核&
MPI&+&OPENMP&&每个进程占用一个节点&在每个节点中&多个进程共享所有的本地核
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 mpi并行程序设计 pdf 的文章

 

随机推荐