当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 32 篇帖子 ]  前往页数 1, 2, 3  下一页
作者 内容
1 楼 
 文章标题 : [问题]如何设计多线程程序,能达到节省运行时间的目的?
帖子发表于 : 2008-06-24 9:12 
头像

注册: 2007-10-06 0:07
帖子: 69
送出感谢: 0 次
接收感谢: 0 次
我有一个比较耗时间的数值运算程序,单线程需要40s左右的时间(在我的机器上),如果采用多线程设计,会不会节省时间?

我尝试了一下,在网上拷贝了一个简单的双线程程序,发现程序运行的时间不是少了,而是多了,大概要85s。所以我想知道采用多线程是否会节省时间,应该如何设计?请各位大虾不吝赐教,谢谢!


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-06-24 9:53 
头像

注册: 2005-10-19 17:33
帖子: 2052
送出感谢: 0 次
接收感谢: 0 次
多线程不是提高程序的运行速度,而是提高计算机资源的使用效率
如果运行的任务不是一直在做运算,而是做一会IO,做一会运算,那么在做IO的时候,其他的线程可以做运算。
如果你是作数值运算,并且数据都在内存里面,所有的运算都没有IO等待,那么你在1个CPU的情况下,多线程必然更慢,因为多个线程之间上下文切换要产生不必要的开销。线程之间的互斥也将让效率变低
我想这个知识,大概老师都讲过的吧,但好像很多人都不太懂,基础知识还是很重要的


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-06-24 15:10 

注册: 2006-01-06 22:55
帖子: 556
送出感谢: 0 次
接收感谢: 0 次
多核机上有用


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-06-24 15:18 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
引用:
在1个CPU的情况下,多线程必然更慢,因为多个线程之间上下文切换要产生不必要的开销
嗯。又见学院派。


_________________
● 鸣学


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-06-24 15:51 
头像

注册: 2007-03-28 12:39
帖子: 505
送出感谢: 0 次
接收感谢: 0 次
猛将兄 写道:
多线程不是提高程序的运行速度,而是提高计算机资源的使用效率
如果运行的任务不是一直在做运算,而是做一会IO,做一会运算,那么在做IO的时候,其他的线程可以做运算。
如果你是作数值运算,并且数据都在内存里面,所有的运算都没有IO等待,那么你在1个CPU的情况下,多线程必然更慢,因为多个线程之间上下文切换要产生不必要的开销。线程之间的互斥也将让效率变低
我想这个知识,大概老师都讲过的吧,但好像很多人都不太懂,基础知识还是很重要的


简单明了,相当正确


_________________
目前研究自编译内核,有兴趣的朋友一起来吧~


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-06-24 18:41 
头像

注册: 2007-10-06 0:07
帖子: 69
送出感谢: 0 次
接收感谢: 0 次
谢谢猛将兄!
听君一言,豁然开朗啊!

如何是cpu是双核的(现在大部分cpu都是双核的),有没有方法使运行速度更快一点?


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-06-24 22:47 

注册: 2005-11-25 8:43
帖子: 20
送出感谢: 0 次
接收感谢: 0 次
www.openmp.org

可以参照里面的C++的API


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2008-06-25 1:51 
头像

注册: 2005-10-19 17:33
帖子: 2052
送出感谢: 0 次
接收感谢: 0 次
我不知道你的情况是不是这样
1。全部数据load进内存
2。运算可以分成不同的计算单元
如果是
你可以这么作
1。一个线程负责把数据load进内存,然后分发计算任务
2。一个核一个计算线程,负责从数据分发线程取得数据,然后计算
所以你可以有3个线程,一个线程分发任务,另外两个线程负责计算
有一些互斥(主要在分发任务的线程),但是,如果计算占大部分时间,这个互斥可以忽略不计

我做音频编码就是这么做的,基本上两个线程效率是1个线程的2倍。没有4cpu,理论上,会是4倍不到一点点,视你计算量不同而不同


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2008-06-25 10:03 
头像

注册: 2007-10-06 0:07
帖子: 69
送出感谢: 0 次
接收感谢: 0 次
谢谢猛将兄!

看来我要先尝试一下其他的降低复杂度的方法:降低运算精度,数据压缩等方法了。因为我的运算是单纯的数值运算,像的d(i).x*cos(j*3.14/180)+d(i).y*sin(j*3.14/180)之类的(i,j 是循环变量),并且循环次数在10的9次方左右,只是数据之间是不关联的,所以我最初的想法是想尝试一下能够分开两个线程以减少运行时间,现在看来这个想法太不切实际了。

努力尝试其他降低运算复杂度的方法……


页首
 用户资料  
 
10 楼 
 文章标题 : Re: [问题]如何设计多线程程序,能达到节省运行时间的目的?
帖子发表于 : 2008-06-25 10:12 

注册: 2006-09-11 22:47
帖子: 2841
送出感谢: 0 次
接收感谢: 4
tnger 写道:
我有一个比较耗时间的数值运算程序,单线程需要40s左右的时间(在我的机器上),如果采用多线程设计,会不会节省时间?


多线程的目标是提高系统响应度,在嵌入式和实时系统中比较常用。

至于节省时间,除非你有多核系统或者多CPU系统,否则多线程绝对不能节省时间。

——问题是目前的嵌入式和实时系统大都不是多核。


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2008-06-25 10:13 

注册: 2006-09-11 22:47
帖子: 2841
送出感谢: 0 次
接收感谢: 4
tnger 写道:
谢谢猛将兄!

看来我要先尝试一下其他的降低复杂度的方法:降低运算精度,数据压缩等方法了。因为我的运算是单纯的数值运算,像的d(i).x*cos(j*3.14/180)+d(i).y*sin(j*3.14/180)之类的(i,j 是循环变量),并且循环次数在10的9次方左右,只是数据之间是不关联的,所以我最初的想法是想尝试一下能够分开两个线程以减少运行时间,现在看来这个想法太不切实际了。

努力尝试其他降低运算复杂度的方法……


用什么语言的?用C的话试试编译加 -msse2 -fpmath=sse 参数。


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2008-06-25 10:15 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
tnger 写道:
谢谢猛将兄!

看来我要先尝试一下其他的降低复杂度的方法:降低运算精度,数据压缩等方法了。因为我的运算是单纯的数值运算,像的d(i).x*cos(j*3.14/180)+d(i).y*sin(j*3.14/180)之类的(i,j 是循环变量),并且循环次数在10的9次方左右,只是数据之间是不关联的,所以我最初的想法是想尝试一下能够分开两个线程以减少运行时间,现在看来这个想法太不切实际了。

努力尝试其他降低运算复杂度的方法……


把三角函数换成查表试试


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2008-06-25 10:39 
头像

注册: 2007-10-06 0:07
帖子: 69
送出感谢: 0 次
接收感谢: 0 次
用查表可以减少点时间,但帮助不大,因为我要作的系统的实时的,我的期望治是运算时间控制在20ms以内,现在我把循环次数尽量减少,希望会有帮助。

还是要感谢BigSnake.NET的提示!


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2008-06-25 10:41 
头像

注册: 2007-04-06 10:24
帖子: 2487
地址: ~/Shanghai
送出感谢: 0 次
接收感谢: 0 次
用Elang写


_________________
http://silenceisdefeat.com/~greco
代码:
''.join([chr(ord(c)-2) for c in 'O{"G/ockn"ku<"itgeq0ujkBiockn0eqo'])
echo -n "Z3JlY28uc2hpQGdtYWlsLmNvbQ==" | base64 -d


页首
 用户资料  
 
15 楼 
 文章标题 :
帖子发表于 : 2008-06-25 10:52 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
引用:
20ms以内
要求似乎不高啊。如果就一个循环算法而言。
对于加快速度,查表是特例(高效,减少精度的做法),常规应该是少用库函数,包括浮点的函数/print等带格式化的输入输出函数(弱化浮点操作),自己根据需要的精度,编写必要的运算控制。多使用静态变量,少用标准的c的堆栈操作,尤其数组和参数传递(机器码对堆栈的操作消耗,是几倍到几十倍于静态变量的操作)。


_________________
● 鸣学


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 32 篇帖子 ]  前往页数 1, 2, 3  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译