免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: magicercn
打印 上一主题 下一主题

如何使代码在多CPU环境下运行得更有效率 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2005-01-15 20:04 |只看该作者

如何使代码在多CPU环境下运行得更有效率

多处理器调度....这个其实首先应该看看你程序运行的平台.我们的程序是在OS之上建立的.因此MPS的调度要看OS的算法了.
如果将每个线程都放在不同的CPU中执行,就是OS给一个就绪队列,然后各个cpu都去那里取进程并执行,那么cpu的Cache效率就有可能很低下.而且有可能导致线程切换频繁(因为要同步的关系).
广泛使用的可能是成组分配方式.
而每个处理器一个进程,这个算是专用处理器分配方式,通常只有大型系统的OS才会使用到.一般的OS,特别是微机上,我想不会出现的.

To cattiger兄:
一个进程,应该只有再有线程的情况下才会分配到多个CPU中处理,还要考虑同步问题.一个孤独的进程,应该是不会同一时刻出现在多个CPU中跑的.要并行处理,应该也有特殊的要求,而不是任意一个程序都能这样的.当然这个是我自己的理解,没有参考什么资料.

论坛徽章:
0
32 [报告]
发表于 2005-01-16 11:18 |只看该作者

如何使代码在多CPU环境下运行得更有效率

[quote]原帖由 "R.Ihskaka"]一个孤独的进程,应该是不会同一时刻出现在多个CPU中跑的......[/quote 发表:

进程可大可小,要看怎么样的进程了。

论坛徽章:
0
33 [报告]
发表于 2005-01-16 16:34 |只看该作者

如何使代码在多CPU环境下运行得更有效率

原帖由 "magicercn" 发表:
最好是能够充分利用系统的资源

希望有经验的各位高手指点。


这似乎并非纯代码能解决的问题。在CPU相同的前提下,系统开销主要用于进程的调度。同一进程在这个运行周期由CPU A执行,下一运行周期可能由CPU B执行,如果忽略CPU缓存的影响,多CPU和单CPU对该进程的执行时间应该是相同的。
效率最高的办法是用CPU绑定(模拟单进程操作系统,例如DOS),省去了调度的开销,效率绝对高!但这肯定会影响其它进程的运行。并且这种模式需要操作系统的支持。

论坛徽章:
0
34 [报告]
发表于 2005-01-16 17:38 |只看该作者

如何使代码在多CPU环境下运行得更有效率

原帖由 "JohnBull" 发表:


不是不可以,而是不应该让从属于同一个进程的多个线程跑在不同的CPU上。
当初我们为什么设计线程?是为了让不同的执行上下文共享数据段.也就是说,当执行上下文之间需要大量数据段内容需要共享时,应当选择线程.
然..........


说的有道理。
刚好遇到一个问题。在V880的机器上8CPU,Solaris8系统。
系统在运行的时候会有产生很多线程。当它运行的时候,8个CPU占用率接近80%,执行时间为38分钟;后来根据业务将线程分成3个进程(生成的总的线程数应该是一样的),CPU占用率降低为60%,执行时间在20分钟以内。
还在查为什么会这样呢。在看看还有没有优化的空间和方法。

不过,还写了一个代码,在2CPU上的执行效率,看使用不使用多线程的效率是一样的,就比较奇怪了。用的函数就是unix的基本函数pthread。

论坛徽章:
0
35 [报告]
发表于 2005-01-16 17:43 |只看该作者

如何使代码在多CPU环境下运行得更有效率

原帖由 "JohnBull" 发表:

CPU怎么得知他们之间的CACHE不一致呢?
如果允许不同CPU的内存子系统不一致的话,就是NUMA设计了,是大型机的设计思路(在这种平台上,线程才能爽起来). PC平台上似乎没有的.
低端UMA体系的设计思路是采用各种cache同?.........


不知道solaris操作系统,在使用多线程或者多进程的时候,无论cache或者什么的,有没有相关的操作系统配置参数,确保我的多CPU,多内存能够最大的使用,或者cache,或者编译选项。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
36 [报告]
发表于 2005-01-18 14:42 |只看该作者

如何使代码在多CPU环境下运行得更有效率

学习中...

论坛徽章:
0
37 [报告]
发表于 2005-01-19 11:23 |只看该作者

如何使代码在多CPU环境下运行得更有效率

对你的程序很感兴趣,能贴上来吗?

原帖由 "syxie" 发表:


不知道solaris操作系统,在使用多线程或者多进程的时候,无论cache或者什么的,有没有相关的操作系统配置参数,确保我的多CPU,多内存能够最大的使用,或者cache,或者编译选项。

论坛徽章:
0
38 [报告]
发表于 2005-01-19 11:35 |只看该作者

如何使代码在多CPU环境下运行得更有效率

你的计算有问题。
10个进程运行9小时,也就是90个进程运行1小时,处理900个文件,
也就是一个进程运行1小时处理了10个文件,平均为6分钟处理一个文件。
比你单独运行sort 命令要快。

原帖由 "cnufo" 发表:
插个嘴请教一下

插个嘴请教一下

我要对900多个文件排序,每个文件200万行左右,总行数在1。8亿
开了十个进程排序竟然要9个小时

我直接用sort命令排序的

单个执行sort 一个文件才11分钟
为什么并行后平均下来一个进程一个小时只排序一个文件呢?

论坛徽章:
0
39 [报告]
发表于 2005-01-19 14:32 |只看该作者

如何使代码在多CPU环境下运行得更有效率

可以使用vmstat来查看你的程序再干什么,是在cpu 上运行还是在I/O等待,还是在做page in/page out。这些和你使用的机器以及操作系统有很大关系。如果是solaris的,我还比较熟悉。也许可以帮你分析一下。

[quote]原帖由 "magicercn"][/quote 发表:

论坛徽章:
0
40 [报告]
发表于 2005-01-19 15:33 |只看该作者

如何使代码在多CPU环境下运行得更有效率

syxie,可否吧你的程序发邮件给我。想看看你的程序,因为最近对并行计算比较感兴趣。
和另外一个同事谈了一下,感觉你的情况是反常的。应该是一个进程派生多个子线程性能更好一些。


原帖由 "syxie" 发表:


JohnBull 写到:


不是不可以,而是不应该让从属于同一个进程的多个线程跑在不同的CPU上。
当初我们为什么设计线程?是为了让不同的执行上下文共享数据段.也就是说,当执行上下文之间需要大量数据段内容需要共享时,应当选择线程.
然..........


说的有道理。
刚好遇到一个问题。在V880的机器上8CPU,Solaris8系统。
系统在运行的时候会有产生很多线程。当它运行的时候,8个CPU占用率接近80%,执行时间为38分钟;后来根据业务将线程分成3个进程(生成的总的线程数应该是一样的),CPU占用率降低为60%,执行时间在20分钟以内。
还在查为什么会这样呢。在看看还有没有优化的空间和方法。

不过,还写了一个代码,在2CPU上的执行效率,看使用不使用多线程的效率是一样的,就比较奇怪了。用的函数就是unix的基本函数pthread。

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP