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.3k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • C 离线
    C 离线
    CFDngu
    在 中回复了 xpqiu 最后由 编辑
    #21

    @xpqiu :expressionless: 不好意思我没用过这个,请问您那里有这方面的资料吗

    1 条回复 最后回复
  • B 离线
    B 离线
    bingningmeng45
    写于 最后由 编辑
    #22

    你是在哪个超算中心跑的算例?用的是什么规格的机器

    1 条回复 最后回复
  • R 离线
    R 离线
    random_ran 大神
    写于 最后由 编辑
    #23

    @bingningmeng45

    我是在 Université de Sherbrooke 的长毛象2号超算上算的。这篇帖子的一楼最后我详细描述了硬件。

    我没有在专门搞CFD的组里搞CFD,机时的分配只有100-CPU年。

    Yours in CFD,

    Ran

    B 赵 C 4 条回复 最后回复
  • B 离线
    B 离线
    bingningmeng45
    在 中回复了 random_ran 最后由 编辑
    #24

    @random_ran 在超算上安装哪个版本的openfoam?是自己安装的么?我现在跑算例要在超算上计算,现在还处在调研阶段,对超算的情况不是很了解。希望你能多给我一些建议

    1 条回复 最后回复
  • B 离线
    B 离线
    bingningmeng45
    在 中回复了 random_ran 最后由 编辑
    #25

    @random_ran renumberMesh这个命令你用过么?(我看贴上有人用过)用过的话你跑的是什么算例模型,计算效率提高了多少,计算结果准确么?我的算例也是圆柱绕流湍流模型验证 是否可用这个命令?

    1 条回复 最后回复
  • 赵 离线
    赵 离线
    赵一铭
    在 中回复了 random_ran 最后由 编辑
    #26

    @random_ran
    顶长毛象
    替代文字

    @bingningmeng45
    renumberMesh看你需求吧,锦上添花的东西,不用也可以,用了更好,莫非你并行遇到了瓶颈。

    R 1 条回复 最后回复
  • R 离线
    R 离线
    random_ran 大神
    在 中回复了 赵一铭 最后由 编辑
    #27

    @赵一铭

    哈哈,这下可好了,每次登录长毛象的时候,都会自动脑补这张图了。 :joking:

    Yours in CFD,

    Ran

    1 条回复 最后回复
  • B 离线
    B 离线
    bingningmeng45
    在 中回复了 random_ran 最后由 编辑
    #28

    @random_ran renumberMesh 这个如何操作运行?直接在终端输入吗

    R 1 条回复 最后回复
  • 程 离线
    程 离线
    程迪
    写于 最后由 编辑
    #29

    可以试试metis,可能会比scotch要好一些。

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

    1 条回复 最后回复
  • R 离线
    R 离线
    random_ran 大神
    在 中回复了 bingningmeng45 最后由 编辑
    #30

    @bingningmeng45

    建议你这样做:

    cd $FOAM_TUTORIALS 
    grep -rnw './' -e "renumberMesh"
    

    然后

    emacs ./incompressible/pisoFoam/les/motorBike/motorBike/Allrun
    

    就会发现你想要的东西了。

    我的OpenFOAM版本是v4.1。
    操作系统是CentOS Linux release 7.3.1611 (Core)。

    祝好。

    Yours in CFD,

    Ran

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 李东岳 编辑
    #31

    最近看了看这个renumberMesh,觉得可能有一些更深入的算法在里面,看完之后,个人觉得不必深究了,就类似OpenFOAM中的mpi库一样,除非你专门做mpi的。大体思路就是楼上们说的减少带宽。比如在求解100阶矩阵的时候,现存带宽可能为30,在进行迭代预处理的时候,可能会产生填入操作,但是依然位于带宽之内。renumberMesh或者在计算图形学中的reordering可以通过将矩阵和Adjacency matrix(不知道中文是什么)联系起来,重新排序,减少带宽,降低存储。在大型计算中,可以降低内存存储,大体就是这个意思。renumberMesh中植入的是Cuthill–McKee algorithm,详细了解可google。个人觉得有点偏离CFD,了解了解就好。

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

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

    @李东岳

    1. ilu0没有填入,of玩的ldu全是用的不填入的算法,不然ldu数据结构包不住,得像aeroFoam那样玩更高级的数据结构,
    2. ldu矩阵renumber不降低单次迭代的flops数量!那么省出来的时间必须有个说法,要么谱半径更小,收敛所需迭代数减少,要么平均每个flops用时减少(cache命中率提高)。总时间=迭代数每次迭代的flops数每个flops平均用时,对吧。
    3. renumber有效性说明现代cfd程序更多地受限于储存速度,cache命中率啥的,这个东西是有瓶颈的,未来cfd程序的套路可能就得变了。
    4. 你说的半带宽那套是针对banded structure的老的数据结构了,算法和数据结构是配套的,单看算法不看数据结构没有任何意义。

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

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 李东岳 编辑
    #33

    ilu0没有填入,of玩的ldu全是用的不填入的算法
    你说的半带宽那套是针对banded structure的老的数据结构了

    在另一个帖子我也看到你说的LDU,这只是OpenFOAM存储矩阵的方式,没有任何算法的存在意义,OpenFOAM编程可以酸则LDU,也可以选择Coordinate list (COO),也可以选择List of lists (LIL)。ILU0是ILU0算法,LDU是OpenFOAM的存储矩阵的方式。我觉得你弄混了。

    另外,矩阵存在带宽是客观存在的,不管你怎么存储。是LDU还是LIL。

    矩阵存储和带宽是两个概念:https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_.28CSR.2C_CRS_or_Yale_format.29

    对ILU矩阵进行reordering是另一个概念:
    Saad, Yousef. Iterative methods for sparse linear systems. Society for Industrial and Applied Mathematics, 2003.

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

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

    @李东岳

    对ILU矩阵进行reordering是另一个概念:

    你弄混了,从来没有ILU矩阵,是ldu矩阵吧。

    COO/LIL都是sparse matrix的储存格式之一,但是不同储存格式做matrix product或者其他矩阵操作时效率是不一样的,比如CSR和CSC一个做M*x效率高,另一个做transpose(M)*x效率更高。这就是我说的具体数据结构和算法是相关的,一个操作在COO和LDU上的时间复杂度是不一样的。但是很容看出来,ldu矩阵下,很多操作的浮点操作数flops(差不多就是时间复杂度)不随reordering变化。

    同时OF默认实现的只有LDU矩阵,没有coo/lil格式的,除了一些GPU扩展。所以OF没法直接调用petsc,也没有依赖别的线性代数软件包,blas,lapack之类的一个没用上,代码也很臃肿。

    ILU0是fill in=0的ILU算法,可以基于任何矩阵实现,但是对于sparse matrix来说,fill in为0意味着前后indexing的部分可以不用动,只要把data部分改了就行,甚至指向另一个data_ilu就可以了。OF LDU matrix相当于所有OF里的矩阵的indexing部分都是一样,你能改变的只有data_ptr,所以OF只能玩ilu0,玩ilu1都不行。虽然OF的ldu是很紧凑高效的矩阵内存结构,但是还是有局限性的。

    我关注的问题是为什么矩阵减小带宽会带来加速?用半带宽解释我觉得潜在假设就是:同样的矩阵内容,半带宽小==矩阵操作快。但是操作数不变的情况下操作加快了,就是cache的问题了。

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

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 李东岳 编辑
    #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 条回复 最后回复

  • 登录

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