C 未声明的MPI数组
我附加了一个最小的复制错误的例子,我在一个大的代码面临。假设我有两个进程,P0和P1。我在P0中声明一个数组C 未声明的MPI数组,c,parallel-processing,mpi,hpc,C,Parallel Processing,Mpi,Hpc,我附加了一个最小的复制错误的例子,我在一个大的代码面临。假设我有两个进程,P0和P1。我在P0中声明一个数组int-arr[2],并在arr[0]中存储一个值。然后,我仅为P1重新定义int-arr[2],但每当我试图在P1内部访问它时,我会得到'arr'未声明(首次在此函数中使用)37 | arr[1]=1错误。我在这里附上代码 #include <string.h> #include <stdio.h> #include <stdlib.h> #inclu
int-arr[2]
,并在arr[0]
中存储一个值。然后,我仅为P1重新定义int-arr[2]
,但每当我试图在P1内部访问它时,我会得到'arr'未声明(首次在此函数中使用)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;
}
但这次我犯了这个错误
未声明的“arr”(首次在此函数中使用)
47 | MPI_Recv(arr[0],1,MPI_INT,1/src/,100/tag/,MPI_COMM_WORLD和status[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
分支的另一个进程的代码放在另一个分支中,即:
#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;
}
#包括
#包括
#包括
#包括“mpi.h”
int main(int argc,char*argv[])
{
MPI_Init(&argc,&argv);
int myrank,size;//size将考虑进程的数量
双倍时间、时间、时间、最大时间;
MPI_状态[2];
MPI_Comm_rank(MPI_Comm_WORLD和myrank);
MPI_通信大小(MPI_通信世界和大小);
int r=0,c;
如果(myrank==0)
{
int-arr[2];
arr[0]=1;
MPI_Recv(&arr[1],1,MPI_INT,1/*src*/,100/*tag*/,MPI_COMM_WORLD,&status[1]);
对于(int i=0;i
#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;
}