西西河

主题:【求助】:请教信息技术方面的大牛有关多线程的问题 -- newtime

共:💬51 🌺45
全看树展主题 · 分页首页 上页
/ 4
下页 末页
家园 【求助】解释一下

我的程序流程是这样的。

首先定义了一个方程用Monte Carlo方法求解圆周率。

单线程计算两次圆周率所花的时间是97s。然后两线程分别计算一次圆周率时间是392s。计算圆周率的程序是独立的。

是四核心cpu intel i7920

可以看到两线程的cpu使用比一线程高2倍,但是时间却要多花很多。

线程方程是 createthread.

家园 检查了一下

按照您的建议检查了一下,因为这里独立计算圆周率的任务,而且运算很密集,是不是这符合您的(适合多线程)的条件呢。

家园

好。我去参考一下这本书

家园 你改一下程序试试

先用random_number(x)生成两个随机数组,然后用数组里的元素进行计算,而不是在线程循环里调用随机数生成器。看看效果如何。

另外,编译的时候用的优化等级是O2还是O3?

家园 感谢感谢

明白了!!真牛人啊!!!

家园 修改

去掉了random_number, 多线程改善了一些,但还是比单线程要慢。

编译的时候用的优化等级是o3

修改
家园 去掉了random_numbe啥意思

把子程序改成简单累加程序,看看基本效果?

我没在windows下编过并行计算程序。

家园 是的

我把子程序改成了累加程序

是的
家园 在子程序里加一个读取CPU的ID的函数

如果有变化就打印出来,我怀疑线程没有和CPU绑定,在来回跳,曾经听说过类似情况。

另外,多线程程序对于计算密集型且规模较大的不适用,应采用多进程程序。

家园 你能否比较一下

只用1个线程和直接在主程序里计算一次之间的时间差别?

家园 具体问题具体分析吧

从圆周率计算来说,肯定是典型的运算密集型的应用。

而且如果你确认两条线程分别独立的运算圆周率,那么应该还是符合我所说的:

一个运算密集型任务,并且该任务可以切分为多个互不干扰的子任务

如果这个时候在多核或多CPU架构下还是有较大的损耗,那么可以考虑检查一下是否是因为操作系统的调度原因而使得同一条线程被不断的调度到多个不同的CPU核心上。操作系统应该会提供某些方法,使某条线程或者进程的运算任务只被在某个CPU核心上调度,这样可以大大减少不必要的上下文切换的开销。至少主流的操作系统如unix/linux/windows,应该都有这个功能的。

如果要寻找相关的资料,我觉得你可以关注一下并行运算方面的内容。虽然我没有用过Fortran,但是作为据说是非常专业的数学和科学运算的编程语言,Fortran应该会提供并行运算相关的解决方案或者基本模型的。我觉得一来你可以参考他们的方案或者依循他们的模型来改造你的程序,二来也可以学习他们的技巧和技术,应用到你的程序中。毕竟在这些领域,还是有不少巨人可以提供宽厚高大的肩膀让我们站上去的。

呵呵。

家园 正好不符合
家园 多线程的问题

当年pentium4的多线程对科学计算的影响就是负的,现在i7估计还是这样。我们一般都用mpi或pvm,一般科学计算不用thread,可以bios里把多线程关了看看结果。我知道以前志强等做cluster时都是在bios里把多线程关了。

家园 FORTAN 不懂。两个thread 里面有没使用需要

同步的库函数,可能一些库函数,在实现时,会共享变量,而这些变量需要线程同步。还有多线程,不等于多CPU。跟你的系统有关.

家园 多线程是否提高效率,取决于你的应用

如果你想用多线程来提高效率,那么就是提高CPU Utilization。如果你有两种task,一种是CPU Intensive,一种是IO intensive,那么用multithreading就可以极大地提高效率,因为在IO Intensive的task等待的时候,系统就可以执行CPU Intensive的task。

你现在两个thread都是CPU Intensive的,如果用单核处理器就没有必要用多线程,因为thread之间context switch的开销完全没有必要了。

如果用多核处理器,很可能操作系统是不是把这两个thread分配到一个CPU上去了(你的操作系统应该不仅仅有这两个thread在运行)。这东西你没法精确控制,只能托付给底层操作系统。当然,这验证了Vista果然弱智。

试试看用Java重写你的程序,看看JVM会不会聪明一点。

全看树展主题 · 分页首页 上页
/ 4
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河