Mpi 在消息传递接口中使用共享数组

Mpi 在消息传递接口中使用共享数组,mpi,Mpi,我希望在MPI程序中使用一个共享数组,这样在一个进程完成其工作后,它将把它的秩放入该数组中,并通过发送给其他进程来“更新”它,而不必等待。我尝试使用MPI_Bcast,将正在运行的进程的秩作为“root”参数(而不是0),但当我显示每个进程的数组时,它只显示本地发生的更改(发送的其他秩不在数组中) 谢谢你的帮助。键入int数组[10]不会生成共享数组。每个进程处理其自己的阵列版本MPI_Bcast()被设计为给定进程root向所有其他进程广播其数组版本的一种方式。因此,所有其他进程上阵列的初始版

我希望在MPI程序中使用一个共享数组,这样在一个进程完成其工作后,它将把它的秩放入该数组中,并通过发送给其他进程来“更新”它,而不必等待。我尝试使用MPI_Bcast,将正在运行的进程的秩作为“root”参数(而不是0),但当我显示每个进程的数组时,它只显示本地发生的更改(发送的其他秩不在数组中)


谢谢你的帮助。

键入
int数组[10]不会生成共享数组。每个进程处理其自己的阵列版本
MPI_Bcast()
被设计为给定进程
root
向所有其他进程广播其数组版本的一种方式。因此,所有其他进程上阵列的初始版本都将被擦除

MPI\u Bcast()
是一个集体操作:通信器的每个进程都必须使用相同的
根调用
MPI\u Bcast()
。计数和类型可以不同,但根用户发送的数据量必须等于所有进程接收的数据量

有两种解决问题的方法:

  • 您正在寻找的函数可能是。请参阅:
    MPI\u Allgather()
    可用于在本地进程修改后同步全局数组。全局数组不是“共享”的,因为每个进程在内存中使用不同的空间,但调用
    MPI\u Allgather()
    后,不同进程的值将相似
  • 您正在寻找一个真正的共享数组。这样的数组可以通过调用来分配。参见第407页第11.2.3段分配共享内存的窗口。特别是,如果正在使用群集的多个节点运行程序,则必须注意以下警告:

    用户有责任确保communicator comm代表一组进程,这些进程可以创建一个共享内存段,该段可由该组中的所有进程访问

    您可以找到
    MPI\u Win\u allocate\u shared()

在下面的示例中,我将假设您在第一个选项中被询问。它由mpicc main.c-o main编译,并由mpirun-np42 main运行

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{

    int  size, rank;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);    


    int* array=malloc(size*sizeof(int));
    if(array==NULL){fprintf(stderr,"malloc failed\n");exit(1);}

    //modifying the local portion of the array
    array[rank]=rank;

    //gather content from each process and broadcast it to all processes
    MPI_Allgather(&array[rank],1,MPI_INT,array,1,MPI_INT,MPI_COMM_WORLD);

    //each process has its own copy of the array, but the values are the same.
    int i,j;
    for(i=0;i<size;i++){
        if(i==rank){
            printf("rank %d got ",rank);
            for(j=0;j<size;j++){
                printf("%d ",array[j]);
            }
            printf("\n");
        }
        MPI_Barrier(MPI_COMM_WORLD);
    }

    free(array);
    MPI_Finalize();
    return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
整数大小、等级;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
int*array=malloc(size*sizeof(int));
如果(array==NULL){fprintf(stderr,“malloc失败”\n”);退出(1);}
//修改数组的本地部分
数组[秩]=秩;
//从每个进程收集内容并向所有进程广播
MPI_Allgather(&array[rank],1,MPI_INT,array,1,MPI_INT,MPI_COMM_WORLD);
//每个进程都有自己的数组副本,但值是相同的。
int i,j;

对于(i=0;i您可以放置代码吗?请不要将代码放在注释中。而是将您的问题放在注释中。谢谢!请将您的代码更新为a,以便我们可以运行和调试您的代码。缺少的内容:哪个列组执行代码片段?所有列组?其中一个列组?将有竞争条件。您正在向所有进程广播数组ses,但每个进程的数组状态不同。对于第二个进程,数组看起来像[0,1,…],第三个进程看起来像[0,0,2,…]等等。根据何时广播和接收哪个,结果是未定义的。@wak,到底有什么竞争条件?阻止MPI广播是集体的-通信器中的所有列组都必须显式参与广播,必须为根列组指定相同的值,并在s中连续进行集体调用ame序列和所有其他级别一样。嗨,弗朗西斯,非常感谢你的回复!从昨天开始,我现在对第二个选项更感兴趣,因为第一个选项是阻塞的,在我的情况下,我真的不希望它是:
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{

    int  size, rank;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);    


    int* array=malloc(size*sizeof(int));
    if(array==NULL){fprintf(stderr,"malloc failed\n");exit(1);}

    //modifying the local portion of the array
    array[rank]=rank;

    //gather content from each process and broadcast it to all processes
    MPI_Allgather(&array[rank],1,MPI_INT,array,1,MPI_INT,MPI_COMM_WORLD);

    //each process has its own copy of the array, but the values are the same.
    int i,j;
    for(i=0;i<size;i++){
        if(i==rank){
            printf("rank %d got ",rank);
            for(j=0;j<size;j++){
                printf("%d ",array[j]);
            }
            printf("\n");
        }
        MPI_Barrier(MPI_COMM_WORLD);
    }

    free(array);
    MPI_Finalize();
    return 0;
}