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;
}
我附上了我在大型代码中遇到的错误的最小重现示例。假设我有 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;
}