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

问题描述 投票:0回答: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;                                                                                                                                                                                              
}

当我编译并运行这段代码时,四个标记部分中的哪一个将在所有工作人员之间共享以及哪些部分将被复制?另外,工人会在哪一行产生?

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

c++ parallel-processing mpi message-passing
1个回答
0
投票

你的想法是错误的。 MPI 使用进程,因此无需生成工作线程:如果您运行 20 路并行,则会启动 20 个进程,并且它们都会从第一行到最后一行执行整个程序。

另外:“我想授予所有工作人员对此结构的读取权限”这是不可能的。因为它们是进程,所以“工人”只能拥有数据结构的完整副本。但是没有您“授予访问权限”的共享内存。

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

© www.soinside.com 2019 - 2024. All rights reserved.