对于多线程程序,手机cpu 单核 多核cpu与多核cpu是怎么工作的

浅谈多核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)负载均衡,分为静态的和动态的两种。具体的参见有关文献。
本文永久更新链接地址:
相关资讯 & & &
& (11/17/:17)
& (12/31/:41)
& (12/13/:37)
& (06/14/:33)
& (11/21/:08)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款【图片】【CPU单核-多核】所谓的&程序的多线程优化&?【gpu吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:4,651贴子:
【CPU单核-多核】所谓的&程序的多线程优化&?收藏
不卖关子,直接上结论吧。。。现在几乎找不到单纯的单线程程序了,现在的程序(Windows),除非功能及其简单的程序,几乎全部会创建2个或以上的线程,甚至创建几十上百个线程。楼主用Windows API 查询了下进程,如下图:,,随便一个程序的进程,创建的线程数都是惊人的多
gpu性能优越,通过国家安防权威认证! 通过国家3C质量认证!
GPU吧毕竟讨论的硬件,所以还得回到正题:,软件创建了如此多的线程,而我的CPU只有双核或四核,岂不是浪费?这么多线程,而CPU只有几个线程,多的线程占用了同一个CPU的时间,不能并行执行,当然不会提高程序的执行性能,所以你只有双核双线程的CPU,就算程序创建100个线程,也是然并卵的。,当然开发人员用这么多线程,并不单纯是为了提高性的,多线程的一个及其重要的作用:防止线程阻塞!,为了说明问题,楼主写了个简单的查找文件的小程序,先来个单线程的:如下图:通过API查询为单线程
单纯的单线程程序,很容易发生线程阻塞,导致软件崩溃:,,就像这样,所以现在的软件都必须做成多线程优化的,才具有实际使用价值
下面是做成3个线程后,2个线程由于实际工作,1个线程用于响应用户操作:软件实用性立马好很多,,通过API查询为3个线程:,
总结一下:1、现实情况是,99%的软件都是多线程优化的,真正的单线程程序少的可怜。。2、程序进行多线程优化,并不一定就是为了单纯提高性能的,还有可能是解决线程阻塞的,所以有时候有的软件创建几十上百个线程。。3、其实程序多线程优化很好做的,楼主以前也以为多线程优化不好做,那是站在算法角度看,算法用多线程确实不好优化。但功能上进行多线程优化,是很容易的。。4、多线程优化的程序,也不一定就在多核CPU上有更好的性能表现,这些线程,并不一定实在并行同步执行同一个任务,所以多线程优化的程序不一定就会有更好的性能。关键还的看开发人员是怎么写的。
好久没来了,吧主呢?
所以用了多线程的程序并不一定有很好的并发能力,还是要看实测咯?
能不能测测手机,mtk的10核到底什么时候能群上
算法多线程优化难,功能多线程优化易,总结得不错。多线程做一件事情难,做多件事情容易,多new一些线程就行。这让我想起当初炮神的gpuflops,开始cpu烤机的ui刷新在主线程,导致烤机的时候ui响应迟钝、卡,ui刷新的时候烤机会stall。后来炮神接受别人的意见,ui刷新开辟一个新线程,就不卡了。
苏宁易购手机gpu天梯图,正品行货+百城半日达,全国联保,服务一站式,全场为你而省!苏宁易购手机gpu天梯图,支持货到付款,让您省钱省心!
楼主,你的意思是,同样功能的线程会被创建很多个,但是这些线程里可能只有一个在干活?如果那个唯一干活的线程阻塞了,用什么方法能唤醒闲置的线程来接盘呢?
ios用instruments看就没有单线程的软件
我自己写不服,还有坦克世界
又对硬件重燃兴趣了?
单片机是我的玩具
玩的东西,越来越高端了
多线程其实不等同于多核 多线程算是并发 多核是并行
不是说占有多少线程就是多少线程优化,或者说不是常人理解的多线程,也不是实用的多线程。
然而在移动设备上单线程性能更重要,跑游戏就可看出差距,即使 20core A53 依然跑不过 4core A73
所有的gui程序都需要异步处理啊 要做异步落到底层就是靠多个线程或者硬件中断 谁说多线程没意义的
登录百度帐号推荐应用多核cpu的多线程问题 - ITeye问答
&& 有一点一直在困扰,看过资料介绍多线程的时候说:“运行状态:处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。”
& 那如果如果多核cpu会不会有真正意义上的多个线程的并行,
计算机的多核与多个cpu有什么区别
问题补充:wkoffee 写道多核相当于多个cpu,每个核可以独立的执行一个线程。
你的意思能理解为,现在的双核cpu就是已经真正意义的多线程?
是否是真相?
引用你的意思能理解为,现在的双核cpu就是已经真正意义的多线程?
不知道你对“真正意义”怎么理解,在单cpu单核环境中多线程也是有很大价值的。我想你是想知道是否双核cpu可以同时执行两个线程的指令,不是靠时间片轮转来分享cpu的话,那目前的双核cpu就是如此。
另一种是超线程或叫smt的技术,可以在一个core上同时运行多个线程,由cpu硬件完成线程切换,但因为一个核只有一套执行单元,同一时刻只有线程在运行。
多核相当于多个cpu,每个核可以独立的执行一个线程。
已解决问题
未解决问题Access denied |
used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website () has banned your access based on your browser's signature (3ba5e19c324f6d6c-ua98).

我要回帖

更多关于 强制单核游戏多核运行 的文章

 

随机推荐