Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 并行效率疑问

并行效率疑问

已定时 已固定 已锁定 已移动 OpenFOAM
63 帖子 17 发布者 162.8k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 李东岳 编辑
    #35

    我关注的问题是为什么矩阵减小带宽会带来加速?

    如果去看renumberMesh或者ANSYS关于reorder的描述,并没有说加快计算,只是说减少带宽和提高内存使用率。

    Renumbers the cell list in order to reduce the bandwidth, reading and renumbering all fields from all the time directories.

    Reordering the domain can improve the computational performance of the solver by rearranging the nodes, faces, and cells in memory. The Mesh/Reorder submenu contains commands for reordering the domain and zones, and also for printing the bandwidth of the present mesh partitions. The domain can be reordered to increase memory access efficiency, and the zones can be reordered for user-interface convenience. The bandwidth provides insight into the distribution of the cells in the zones and in memory.

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    程 1 条回复 最后回复
  • 程 离线
    程 离线
    程迪
    在 中回复了 李东岳 最后由 李东岳 编辑
    #36

    这个说得比较清楚。内存效率提升,但是也没说计算浮点操作数减少。

    %pylab
    
    Using matplotlib backend: Qt5Agg
    Populating the interactive namespace from numpy and matplotlib
    

    A矩阵是对角占优的矩阵

    A=array([5 ,-2 ,0 ,0 ,0,
            -2 ,5,-2,0,0,
            0 , -2, 5,-2,0,
            0,0,-2,5,-2,
            0,0,0,-2,5])
    A = A.reshape([5,5])
    A
    
    array([[ 5, -2,  0,  0,  0],
           [-2,  5, -2,  0,  0],
           [ 0, -2,  5, -2,  0],
           [ 0,  0, -2,  5, -2],
           [ 0,  0,  0, -2,  5]])
    

    P矩阵是排列矩阵,交换第一个元素和第5个元素

    P=array([0 ,0 ,0 ,0 ,1,
            0,1,0,0,0,
            0 , 0, 1,0,0,
            0,0,0,1,0,
            1,0,0,0,0])
    P = P.reshape([5,5])
    P
    
    array([[0, 0, 0, 0, 1],
           [0, 1, 0, 0, 0],
           [0, 0, 1, 0, 0],
           [0, 0, 0, 1, 0],
           [1, 0, 0, 0, 0]])
    

    排列矩阵的转置是自身的逆

    P.T.dot(P)
    
    array([[1, 0, 0, 0, 0],
           [0, 1, 0, 0, 0],
           [0, 0, 1, 0, 0],
           [0, 0, 0, 1, 0],
           [0, 0, 0, 0, 1]])
    

    作用到矩阵A上,生成矩阵B

    B=P.T.dot(A).dot(P)
    B
    
    array([[ 5,  0,  0, -2,  0],
           [ 0,  5, -2,  0, -2],
           [ 0, -2,  5, -2,  0],
           [-2,  0, -2,  5,  0],
           [ 0, -2,  0,  0,  5]])
    

    上下三角矩阵和对角矩阵

    #GS iteration
    L=tril(B,-1)
    L
    
    array([[ 0,  0,  0,  0,  0],
           [ 0,  0,  0,  0,  0],
           [ 0, -2,  0,  0,  0],
           [-2,  0, -2,  0,  0],
           [ 0, -2,  0,  0,  0]])
    
    D=diag(diag(B))
    D
    
    array([[5, 0, 0, 0, 0],
           [0, 5, 0, 0, 0],
           [0, 0, 5, 0, 0],
           [0, 0, 0, 5, 0],
           [0, 0, 0, 0, 5]])
    
    U=triu(B,1)
    U
    
    array([[ 0,  0,  0, -2,  0],
           [ 0,  0, -2,  0, -2],
           [ 0,  0,  0, -2,  0],
           [ 0,  0,  0,  0,  0],
           [ 0,  0,  0,  0,  0]])
    

    M_GS is Gauss-Seidel iter. matrix

    M_GS=inv(L+D).dot(U)
    M_GS
    
    array([[ 0.   ,  0.   ,  0.   , -0.4  ,  0.   ],
           [ 0.   ,  0.   , -0.4  ,  0.   , -0.4  ],
           [ 0.   ,  0.   , -0.16 , -0.4  , -0.16 ],
           [ 0.   ,  0.   , -0.064, -0.32 , -0.064],
           [ 0.   ,  0.   , -0.16 ,  0.   , -0.16 ]])
    

    spectral radius of GS iter.

    spectral_radius_GS=max(abs(linalg.eig(M_GS)[0]))
    spectral_radius_GS
    
    0.48000000000000026
    

    M_J is Jacobi iter. matrix

    M_J=inv(D).dot(U+L)
    M_J
    
    array([[ 0. ,  0. ,  0. , -0.4,  0. ],
           [ 0. ,  0. , -0.4,  0. , -0.4],
           [ 0. , -0.4,  0. , -0.4,  0. ],
           [-0.4,  0. , -0.4,  0. ,  0. ],
           [ 0. , -0.4,  0. ,  0. ,  0. ]])
    

    spectral radius of iter. matrix

    spectral_radius_J=max(abs(linalg.eig(M_J)[0]))
    spectral_radius_J
    
    0.69282032302755092
    

    Compare A with B

    L,D,U=tril(A,-1),diag(diag(A)),triu(A,1)
    M_GS=inv(L+D).dot(U)
    spectral_radius_GS=max(abs(linalg.eig(M_GS)[0]))
    spectral_radius_GS
    
    0.47999999999999987
    

    对比可以看出来,reorder之后迭代矩阵谱半径几乎没变化。说明加速主要来源于内存访问效率的提高。

    某种意义上来说,说明CPU没吃饱,上菜速度太慢了。以后pde模拟程序的优化方向大概应该是加快上菜速度。。。

    已婚,勿扰。
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    1 条回复 最后回复
  • F 离线
    F 离线
    Foamer24
    在 中回复了 CFDngu 最后由 编辑
    #37

    @CFDngu 您好!我也遇到了因renumberMesh而不能计算的问题,推测问题和网格有关。没有边界层时,使用renumberMesh没问题且速度会明显变快;在加密边界层至0.00001m后,使用renumberMesh就会出错,当然不使用renumberMesh,也只能单核计算,并行还是会出错。不知道您最近有没有进展,我的问题和算例文件详细描述在 http://www.cfd-china.com/topic/2548/openfoam中cyclicami周期边界在有边界层时出现问题 。

    如果可以,我还想咨询下,renumberMesh是否有设置精度的选项?或者openfoam重某个文件可以设置精度?个人推测网格尺寸变小,会在关联cyclic或cyclicAMI的周期边界时,出现截断误差导致误判?

    1 条回复 最后回复
  • Z 离线
    Z 离线
    Zephyr
    写于 最后由 编辑
    #38

    目前看下来,GAMG在网格太多了以后效率会急剧下降,而PCG方法网格数多了以后根本收敛不了,在OF自己的框架内应该是无解的。之前看到有国内国外的研究小组都成功把PETSC编译进OF了,楼主如果有一定的编程功底可以自行研究一下。

    1 条回复 最后回复
  • C 离线
    C 离线
    Calf.Z-DNS
    写于 最后由 编辑
    #39

    PCG在几百核并行的时候速度更快,但是根本收敛不了吗?GAMG在这么多核的时候效率又很慢,貌似没有最优解?

    1 条回复 最后回复
  • C 离线
    C 离线
    Calf.Z-DNS
    在 中回复了 random_ran 最后由 编辑
    #40

    @random_ran 我目前想联系国家这边的超算,请问你有了解国内的超算速度吗?哪里的会比较推荐?谢谢

    1 条回复 最后回复
  • C 离线
    C 离线
    Calf.Z-DNS
    写于 最后由 编辑
    #41

    目前了解到PCG在多核并行计算的时候效率会比GAMG更高,那这个多核有大概的一个参考数值吗?之前看到过是五百核。
    另外这二者对于计算的准确度上面有没有优劣性,PCG在网格数太多的情况下真的会收敛不了?
    最后,多核的时候用scotch会更好吗?之前在论坛上看过对于流向明确的算例,比如圆管,用simple,在流动方向上多分块,效果也还可以。
    我目前在400核并行计算7500W的网格,圆管加热流动,用scotch和simple算起来速度差不多。GAMG+DIC跟PCG+DIC的速度也差不多。

    不知有何高见,谢谢!

    李东岳李 1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    在 中回复了 Calf.Z-DNS 最后由 编辑
    #42

    @Calf-Z-DNS 我一直对稀疏线性系统感兴趣但是好像有生之年不可能用几年时间去研究他们了。哎。PBiCGStab和PBiCG的算法就在那,但是也没透彻分析过。只不过从个人实践来看我只用PBiCGStab没用过PBiCG。精度没对比过。个人觉得线性系统的精度不足以抹杀掉CFD模型和迭代的精度。你若有结果,欢迎反馈

    你后来那个做怎么样了?DNS浮力驱动刘的

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • yhdthuY 离线
    yhdthuY 离线
    yhdthu 大神
    写于 最后由 编辑
    #43

    fumiya的博客:

    https://caefn.com/openfoam/utilities-renumbermesh

    长风破浪会有时,直挂云帆济沧海

    1 条回复 最后回复
  • yhdthuY 离线
    yhdthuY 离线
    yhdthu 大神
    写于 最后由 编辑
    #44

    @random_ran 请问找到进一步提高效率的方法了么?

    长风破浪会有时,直挂云帆济沧海

    李东岳李 1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    在 中回复了 yhdthu 最后由 编辑
    #45

    @yhdthu 老铁最近玩什么呢

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    yhdthuY 1 条回复 最后回复
  • yhdthuY 离线
    yhdthuY 离线
    yhdthu 大神
    在 中回复了 李东岳 最后由 编辑
    #46

    @东岳 前辈好,最近在算les空化模拟,也卡在计算效率太低上了TAT

    长风破浪会有时,直挂云帆济沧海

    1 条回复 最后回复
  • yhdthuY 离线
    yhdthuY 离线
    yhdthu 大神
    写于 最后由 编辑
    #47

    所以最终结论是PCG+DIC效率最高是么?
    PCG+GAMG是不是稳定性好一些?

    长风破浪会有时,直挂云帆济沧海

    1 条回复 最后回复
  • 刘 离线
    刘 离线
    刘雄国
    写于 最后由 编辑
    #48

    OpenFOAM 矩阵计算效率是可以更高,这点没有疑问. 矩阵计算效率高不高 主要取决于 MPI 通信
    1000 processors 以上 不同节点上 计算 OpenFOAM 要重构

    效率高不高除了算法,计算问题类型, 代码优化等有关系

    大牛说 下一代cfd 需要 大规模计算机网格 + Algorithm + Coding 整体考虑 我觉得很有道理

    问过openfoam developer, 他的意思是 OpenFOAM is a general CFD solver. They want to solve specific problem to make money (ESI).

    1 条回复 最后回复
  • 刘 离线
    刘 离线
    刘雄国
    写于 最后由 编辑
    #49

    @刘雄国 在 并行效率疑问 中说:

    大牛说 下一代cfd 需要 大规模计算机网格 + Algorithm + Coding 整体考虑 我觉得很有道理

    我说错了, 下一代cfd 需要 大规模计算机网格 + CFD Algorithm + CFD Coding + physical网格 整体考虑

    1 条回复 最后回复
  • MicroM 离线
    MicroM 离线
    Micro
    在 中回复了 random_ran 最后由 编辑
    #50

    @random_ran 在 并行效率疑问 中说:

    以后多核计算前,我都会renumberMesh 的

    您好!请问,在进行多核计算时,我应该先decompose,再renumber,还是应该 先renumber再decompose呢?谢谢!

    浪 1 条回复 最后回复
  • 浪 离线
    浪 离线
    浪迹天大
    在 中回复了 Micro 最后由 编辑
    #51

    @Micro 网上见到的例子都是先分块,再并行地renumberMesh

    OpenFOAM 学习交流:https://openfoam.top

    MicroM 1 条回复 最后回复
  • MicroM 离线
    MicroM 离线
    Micro
    在 中回复了 浪迹天大 最后由 编辑
    #52

    @浪迹天大
    好的,谢谢您!并行renumber应该是 renumberMesh -parallel 吧
    能把您见到的例子分享下吗,谢谢!另外,您清楚为什么重排序后能够加速求解吗?感谢!

    浪 1 条回复 最后回复
  • 浪 离线
    浪 离线
    浪迹天大
    在 中回复了 Micro 最后由 编辑
    #53

    @Micro 最近正在用:mpirun -np 20 renumberMesh -parallel -overwrite。运行后会告诉你:

    After renumbering :
    Mesh size: 2687852
    Before renumbering :
        band           : 32282
        profile        : 2.13313e+10
    
        band           : 1914
        profile        : 2.13794e+09
    

    具体原理不清楚。我也没对比过。不过我相信它至少不会使结果变坏,也不会使计算变慢。

    OpenFOAM 学习交流:https://openfoam.top

    MicroM 3 条回复 最后回复
  • MicroM 离线
    MicroM 离线
    Micro
    在 中回复了 浪迹天大 最后由 编辑
    #54

    @浪迹天大 谢谢!谢谢大佬!

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]