c - 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
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
(Here 3
) 值,但2
值仅从 rank 接收,0
第三个将是垃圾值。同样,此行为发生在其他数量大于 的进程上N
。
您可以通过 a[i][j] = (rand() % 5);
将其更改为 a[i][j] = i;
并从进程数为 3 开始来测试它。它将按预期工作。如果您增加进程的大小,您会看到垃圾值将与输出一起打印。
也if (rank = 0)
应该是 if (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]);
}
简而言之:要在使用 的进程N
之间平均分配一对 (x,y) 值,应该可以被 整除。否则你必须使用P
scatter
N
P
scatterv
推荐阅读
- sql - 比较两个表中的两个值的最快方法
- javascript - 如何处理对 JavaScript 中不可访问/“不可见”属性的访问?
- angular - Ng2-NoUISlider 获得相同的范围值
- safari - CSS 关键帧和动画:脉冲在 Safari 上不起作用,边框半径不适用于脉冲效果
- php - 比较 dateTime 从现在到日期的格式(“2019-01-01 00:00:00.000”)
- node.js - 下载 PDF nodejs + expressjs
- java - 成功安装后 Ubuntu 18.10 上的 Omnet++ 5.4.1 运行错误
- python - 在我的 macOS Mojave 上下载 pip 包时出错
- php - 如何使用 Auth() 在 Laravel 中制作不同的注册页面
- postgresql - Jooq kotlin 枚举类型