C MPI:散射后的值已损坏
我只想用进程0创建一个带有随机值的矩阵。 创建之后,我将这些值分散到不同的进程中。 我有一个问题,我收到了损坏的值,比如 1980714952 32716 -672521120 -672521856 21858 -310078720 21858 0 0 如何分散进程0创建的矩阵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
#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小时前我还发布了另一个问题,这个问题与我必须理解的练习更相关:。除了一些评论外,另一个问题仍然没有答案。