免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2005-01-10 11:46 |只看该作者

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

原帖由 "superdoctor" 发表:


即使不能直接操纵cache但是我们都知道cache里面会装些什么啦,所以程序设计还是可以间接的控制一下的

下半部是什么?"万不可用下半部"听着有点象下半身
真心请教


先举个例子,对于一个中断处理:
需要从I/O读取数据,然后进行处理.你可以:
1.在中断处理中读取数据并处理,这样会影响中断响应时间,肯定不好
2.中断处理中读取数据放到缓冲区,然后添加一个task到tasklet或者添加一个BH

BH bottom half顾名思义就是后处理的,相对应的中断处理中的动作就是上半部分了

区别针对10个CPU的多处理系统)
软中断SOFTIRQ:
一个软中断可以并发执行在多个CPU上,此时软中断处理函数要是可重入的,而且对于用到的数据要用spin加以保护

tasklet:
建立在SOFTIRQ之上的
对于有10个task要处理的任务队列,内核会这么处理1task/1cpu,并行处理,但在一个CPU上运行了的task不可以转到另外一个CPU,必须要在该CPU上处理知道结束才可以.

BH
建立在SOFTIRQ之上
对于10个BH要处理的情况,必须是一个BH一个BH的顺序的在某个CPU上处理,也就是说只要有一个BH被处理了,其它的BH必须要等这个BH处理结束后才能处理.

哪个更为适合多CPU系统,一看就知道了吧

平常用的比较多的是tasklet.软中断没用过,一知半解,真心期待高手不吝赐教啊,先谢了

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
22 [报告]
发表于 2005-01-10 12:34 |只看该作者

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

原帖由 "黄山松" 发表:


不太懂如何设计程序才能利用cache?能否请版主将明白些吗?
cache的使用是程序来控制的吗?


cache是os和cpu硬件配合管理的。
在多cpu内cache不一致的时候,cpu系统总线检测cache的改变信号,然后产生无命中的信号,以中断方式传递给os,清洗脏数据,包括L1,L2两级缓存,都会有系统总线的cache监听信号。如果读/写的数据长度和cache长度不符合,os还必须注意读/写数据的完整性,这个os也不能参与,只能适当的调整读出的位数为正确的数据长度。
cache查找速度和实现有关,如果是全路组方式,查找效率最高,但是冲突也会增加。
还有很多。。。。

所以,cache对软件包括os,都可以说是透明的。那么在程序员级能做的,无非就是优化一下数据长度,使之符合cache厂的,或者再进一步优化一下指令序列,配合cpu的U、V流水线的同步执行。
要吃饭了,其余的还没有想到。

论坛徽章:
0
23 [报告]
发表于 2005-01-10 22:47 |只看该作者

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

原帖由 "gvim" 发表:

cache是os和cpu硬件配合管理的。

cache是cpu硬件管理的。

原帖由 "gvim" 发表:

在多cpu内cache不一致的时候,cpu系统总线检测cache的改变信号,然后产生无命中的信号,以中断方式传递给os,清洗脏数据,包括L1, L2两级缓存,都会有系统总线的cache监听信号。
如果读/写的数据长度和cache长度不符合,os还必须注意读/写数据的完整性,这个os也不能参与,只能适当的调整读出的位数为正确的数据长度。
cache查找速度和实现有关,如果是全路组方式,查找效率最高,但是冲突也会增加。
还有很多。。。。

CPU怎么得知他们之间的CACHE不一致呢?
如果允许不同CPU的内存子系统不一致的话,就是NUMA设计了,是大型机的设计思路(在这种平台上,线程才能爽起来). PC平台上似乎没有的.
低端UMA体系的设计思路是采用各种cache同步协议来避免不同CPU的内存子系统发生不一致. 比如Snoopy协议,就是让cpu内的CACHE管理检测总线上面进行的内存操作,在必要的时候产生总线请求硬件信号(参考CPU的BUSREQ管脚),刷新脏数据.
OS不参与所有这些操作.

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
24 [报告]
发表于 2005-01-11 00:35 |只看该作者

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

是硬件管理的,但是要读取到正确的数据,需要os的配合,如果仅仅是cache的话,确实只有cpu的活动。在UNIX Systems for Modern Architectures 上面看到过这部分论证。(书不在手上,可能记忆比较模糊,如果还有什么不对的,也请指正)

NUMA我没有接触过,我只是了解MESI协议。

shit,我这两天犯糊涂,上面说的那个什么中断什么的,是虚拟内存的管理方式。

论坛徽章:
0
25 [报告]
发表于 2005-01-11 09:39 |只看该作者

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

[quote]原帖由 "gvim"]是硬件管理的,但是要读取到正确的数据,需要os的配合,如果仅仅是cache的话,确实只有cpu的活动。在UNIX Systems for Modern Architectures 上面看到过这部分论证。(书不在手上,可能记忆比较模糊,如果还有什么不..........[/quote 发表:


听说过MEI,请教MESI是什么东西?

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
26 [报告]
发表于 2005-01-11 10:09 |只看该作者

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

原帖由 "黄山松" 发表:


听说过MEI,请教MESI是什么东西?


S 是Shared,共享态的意思。

论坛徽章:
0
27 [报告]
发表于 2005-01-11 17:58 |只看该作者

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

原帖由 "JohnBull" 发表:
不能使用多线程,而应该使用多进程。
因为线程之间需要内存的共享,所以任何一个精神正常的人在设计操作系统的时候,都不会把同一个进程的多个线程分布到多个CPU中实现,否则线程间的数据共享会让总线效率剧烈下降?.........



不会吧,谁这样说的, 在WINDOWS系统中,CPU的时间分配是以线程为单位的,而且现在LINUX下,2.6内核后的新的线程模型和新的内核调度器都可以让多个线程跑在不同的CPU上。

我觉得这个问题和KERNEL的内核调度器算法以及线程是内核线程模型还是用户线程模型等有关系。在LINUX2.6以前的内核上,确实一个进程里的线程只能在相同的一个CPU里执行。

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

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

[quote]原帖由 "elssann" 发表:



不会吧,谁这样说的, 在WINDOWS系统中,CPU的时间分配是以线程为单位的,而且现在LINUX下,2.6内核后的新的线程模型和新的内核调度器都可以让多个线程跑在不同的CPU上。

我觉得这个问题和KERNEL的内核调度

论坛徽章:
0
29 [报告]
发表于 2005-01-15 13:05 |只看该作者

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

噢!  原来如此!

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

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

我不明白多CPU是怎么分配资源的,一个进程,分配到多个CPU上,我觉得这个程序本身可以并行计算吧!不是随便拿一个程序来运行,就并行了!有一门课叫并行计算,我不知道是不是与多CPU有关,如果无关,为什么要并行,怎样才能实现并行呢?让大家见笑
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP