0

我编写了一个 mpi 矩阵乘法程序,它使用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(&section, 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(&section, 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(&section, 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();     

}              
4

2 回答 2

1

在设置矩阵的大小之前,您可能在一台机器上使用了 scanf(),但是如果矩阵的大小存储在所有机器上,则 scanf() 将不会在所有机器上运行。

如果是这种情况,在开始使用 MPI 功能之前,您必须在主进程上 scanf() 矩阵的大小,然后发送矩阵的大小(通过 COMM_WORLD.Bcast() 或其他方法)到每个过程,以便正确定义矩阵。

当然,这只是一个猜测,因为您提供的信息太少,无法做出明智的回答,所以我将寻求最可能的解释。

编辑

好的,这里有一些可以编译的更改(其中一些可能无论如何都完成了,当你粘贴它时你的代码有点有趣,可能还有其他我错过了,代码再次格式化有点有趣)

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;
这些需要在第一个 if 语句之前定义,以便它们进一步工作,因此只需在 main 之后直接定义它们而不分配它们。(否则当您的其他进程尝试使用它们时它们不存在)

抱歉,我没有时间弄清楚代码并真正让它做你想做的事,但这至少应该让你可以调试可运行的代码。

于 2009-04-14T14:07:18.407 回答
0

“size”的值在编译时是未知的。因此错误。

如果您不熟悉编码,您正在读取大小的值并尝试分配它,这似乎是合乎逻辑的。事实上,这适用于 Python 等解释型语言。但是您的代码是在 C 中的。C 程序需要编译才能工作。当编译器查看您的代码时,它不知道变量“size”的值是什么。在下一条语句中,您使用的是变量“size”。因此,您正在尝试使用其值未知的变量。这就是编译器所抱怨的。

解决此问题的两种方法: 1) 声明一个足够大的矩阵,例如 1000 X 1000。在运行时,您决定要使用多少大小。但是不要给出比你在源代码中硬编码的值更多的值,即 1000 X 1000。你在这里所做的是告诉编译器为 1000 X 1000 项分配内存,但你可能会也可能不会使用整个空间。您将浪费内存,这不是一种有效的方法。

2)使用动态分配。但是,鉴于这个问题的性质,目前这对您来说可能太高级了。

于 2011-03-03T23:16:55.457 回答