【问题标题】:Using MPI to distribute the job between the processors but all the processors are doing the whole job instead of doing just some part of it使用 MPI 在处理器之间分配工作,但所有处理器都在做整个工作,而不是只做其中的一部分
【发布时间】:2014-05-23 18:04:50
【问题描述】:

我有一个可以并行运行但使用共享内存方法的 c++ 代码。我将代码链接到 PETSc 并且 PETSc 能够并行运行代码,但使用分布式内存方法。当我并行运行代码(与 PETSc 链接的 c++)时,似乎所有处理器都在重复相同的工作。例如,当处理器数量为 4 时,边界条件和初始条件被读取 4 次,或者如果我使用 printf 命令,某些内容将被打印 4 次。所以这意味着工作没有在处理器之间分配,所有处理器都在做整个工作,而不是做其中的某些部分。有没有人有同样的经历,为了解决这个问题,你有什么建议? 例如,您可以在下面看到代码读取网格两次而不是读取一次:

读取网格文件Mesh_cavity2d.txt:

读取网格文件Mesh_cavity2d.txt:

或:

【问题讨论】:

    标签: c++ parallel-processing mpi mpich petsc


    【解决方案1】:

    这种行为通常表示两种情况之一。要么您忘记将输出(和其他功能)限制为仅在一个等级中运行。最简单的方法是使用 MPI_Comm_rank 获取排名号,并将所有 I/O 和其他操作括起来

    if (rank==0)
    {
      // I/O here
    }
    

    您也可能在让您的队伍相互交流时遇到问题。我已经看到了导致这种情况的几个原因,从使用不正确的库到在 MPI 下运行非 MPI 程序。

    【讨论】:

    • 谢谢詹姆斯。那么你的意思是我必须为我拥有的所有文件定义循环吗?我的代码包含近 50 个不同的头文件和源文件,我是否必须在所有文件中定义(如果 rank =0 )?
    • 纳粹,您可以用一个包装函数替换您当前包含 if (rank == 0) 括号的打印语句。如果您的代码已格式化,以便您可以相当轻松地查找和替换现有的函数调用(cscope 可能会有所帮助),那么这并不是一项艰巨的任务。
    猜你喜欢
    • 2020-03-08
    • 2016-01-24
    • 2012-12-26
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多