【问题标题】:Updating an array using 2 different process using MPI使用 MPI 使用 2 个不同的进程更新数组
【发布时间】:2021-07-03 11:04:01
【问题描述】:

我正在尝试使用 2 个进程更新数组 int arr[2],其中第一个索引将由进程 1 填充,第二个索引将由进程 2 填充。我为此编写了以下代码

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

int main( int argc, char *argv[])
{
    int arr[2];
      
    
    MPI_Init(&argc, &argv);
    
    int myrank, size; //size will take care of number of processes 
    
    
    
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank) ;
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    
    if(myrank==0)
    arr[0]=1;
    
    if(myrank==1)
    arr[1]=2;
    
     MPI_Finalize();
    
    printf("%d %d\n",arr[0],arr[1]);
    
    
    return 0;
        
        
}

正如预期的那样,输出是

0 2
1 0

或者有时(当进程1首先到达打印语句时)

1 0
0 2

我的问题是,我已经在MPI_Init 之外声明了数组,并且我在MPI_Finalize() 之后打印了数组,那么为什么这两个进程都在打印?有没有办法存储输出

1 2

在数组中没有实际将数据从一个进程发送到另一个进程?

【问题讨论】:

    标签: c performance parallel-processing mpi hpc


    【解决方案1】:

    我的问题是,我已经在 MPI_Init 之外声明了数组,我是 在 MPI_Finalize() 之后打印数组,那么为什么这两个进程 正在打印吗?

    来自MPT_INIT 可以阅读:

    MPI 标准没有说明程序在 MPI_INIT 之前可以做什么 或在 MPI_FINALIZE 之后。 在 MPICH 实现中,您应该这样做 尽可能少。特别是,避免任何改变 程序的外部状态,如打开文件、读取标准 输入或写入标准输出。

    来自MPI_FINALIZE

    所有进程必须在退出前调用此例程。 数量 调用此例程后运行的进程未定义; 调用后最好不要执行超过返回 rc MPI_Finalize。

    和:

    MPI 标准要求 MPI_Finalize 只能由相同的 使用 MPI_Init 或 MPI_Init_thread 初始化 MPI 的线程。

    因此,在您的特定情况下,所有进程都分配数组并打印它。

    有没有办法将输出 1 2 存储在数组中而不 实际上将数据从一个进程发送到另一个进程?

    彼此之间没有发送消息的处理。正在发生的事情(非常非正式地)是 MPI 启动您的程序 per 进程的完整副本,还包括分配数组 int arr[2];

    如果你只想分配一个进程,让我们说rank = 0的进程然后这样做:

    ...
    if(myrank == 0){
     
       int arr[2];
    }
    

    我个人比较喜欢做如下,声明一个指针:

    int *arr = NULL;
    

    并且只在需要它的进程上分配它:

    if(myrank == 0){
      arr = malloc(sizeof(int) * 2);
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      相关资源
      最近更新 更多