[问题]如何设计多线程程序,能达到节省运行时间的目的?

C、C++和Java语言
头像
tnger
帖子: 69
注册时间: 2007-10-06 0:07
送出感谢: 0
接收感谢: 0

[问题]如何设计多线程程序,能达到节省运行时间的目的?

#1

帖子 tnger » 2008-06-24 9:12

我有一个比较耗时间的数值运算程序,单线程需要40s左右的时间(在我的机器上),如果采用多线程设计,会不会节省时间?

我尝试了一下,在网上拷贝了一个简单的双线程程序,发现程序运行的时间不是少了,而是多了,大概要85s。所以我想知道采用多线程是否会节省时间,应该如何设计?请各位大虾不吝赐教,谢谢!
头像
猛将兄
帖子: 2052
注册时间: 2005-10-19 17:33
送出感谢: 0
接收感谢: 0

#2

帖子 猛将兄 » 2008-06-24 9:53

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

#3

帖子 fuhuizn » 2008-06-24 15:10

多核机上有用
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#4

帖子 eexpress » 2008-06-24 15:18

在1个CPU的情况下,多线程必然更慢,因为多个线程之间上下文切换要产生不必要的开销
嗯。又见学院派。
● 鸣学
头像
sonixrp
帖子: 505
注册时间: 2007-03-28 12:39
送出感谢: 0
接收感谢: 0
联系:

#5

帖子 sonixrp » 2008-06-24 15:51

猛将兄 写了:多线程不是提高程序的运行速度,而是提高计算机资源的使用效率
如果运行的任务不是一直在做运算,而是做一会IO,做一会运算,那么在做IO的时候,其他的线程可以做运算。
如果你是作数值运算,并且数据都在内存里面,所有的运算都没有IO等待,那么你在1个CPU的情况下,多线程必然更慢,因为多个线程之间上下文切换要产生不必要的开销。线程之间的互斥也将让效率变低
我想这个知识,大概老师都讲过的吧,但好像很多人都不太懂,基础知识还是很重要的
简单明了,相当正确
目前研究自编译内核,有兴趣的朋友一起来吧~
头像
tnger
帖子: 69
注册时间: 2007-10-06 0:07
送出感谢: 0
接收感谢: 0

#6

帖子 tnger » 2008-06-24 18:41

谢谢猛将兄!
听君一言,豁然开朗啊!

如何是cpu是双核的(现在大部分cpu都是双核的),有没有方法使运行速度更快一点?
mengqing
帖子: 20
注册时间: 2005-11-25 8:43
送出感谢: 0
接收感谢: 0

#7

帖子 mengqing » 2008-06-24 22:47

www.openmp.org

可以参照里面的C++的API
头像
猛将兄
帖子: 2052
注册时间: 2005-10-19 17:33
送出感谢: 0
接收感谢: 0

#8

帖子 猛将兄 » 2008-06-25 1:51

我不知道你的情况是不是这样
1。全部数据load进内存
2。运算可以分成不同的计算单元
如果是
你可以这么作
1。一个线程负责把数据load进内存,然后分发计算任务
2。一个核一个计算线程,负责从数据分发线程取得数据,然后计算
所以你可以有3个线程,一个线程分发任务,另外两个线程负责计算
有一些互斥(主要在分发任务的线程),但是,如果计算占大部分时间,这个互斥可以忽略不计

我做音频编码就是这么做的,基本上两个线程效率是1个线程的2倍。没有4cpu,理论上,会是4倍不到一点点,视你计算量不同而不同
头像
tnger
帖子: 69
注册时间: 2007-10-06 0:07
送出感谢: 0
接收感谢: 0

#9

帖子 tnger » 2008-06-25 10:03

谢谢猛将兄!

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

努力尝试其他降低运算复杂度的方法……
poet
帖子: 2841
注册时间: 2006-09-11 22:47
送出感谢: 0
接收感谢: 4 次

Re: [问题]如何设计多线程程序,能达到节省运行时间的目的?

#10

帖子 poet » 2008-06-25 10:12

tnger 写了:我有一个比较耗时间的数值运算程序,单线程需要40s左右的时间(在我的机器上),如果采用多线程设计,会不会节省时间?
多线程的目标是提高系统响应度,在嵌入式和实时系统中比较常用。

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

——问题是目前的嵌入式和实时系统大都不是多核。
poet
帖子: 2841
注册时间: 2006-09-11 22:47
送出感谢: 0
接收感谢: 4 次

#11

帖子 poet » 2008-06-25 10:13

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 参数。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

#12

帖子 BigSnake.NET » 2008-06-25 10:15

tnger 写了:谢谢猛将兄!

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

努力尝试其他降低运算复杂度的方法……
把三角函数换成查表试试
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
tnger
帖子: 69
注册时间: 2007-10-06 0:07
送出感谢: 0
接收感谢: 0

#13

帖子 tnger » 2008-06-25 10:39

用查表可以减少点时间,但帮助不大,因为我要作的系统的实时的,我的期望治是运算时间控制在20ms以内,现在我把循环次数尽量减少,希望会有帮助。

还是要感谢BigSnake.NET的提示!
头像
greco
帖子: 2487
注册时间: 2007-04-06 10:24
来自: ~/Shanghai
送出感谢: 0
接收感谢: 0

#14

帖子 greco » 2008-06-25 10:41

用Elang写
http://silenceisdefeat.com/~greco

代码: 全选

''.join([chr(ord(c)-2) for c in 'O{"G/ockn"ku<"itgeq0ujkBiockn0eqo'])
echo -n "Z3JlY28uc2hpQGdtYWlsLmNvbQ==" | base64 -d
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#15

帖子 eexpress » 2008-06-25 10:52

20ms以内
要求似乎不高啊。如果就一个循环算法而言。
对于加快速度,查表是特例(高效,减少精度的做法),常规应该是少用库函数,包括浮点的函数/print等带格式化的输入输出函数(弱化浮点操作),自己根据需要的精度,编写必要的运算控制。多使用静态变量,少用标准的c的堆栈操作,尤其数组和参数传递(机器码对堆栈的操作消耗,是几倍到几十倍于静态变量的操作)。
● 鸣学
回复

回到 “C/C++/Java”