免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2003-05-07 13:12 |只看该作者

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

我不知道我的理解是不是有错
因为是以前看折

论坛徽章:
0
12 [报告]
发表于 2003-05-07 13:18 |只看该作者

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

http://unit.cug.edu.cn/wlzx/wlfw/LINUX_UNIX/Kernel/LinuxKernel/chapter4/chapter4.htm

   系统中最重要的资源是 CPU, 通常只有一个。 作为一个多重处理操作系统, Linux 的

目标是让系统中的每个 CPU 上面始终有一个进程在执行, 以充份利用 CPU。 如果进程

数多于 CPU 数(通常总是这样), 多余的进程必须等待有 CPU 空闲下来才能运行。

谢谢JohnBull   兄指点
是我理解错了

论坛徽章:
0
13 [报告]
发表于 2003-05-09 16:02 |只看该作者

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

我不同意JohnBull兄的观点。
不是不能使用多线程,而是多线程用得好不好的问题。
正如蓝色键盘所说的,是程序没有实现得很均衡。

昨天我看到一本书上讲了这个问题。在这里与大家共享
其实我们讨论的问题属于程序可扩展性问题,即服务器性能的提高与CPU数量的增加成正比。但考虑到Context Switch与别的额外开销,服务器性能要达到随CPU数目翻倍而成倍增长是不可能的。最理想的结果是使服务器性能最大限度的增加。

一般的CPU都提供了Cache功能。我们设计的程序最好能利用到Cache,其次是RAM,然后是磁盘。一般在每个CPU中只使用一个线程做处理。我们尽量把相同或相近的操作放在一起来执行,这样当指令和数据被从磁盘中加载到Cache中后,就可以重复调用,不再需要跑到磁盘上去调,从而极大地提高程序的性能。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
14 [报告]
发表于 2003-05-09 16:37 |只看该作者

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

一般的CPU都提供了Cache功能。我们设计的程序最好能利用到Cache,其次是RAM,然后是磁盘。一般在每个CPU中只使用一个线程做处理。我们尽量把相同或相近的操作放在一起来执行,这样当指令和数据被从磁盘中加载到Cache中后,就可以重复调用,不再需要跑到磁盘上去调,从而极大地提高程序的性能。



谢谢你把结果拿来大家一起讨论!

你看到的是单CPU中,进程调度的处理情况。有机会你去找找多CPU体系结构中是怎么实现的。然后把结果告诉大家!

论坛徽章:
0
15 [报告]
发表于 2003-05-09 18:09 |只看该作者

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

许多系统上线程也是使用进程的数据结构实现的(当然有点区别,称为轻量进程)
所以我想这线程和进程是一样

我以前操作系统看的现在都快忘记了
回去补一补

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

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

插个嘴请教一下

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

我直接用sort命令排序的

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

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

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

以下是我实现的代码,请帮忙看看问题在哪里?
如何优化,9个小时实在是太久了!

  1. while(gi_process[i]!=0)
  2.         {
  3.                 if(fork() == 0)
  4.                 {       
  5.                         char cdrsourceid;
  6.                         int i_cdrsourceid;
  7.                         /*LoginToDB();*/
  8.                         LoginToDB("BILL_USER_NAME","BILL_PASS_NAME","CONNECT_STRING");
  9.                         gi_process_id = gi_process[i];
  10.                         /*MonitorChild(gi_process_id,"分拣子进程开始运行");*/
  11.                         GetPreFileName();
  12.                         while( OpenCdrFile( &cdrsourceid ) )
  13.                         {
  14.                                 i_cdrsourceid = atoi(&cdrsourceid);
  15.                                 if( atoi(ptr_shm_drecs+i_cdrsourceid*10))
  16.                                 {
  17.                        
  18.                                         sprintf( sort_originalfile, "%s/%d_D%04d.SORT" , rgTempFileDir , i_cdrsourceid , preproc_batch);
  19.                                         sprintf( sort_resultfile, "%s/%d_D%04d.TMP" , rgTempFileDir , i_cdrsourceid, preproc_batch);
  20.                                         sprintf( sort_comm, "sort -T /bill -k 2 %s >; %s" , sort_originalfile, sort_resultfile );
  21.                                         sprintf( rm_comm, "rm %s", sort_originalfile);
  22.                                         MonitorChild(gi_process_id,sort_comm);
  23.                                         if( system( sort_comm ) != -1)
  24.                                         {
  25.                                                 if( system( rm_comm ) != -1 )
  26.                                                 {
  27.                
  28.                                                         printf("processid= %d,sort_originalfile=%s\n",gi_process_id,sort_originalfile);
  29.                                                        
  30.                                                         continue;
  31.                                                 }       
  32.                                                 else
  33.                                                 {
  34.                                                         printf("Error occur while deleting the file %s\n",sort_originalfile);
  35.                                                         ChildError();
  36.                                                         return -1;
  37.                                                 }
  38.                                         }
  39.                                         else
  40.                                         {
  41.                                                 printf(" Error occur while sorting the file %s\n", sort_originalfile);
  42.                                                 ChildError();
  43.                                                 return -1;
  44.                                         }
  45.                                
  46.                                 }
  47.                                
  48.                         }
  49.                         DestroyPreFileNameTbl();
  50.                         exit(0);
  51.                        
  52.                        
  53.                 }
  54.                 else if(i_fork<0)
  55.                 {
  56.                         perror("fork failed\n");
  57.                         system("/bill/prog_source/dispatch/killdisp");
  58.                 }
  59.         i++;       
  60.         }
复制代码

论坛徽章:
0
18 [报告]
发表于 2005-01-10 09:40 |只看该作者

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

[quote]原帖由 "蓝色键盘"]一般的CPU都提供了Cache功能。我们设计的程序最好能利用到Cache,其次是RAM,然后是磁盘。一般在每个CPU中只使用一个线程做处理。我们尽量把相同或相近的操作放在一起来执行,这样当指令和数据被从磁盘中加载到Cache?.........[/quote 发表:


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

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

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

除了大侠说的这么多,还有比较重要的是在驱动的程序设计中要注意的一些,比如针对中断处理,通常会配合软中断, tasklet, 下半部来处理, 此时只能用软中断或tasklet,万不可用下半部.

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

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

[quote]原帖由 "黄山松"]除了大侠说的这么多,还有比较重要的是在驱动的程序设计中要注意的一些,比如针对中断处理,通常会配合软中断, tasklet, 下半部来处理, 此时只能用软中断或tasklet,万不可用下半部.[/quote 发表:


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

下半部是什么?"万不可用下半部"听着有点象下半身
真心请教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP