Matrix MPI矩阵多重化编译错误:未声明
我编写了一个mpi矩阵多重化程序,它使用Matrix MPI矩阵多重化编译错误:未声明,matrix,mpi,Matrix,Mpi,我编写了一个mpi矩阵多重化程序,它使用scanf(“%d”和&size),指定矩阵大小,然后我定义了int-matrix[size*size],但当我编写它时,它报告说矩阵未声明。请告诉我为什么,或者我的问题是什么 根据Ed的建议,我将矩阵定义更改为if(myid==0)block,但得到了相同的错误!现在我发布我的代码,请帮我找出我犯的错误!谢谢大家! #include "mpi.h" #include <stdio.h> #include <math.h> #inc
scanf(“%d”和&size)
,指定矩阵大小,然后我定义了int-matrix[size*size]
,但当我编写它时,它报告说矩阵未声明。请告诉我为什么,或者我的问题是什么
根据Ed的建议,我将矩阵定义更改为
if(myid==0)
block,但得到了相同的错误!现在我发布我的代码,请帮我找出我犯的错误!谢谢大家!
#include "mpi.h"
#include <stdio.h>
#include <math.h>
#include <time.h>
int size;
int main(int argc, char* argv[])
{
int myid, numprocs;
int *p;
MPI_Status status;
int i,j,k;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
if(myid == 0)
{
scanf("%d", &size);
int matrix1[size*size];
int matrix2[size*size];
int matrix3[size*size];
int section = size/numprocs;
int tail = size % numprocs;
srand((unsigned)time(NULL));
for( i=0; i<size; i++)
for( j=0; j<size; j++)
{
matrix1[i*size+j]=rand()%9;
matrix3[i*size+j]= 0;
matrix2[i*size+j]=rand()%9;
}
printf("Matrix1 is: \n");
for( i=0; i<size; i++)
{
for( j=0; j<size; j++)
{
printf("%3d", matrix1[i*size+j]);
}
printf("\n");
}
printf("\n");
printf("Matrix2 is: \n");
for( i=0; i<size; i++)
{
for( j=0; j<size; j++)
{
printf("%3d", matrix2[i*size+j]);
}
printf("\n");
}
//MPI_BCAST(matrix1, size*size, MPI_INT, 0, MPI_COMM_WORLD, );
for( i=1; i<numprocs; i++)
{
MPI_Send(&size, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
MPI_Send(§ion, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
MPI_Send(&tail, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
MPI_Send(maxtrix2, size*size, MPI_INT, i, 0, MPI_COMM_WORLD);
}
j = 0;
for( i=1; i<numprocs-1; i++)
{
p = &matrix1[size*section*j++];
MPI_Send(p, size*section, MPI_INT, i, 1, MPI_COMM_WORLD);
}
p = &matrix1[size*section*j];
MPI_Send(p, size*section+size*tail, MPI_INT, numprocs-1, 1, MPI_COMM_WORLD);
p = matrix3;
for( i=1; i<numprocs-1; i++)
{
MPI_Recv(p, size*section, MPI_INT, i, 1, MPI_COMM_WORLD, &status);
p = &matrix3[size*section*i];
}
MPI_Recv(p, size*section+size*tail, MPI_INT, numprocs-1, 1, MPI_COMM_WORLD, &status);
printf("\n");
printf("Matrix3 is: \n");
for( i=0; i<size; i++)
{
for( j=0; j<size; j++)
{
printf("%2d ", matrix3[i*size+j]);
}
printf("\n");
}
}
else if (myid > 0 && myid<numprocs-1 )
{
MPI_Recv(&size, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
MPI_Recv(§ion, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
MPI_Recv(&tail, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
int matrix1[size*size];
int matrix2[size*size];
int matrix3[size*size];
MPI_Recv(matrix2, size*size, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
MPI_Recv(matrix1, size*section, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
for( i=0; i<section; i++)
for( j=0; j<size; j++)
for( k=0; k<size; k++)
{
matrix1[i*size+j] = matrix1[i*size+k]*matrix2[k*size+j];
}
MPI_Send(matrix1, size*section, MPI_INT, 0, 1, MPI_COMM_WORLD);
}
else if (myid > 0 && myid == numprocs-1)
{
MPI_Recv(&size, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
MPI_Recv(§ion, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
MPI_Recv(&tail, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
int matrix1[size*size];
int matrix2[size*size];
int matrix3[size*size];
MPI_Recv(matrix2, size*size, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
MPI_Recv(matrix1, size*section+size*tail, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
for( i=0; i<section+tail; i++)
for( j=0; j<size; j++)
for( k=0; k<size; k++)
{
matrix1[i*size+j] = matrix1[i*size+k]*matrix2[k*size+j];
}
MPI_Send(matrix1, size*section+size*tail, MPI_INT, 0, 1, MPI_COMM_WORLD);
}
return 0;
MPI_Finalize();
}
#包括“mpi.h”
#包括
#包括
#包括
整数大小;
int main(int argc,char*argv[])
{
int myid,numprocs;
int*p;
MPI_状态;
int i,j,k;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和myid);
MPI通信大小(MPI通信世界和numprocs);
如果(myid==0)
{
scanf(“%d”,大小(&S);
int matrix1[大小*大小];
int matrix2[大小*大小];
int matrix3[size*size];
int section=大小/numproc;
int tail=大小%numprocs;
srand((无符号)时间(NULL));
对于(i=0;i可能是在设置矩阵大小之前在一台机器上使用scanf(),但是如果矩阵大小存储在所有机器上,scanf()将不会在所有机器上运行
如果是这种情况,那么在开始使用MPI功能之前,您必须在主进程上扫描()矩阵的大小,然后将矩阵的大小(通过COMM_WORLD.Bcast()或其他方法)发送到每个进程,以便正确定义矩阵
当然,这只是一个猜测,因为您提供的信息太少,无法做出明智的回答,所以我将选择最可能的解释
编辑
好的,这里有一些修改将使它能够编译(其中一些可能会以任何方式完成,当您粘贴代码时,您的代码有点滑稽,还有一些可能我错过了,代码的格式也有点滑稽)
MPI\u发送(maxtrix2,size*size,MPI\u INT,i,0,MPI\u COMM\u WORLD);
应该是
MPI_发送(&matrix2,size*size,MPI_INT,i,0,MPI_COMM_WORLD);
int section=size/numprocs;
int tail=大小%numprocs;
这些需要在第一个if语句之前定义,以便它们进一步工作,因此只需在main之后直接定义它们,而无需分配它们。(否则,当其他进程尝试使用它们时,它们不存在)
很抱歉,我没有时间去理解代码并实际让它执行您想要的操作,但这至少会让您可以调试可运行的代码。编译时不知道“size”的值。因此出现了错误
如果您不熟悉编码,那么读取size的值并尝试分配它似乎是合乎逻辑的。事实上,这对于Python等解释语言来说是可行的。但是您的代码在C中。C程序需要编译才能工作。当编译器查看您的代码时,它不知道变量“size”的值是什么。在下一条语句中,您使用的是变量“size”。因此,您试图使用一个值未知的变量。这就是编译器所抱怨的
解决此问题的两种方法:
1)声明一个足够大的矩阵,比如1000 X 1000。在运行时,您可以决定要使用的大小。但给出的值不要超过源代码中硬编码的值,即1000 X 1000。您在这里所做的是告诉编译器为1000 X 1000项分配内存,但您可以使用也可以不使用整个空间。您将浪费内存,这不是一种有效的方法
2) 使用动态分配。但是,考虑到这个问题的性质,目前这对您来说可能太高级了。我们可以获得更多的代码/解释吗?是的,在您的问题中没有足够的内容。根据Ed的建议,我将矩阵定义更改为if(rand==1)block,但我还是犯了同样的错误!现在,我发布了我的代码,请帮我找出我的错误所在!#include“mpi.h”#include#include#include int size;int main(int argc,char*argv[])谢谢!你的回答启发了我!我尝试了,但错误仍然存在!所以我发布了我的代码,希望你能帮我调试它!
MPI_Send(maxtrix2, size*size, MPI_INT, i, 0, MPI_COMM_WORLD);
MPI_Send(&matrix2, size*size, MPI_INT, i, 0, MPI_COMM_WORLD);
int section = size/numprocs;
int tail = size % numprocs;