西西河

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

共:💬51 🌺45
分页树展主题 · 全看首页 上页
/ 4
下页 末页
    • 家园 两个线程计算会慢一点,但不应该慢这么多

      Fortran我都忘光了,你得程序有点看不懂,怀疑是编译问题,你看看是否用了正确的编译模式,以及链接库是否用的是多线程的库。

      很多数学函数本身很可能不能够多线程操作的,比如random_number,每次产生的数与前面的数相关,这样的话多个线程并发会导致频繁的自旋锁操作,可能是慢的原因之一。

    • 家园 多线程并不是永远有意义的

      一般多线程运用的场景是:

      存在一个或几个运算密集型任务,多个IO密集型任务;

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

      所以你应该看看你的子任务中,是否存在任务竞争或者等待或者交叉使用某资源等情况。如果存在的话,多线程的效果不会很好。

      另外,如果确定没有上述情况,可以尝试多进程模型,让每个进程绑定在一个CPU上运行(操作系统应该会提供这类的API),看看效果有没有改善?不过我不知道Fortran能不能做到这点,因为这似乎要直接调用操作系统的API,而这些API,一般都是C的接口。

      • 家园 检查了一下

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

        • 家园 正好不符合
        • 家园 具体问题具体分析吧

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

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

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

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

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

          呵呵。

    • 家园 关于线程

      在单核状态下:

      线程并不是越多越好,

      线程启停以及线程上下文切换都会引起额外的开销,所以消耗的时间比单线程多。

      采用多线程方法设计程序时,如果产生的额外开销大于线程的工作任务,就没有并行的必要。

      对于多核多线程的编程,我了解不多.......

      你有必要查阅一下<<多核程序设计技术>>这本书

    • 家园 如果你所用的计算语言的编辑器使用的是绿色线程,

      那么为了通过多线程来节省总计算时间,你最好换一个用native线程来产生多线程的语言,这样就可充分利用硬件的4核处理器。。。。。

      关键词(Tags): #green#thread#native#thread
分页树展主题 · 全看首页 上页
/ 4
下页 末页


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

Copyright © cchere 西西河