代码之家  ›  专栏  ›  技术社区  ›  Setu

MPI代码的哪些部分是复制的,哪些是共享的?

  •  0
  • Setu  · 技术社区  · 1 年前

    考虑以下代码:

    #include <mpi.h>
    
    // Section 1
    
    int main()
    {
            // Section 2
    
            MPI_Init(NULL, NULL);
            int world_size = -1; 
            MPI_Comm_size(MPI_COMM_WORLD, &world_size);
            int rank = -1; 
            MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    
            // Section 3
    
            MPI_Finalize();
    
            // Section 4
    
            return 0;                                                                                                                                                                                              
    }
    

    当我编译并运行这段代码时,四个标记的部分中的哪一个将在所有工作程序中共享,哪些部分将被复制?此外,工人将在哪一条线上出生?

    我想知道这一点,因为我有一个数据结构,它在多个执行中获得不同的值,我想让所有工作人员都能读取这个结构。如果这个代码的某个部分被复制,并且在那之后派生出工作者,那么我可以在该部分中声明这个结构。我知道我也可以为此使用消息传递调用,但此结构的元素是自定义类的对象,这意味着我不能使用标准的MPIAPI进行这种形式的通信。实现这一点的最佳方式是什么?

    1 回复  |  直到 1 年前
        1
  •  2
  •   Victor Eijkhout    1 年前

    你想错了。MPI使用进程,因此没有工人可以派生:如果你运行20路并行,那么20个进程就会启动,它们都会从第一行到最后一行执行整个程序。

    此外:“我想让所有员工都能阅读这个结构”这是不可能的。因为它们是流程,所以“工作者”只能拥有数据结构的完整副本。但是,没有共享内存可供您“访问”。

    事实上,编写MPI的正确方法是为每个进程提供一个唯一的数据子集。这就是为什么它被称为“分布式内存”。

    推荐文章