MPI:散射后的值已损坏
MPI: Values after scattering are corrupted
我只想用进程 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;
}
这是因为 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 (rank = 0)
应该是 (rank == 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]);
}
简而言之:为了在使用 scatter
的 P
进程中平均分配一对 N
(x,y) 值,N
应该被 [= 整除32=]。否则你必须使用 scatterv
我只想用进程 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;
}
这是因为 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 (rank = 0)
应该是 (rank == 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]);
}
简而言之:为了在使用 scatter
的 P
进程中平均分配一对 N
(x,y) 值,N
应该被 [= 整除32=]。否则你必须使用 scatterv