MPI 数组未声明

MPI Array undeclared

我附上了我在大型代码中遇到的错误的最小重现示例。假设我有 2 个进程,P0 和 P1。我在 P0 中声明了一个数组 int arr[2],并在 arr[0] 中存储了一个值。然后我仅为 P1 重新声明 int arr[2],但每当我尝试在 P1 中访问它时,我都会收到 ‘arr’ undeclared (first use in this function) 37 | arr[1]=1; 错误。我在这里附上代码。

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

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

     MPI_Init(&argc, &argv);
     int myrank, size; //size will take care of number of processes  
     double sTime, eTime, time,max_time;
     
     MPI_Comm_rank(MPI_COMM_WORLD, &myrank) ;
     MPI_Comm_size(MPI_COMM_WORLD, &size);
    
     int r=0, c;  
      
     if(myrank==0)
     {
        int arr[2];
        arr[0]=1;
     }

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

     if(myrank==1)
     {
       arr[1]=2;
       MPI_Send(&arr[1], 1 , MPI_INT, 0 /*dest*/ , 100 /*tag*/ , MPI_COMM_WORLD);
    
     }

     MPI_Status status[2];

     if(myrank==0)
     {
        MPI_Recv(&arr[1],1 , MPI_INT, 1 /*src*/ , 100 /*tag*/, MPI_COMM_WORLD,&status[1]);
    
        for(int i=0;i<2;i++)
        {
           printf(" %d",arr[i]);
        }
   }
   MPI_Finalize();
   return 0;
}


为防止出现此错误,我已尝试在

中声明 int arr[2]
if(myrank==1){
    int arr[2];
    arr[1]=2;
    
    MPI_Send(arr[1], 1 , MPI_INT, 0 /*dest*/ , 100 /*tag*/ , MPI_COMM_WORLD);
}

但是这次我得到这个错误,

‘arr’未声明(首次在本函数中使用) 47 | MPI_Recv(arr[0],1 , MPI_INT, 1 /src/ , 100 /tag/, MPI_COMM_WORLD,&状态[1]);

我不知道这里出了什么问题。任何建议都会很有帮助。

该错误是因为您在 if 语句中声明了一个变量,并且您想在该 if 语句之外使用。在 C 中这是不可能的,当你这样做时:

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

数组 int arr[2]; 将只存在于该 if 语句的范围内。因此,如果您尝试在外部访问它,则会导致编译错误。

要解决这个问题,您可以在 if 语句之外声明 int arr[2](但随后会分配所有 MPI 进程),或者在外部声明指向 int 的指针并仅分配内存对于您想要的进程的指针,即:

int *arr = NULL;
if(myrank==0)
{
    arr = malloc(sizeof(int) * 2);
    arr[0]=1;
}

当数组不再需要时不要忘记释放它:

free(arr);

另一个选项(在您的示例中有效)是重新排列代码,以便您在一个 if 分支中拥有与一个进程相关的所有代码,而在另一个 if 分支中拥有来自另一个进程的代码 if分支,即:

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

int main( int argc, char *argv[])
{
     MPI_Init(&argc, &argv);   
     int myrank, size; //size will take care of number of processes 
     double sTime, eTime, time,max_time;
     MPI_Status status[2];
     MPI_Comm_rank(MPI_COMM_WORLD, &myrank) ;
     MPI_Comm_size(MPI_COMM_WORLD, &size);
   
    int r=0, c;  
      
    if(myrank==0)
    {
       int arr[2];
       arr[0]=1;
       MPI_Recv(&arr[1],1 , MPI_INT, 1 /*src*/ , 100 /*tag*/, MPI_COMM_WORLD,&status[1]);
    
       for(int i=0;i<2;i++)
         printf(" %d",arr[i]);
    }
    if(myrank==1)
    {
       int arr[2];    
       arr[1]=2;
       MPI_Send(&arr[1], 1 , MPI_INT, 0 /*dest*/ , 100 /*tag*/ , MPI_COMM_WORLD);
    }
    
    MPI_Finalize();
    return 0;
}