C MPI:散射后的值已损坏

C MPI:散射后的值已损坏,c,matrix,mpi,C,Matrix,Mpi,我只想用进程0创建一个带有随机值的矩阵。 创建之后,我将这些值分散到不同的进程中。 我有一个问题,我收到了损坏的值,比如 1980714952 32716 -672521120 -672521856 21858 -310078720 21858 0 0 如何分散进程0创建的矩阵 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <mpi.h> #define N 3

我只想用进程0创建一个带有随机值的矩阵。 创建之后,我将这些值分散到不同的进程中。 我有一个问题,我收到了损坏的值,比如

1980714952

32716

-672521120

-672521856

21858

-310078720

21858

0

0

如何分散进程0创建的矩阵

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mpi.h>

#define N 3

int main(int argc, char** argv)
{
    
    int rank;
    int size;
    
    int aa[N];
    int a[N][N];
    
    MPI_Init (&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    
    if (rank = 0)
    {
        srand(time(0));
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {

                    a[i][j] = (rand() % 5);
            }
        }
        

    }
    
    MPI_Scatter(a, N*N/size, MPI_INT, aa, N*N/size, MPI_INT,0,MPI_COMM_WORLD);

    for (int x = 0; x < N; x++)
    {

            printf("%d\n", aa[x]);  
    }
        
        
    

    MPI_Finalize();


}


float maxValue(float* array, int _size)
{
    float v = 0.0;
    
    for (int i = 0; i < _size; i++)
    {
        if (array[i] >= v)
        {
            v = array[i];
        }   
    }
    
    return v;
} 
#包括
#包括
#包括
#包括
#定义n3
int main(int argc,字符**argv)
{
整数秩;
整数大小;
int aa[N];
INTA[N][N];
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
如果(秩=0)
{
srand(时间(0));
对于(int i=0;i=v)
{
v=数组[i];
}   
}
返回v;
} 

这是因为
N*N/size
的定义。您将
N
定义为
3
,如果进程数超过
3
,则假设进程数为
4
,则
N*N/Size
将为
9/4
,因此该值将为
2
。因此,
2
元素只会被
rank 0
分散到所有进程中。因此,最后,所有进程都将打印
N
(此处为
3
)值,但
2
值仅从秩
0
接收,第三个值将是垃圾值。类似地,对于大于
N
的其他进程数,也会发生这种行为

您可以通过
a[i][j]=(rand()%5)来测试这一点将其更改为
a[i][j]=i并以进程数3开始。它将按预期工作。如果增加进程的大小,可以看到垃圾值将与输出一起打印

另外,
if(秩=0)
应该是if
(秩=0)

回答评论中的问题:

要将
N
(x,y)
值发送到
p
进程,更改将被删除

    #define N 9 // this value must be divisible by P number of processes, because scatter is used for distributing uniform size. for 9 processes, the N can be any multiple of 9
    int aa[2*N/size]; // the receiving process only needs N/size * 2 values
    int a[N][2]; // since 2 values for each N
    MPI_Scatter(a, N*2/size, MPI_INT, aa, N*2/size, MPI_INT,0,MPI_COMM_WORLD);
    for (int x = 0; x < N*2/size; x++) // each processes print its local values
      {
        printf("rank %d, %d\n", rank,aa[x]);
      }
#define N 9//此值必须可被进程数P整除,因为散布用于分布均匀大小。对于9个进程,N可以是9的任意倍数
int aa[2*N/尺寸];//接收过程只需要N/size*2个值
int a[N][2];//因为每个N有2个值
MPI_散布(a,N*2/大小,MPI_INT,aa,N*2/大小,MPI_INT,0,MPI_通信世界);
for(int x=0;x

简言之:为了使用
scatter
p
进程之间平均分配一对
N
(x,y)值,
N
应该可以被
p
整除。否则,您必须使用scatterv

您是否保证
N*N/size如何保证N*N/size如果我删除秩0的If条件,值似乎是可以的。如果我要将xy值分布到所有9个进程,必须选择哪个大小?因此,如果您要在p个进程中分布N个(x,y)值中的N个,我要做的是,首先我将定义N(例如:18),然后我用int a[N][2]声明数组(我使用2是因为我想成对地分布它(x,y)),在我定义数组值的循环中,在第二个循环中我将使用条件jThank you,j23。我还尝试了MPI散射和聚集。我必须找到一个更好的方法来分散和收集3D矩阵,因为考试有一个练习。2小时前我还发布了另一个问题,这个问题与我必须理解的练习更相关:。除了一些评论外,另一个问题仍然没有答案。