CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    OpenFOAM多个并行算例同时运行导致计算效率下降

    OpenFOAM
    6
    25
    5344
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 史
      史浩 讲师 最后由 编辑

      在实验室服务器上(共28个CPU)同时在五个终端下运行五个算例,每个算例都是2核并行,其计算的过程是一样的,只是其中的某一个参数稍微有改动,对整个物理过程没有质的影响。结果发现计算效率大大下降,计算速度大约为单个算例单独运行速度的1/5-1/3。从log文件来看,计算过程没有问题,就是每步用的时间变多了。有没有人遇到和我相同的情况?有好的解决办法没?

      让我们随波逐流

      bestucan W 2 条回复 最后回复 回复 引用
      • bestucan
        bestucan 版主 副教授 @史浩 最后由 编辑

        @史浩 核能同时计算,读写不能同时进行,得排队互相切换。何况还是文本文件。改成二进制的应该会快一些。一起读写,互相切任务也够耗时的。就像复制东西;一次选中所有文件复制,比每个文件都执行复制粘贴同时复制,要快得多。

        这种读写占比比较高的操作,适合写个脚本自动顺序运行。

        滚来滚去……~(~o ̄▽ ̄)~o 滚来滚去都不能让大家看出来我不是老师么 O_o

        异步沟通方式(《posting style》from wiki)(下载后打开):
        https://www.jianguoyun.com/p/Dc52X2sQsLv2BRiqnKYD
        提问的智慧(github在gitee的镜像):
        https://gitee.com/bestucan/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md

        1 条回复 最后回复 回复 引用
        • 李东岳
          李东岳 管理员 最后由 编辑

          确实会有这种情况出现,我也遇到过,适合写个脚本自动顺序运行应该是解决方式。

          线上CFD课程开始报名:http://www.dyfluid.com/class.html

          CFD高性能服务器 http://dyfluid.com/servers.html

          史 1 条回复 最后回复 回复 引用
          • W
            wwzhao 教授 @史浩 最后由 编辑

            @史浩 你用的是什么mpi?mpirun的参数是怎么给的?

            1 条回复 最后回复 回复 引用
            • 史
              史浩 讲师 @李东岳 最后由 编辑

              @bestucan @东岳 多谢两位。其实我的结果文件写的频率不高,每10000步才写一次,更多的是写log文件。目前程序每秒能算10个时间步,每个时间步大约要写20行的log文件,每秒大约就要写200行的文本文件。
              但是今天试了一下串行,发现串行就没有问题,看来不是写log文件的问题。可能是并行的其他问题

              让我们随波逐流

              1 条回复 最后回复 回复 引用
              • C
                cccrrryyy 教授 最后由 编辑

                尽量不要这样做吧,这样做很慢的,一个一个来就好了。每个算例都用多个核并行,那是让计算机去判断某个时间点核A该做什么,核B该做什么,核C该做什么,这不靠谱。它是绝对不会自己从一开始就定好了,比如任务1就让核A和B去算,任务2就让核C和D去算,除非你设置了。我倒是挺好奇有没有人知道怎么设置让电脑这样做,就是按照我的要求,任务1用AB算,任务2用CD算,总感觉应该有方法的吧?

                I don't want to survive, I want to thrive.

                W 1 条回复 最后回复 回复 引用
                • W
                  wwzhao 教授 @cccrrryyy 最后由 编辑

                  @cccrrryyy 如果是openmpi,试试--bind-to-core

                  史 C 2 条回复 最后回复 回复 引用
                  • 史
                    史浩 讲师 @wwzhao 最后由 编辑

                    @wwzhao 刚刚看到,我用脚本运行的,脚本命令是

                    runParallel $(application)
                    

                    换成代码,应该是

                    mpirun -np 2 <applicationName> -parallel
                    

                    @cccrrryyy 我觉得可能是你说的这种情况。因为项目比较偏工程应用,需要讨论不同工艺参数对结果的影响,有的时候一个一个算太慢,起算这样效率高一些。另外,我也很想知道如何指定并行的cpu,如果有知情人路过请留言,在此谢过:xiexie:

                    让我们随波逐流

                    W 1 条回复 最后回复 回复 引用
                    • W
                      wwzhao 教授 @史浩 最后由 编辑

                      @史浩 可以试试mpirun的--bind-to-core参数

                      史 1 条回复 最后回复 回复 引用
                      • C
                        cccrrryyy 教授 @wwzhao 最后由 编辑

                        @wwzhao 还有这种操作,学习了学习了,这几天试试!

                        I don't want to survive, I want to thrive.

                        1 条回复 最后回复 回复 引用
                        • 史
                          史浩 讲师 @wwzhao 最后由 编辑

                          @wwzhao 请问怎么用-bind-to-core来分配并行计算核心?我运行了下面的命令

                          mpirun -np 4 xxxFoam -parallel --bind-to-core
                          

                          系统提示错误

                          invalid option: --bind-to-core
                          

                          这么命令该怎么用?

                          让我们随波逐流

                          W 1 条回复 最后回复 回复 引用
                          • W
                            wwzhao 教授 @史浩 最后由 编辑

                            @史浩 mpirun --version 查看版本,openmpi 1.4 以上才支持这个参数,参考 https://www.open-mpi.org/faq/?category=tuning#using-paffinity-v1.4

                            史 1 条回复 最后回复 回复 引用
                            • 史
                              史浩 讲师 @wwzhao 最后由 编辑

                              @wwzhao OpenFOAM里面自带的是1.10.4版本,可以在help中有这个选项,我就试了一下。电脑有52个节点,我想挂满,所以想捯饬一下,让并行的时候不要重复分配计算核心

                              让我们随波逐流

                              W 1 条回复 最后回复 回复 引用
                              • W
                                wwzhao 教授 @史浩 最后由 编辑

                                @史浩 把 --bind-to-core 放到 -np 前面:

                                mpirun --bind-to-core -np 4 xxxFoam -parallel
                                
                                史 1 条回复 最后回复 回复 引用
                                • 史
                                  史浩 讲师 @wwzhao 最后由 编辑

                                  @wwzhao 可以了,流弊~(说脏话会不会被禁言?害怕~~~)还有一个问题,我怎么通过查看计算的时候占用了哪些核心?

                                  让我们随波逐流

                                  W 1 条回复 最后回复 回复 引用
                                  • W
                                    wwzhao 教授 @史浩 最后由 编辑

                                    @史浩 在终端里输入top,然后按 1 就可以查看 CPU 核心使用情况。

                                    史 1 条回复 最后回复 回复 引用
                                    • 史
                                      史浩 讲师 @wwzhao 最后由 编辑

                                      @wwzhao 用了一下这个命令,但是每个算例并没有重新分布在不同的计算核心上,而是集中在了4个计算核心上,然后计算效率非常的低。好像不是这个命令

                                      让我们随波逐流

                                      W 1 条回复 最后回复 回复 引用
                                      • W
                                        wwzhao 教授 @史浩 最后由 编辑

                                        @史浩 你的机器是不是只有4个core。。。

                                        史 1 条回复 最后回复 回复 引用
                                        • 史
                                          史浩 讲师 @wwzhao 最后由 编辑

                                          @wwzhao 不是,有52个

                                          让我们随波逐流

                                          1 条回复 最后回复 回复 引用
                                          • S
                                            Sloan 最后由 编辑

                                            @史浩 @wwzhao @cccrrryyy 问个小问题,我的笔记本8 cores,跑并行计算的话,是不是用够8个了就不能再用了,比如只能跑4个算例每个用2个core?但是不指定并行计算的话,是不是跑的算例就能超过8个, 只不过速度会慢。谢谢!

                                            C 史 2 条回复 最后回复 回复 引用
                                            • C
                                              cccrrryyy 教授 @Sloan 最后由 编辑

                                              @Sloan 一般不建议同时进行多个并行计算的算例,这样会很拖速度。有8个核就一次用8个跑一个,再接着跑下一个,这样速度实际上是快的。不知道有没有方法可以指定让某几个核去跑一个算例另外几个核去跑另外一个算例,有哪位知道可以传授传授~

                                              指定或者不指定并行计算原则上对能同时算多少个算例应该没有区别,指定并行计算可能也能8个核但是跑10个2个核的算例,但那样会非常非常非常慢的,慢到真的要怀疑人生。:zoule:

                                              I don't want to survive, I want to thrive.

                                              S 1 条回复 最后回复 回复 引用
                                              • S
                                                Sloan @cccrrryyy 最后由 编辑

                                                @cccrrryyy 好的好的,谢谢回复!看来还是得硬件强大才行,等计算结果再调试,很是折磨:zoule:

                                                1 条回复 最后回复 回复 引用
                                                • 史
                                                  史浩 讲师 @Sloan 最后由 编辑

                                                  @Sloan 如果你电脑是8个核心的话,建议用7个核心就,留一个给系统
                                                  @cccrrryyy OpenFOAM会自动选择空闲的核心进行计算,只有当核心全部占用的时候才会重复选择。要注意的是,现在的服务器和电脑一般都会用超线程技术,即一个物理核心在系统里面会被认为是两个核心。当多个算例同时运行的时候,OpenFOAM可能选择一个物理核心上的两个线程进行计算,而其余的物理核心空闲,而这样会导致计算效率的下降。为了提高计算效率,建议关闭超线程。OpenFOAM中可以指定核心,这个在mpirun的命令参数里可以指定,我见过这些命令,但是没系统的用过

                                                  让我们随波逐流

                                                  C S 2 条回复 最后回复 回复 引用
                                                  • C
                                                    cccrrryyy 教授 @史浩 最后由 编辑

                                                    @史浩 线程那东西说实话我一直搞不懂,但是我自己试过,超线程确实会拖速度。原来是mpirun里面指定,学习了!

                                                    I don't want to survive, I want to thrive.

                                                    1 条回复 最后回复 回复 引用
                                                    • S
                                                      Sloan @史浩 最后由 编辑

                                                      @史浩 嗯嗯,好的,很详细了,谢谢您的回复!我看看mpi里的参数设置,琢磨下看看

                                                      1 条回复 最后回复 回复 引用
                                                      • First post
                                                        Last post