数组接收的 MPI 和仅适用于一级
Posted
技术标签:
【中文标题】数组接收的 MPI 和仅适用于一级【英文标题】:MPI sum of array receive working for only one rank 【发布时间】:2019-02-26 14:27:02 【问题描述】:我正在尝试使用 MPI 查找长度为 100 个元素的数组的总和,在仅使用 MPI_Send 和 MPI_receive 的限制下,我编写的代码找到每个处理器的总和,但在重新发送到主处理器(rank=0)我的代码只从一个处理器接收
我的代码
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include "mpi.h"
#include "math.h"
int val = 1;
int main(int argc, char* argv[])
int my_rank;
int p;
int ierr;
int i;
int a[100];
int q=0;
for (i = 0; i <100; i++)
a[i] = i+1;
int send,recv;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
int part = 100 /(p-1);
if (my_rank == 0)
for (i = 1; i < p; i++)
send = part * (i-1);
MPI_Send(&send, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
else
MPI_Recv(&recv, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
for (i = recv; i < recv + part; i++)
val = val+a[i];
printf("%d\n", val);
MPI_Send(&val, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
if (my_rank == 0)
MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
printf("%d", val);
q = q + val;
MPI_Finalize();
if (my_rank == 0)
printf("The output is %d\n", q);
return 0;
我的输出
我哪里错了
【问题讨论】:
【参考方案1】:因为您只收到一个进程的结果。要接收所有结果,请遍历进程等级:
if (my_rank == 0)
for (rank = 1; rank < proc_cnt; rank++)
MPI_Recv(&val, 1, MPI_INT, rank, 0, MPI_COMM_WORLD, &status);
printf("value of rank %d is %d", rank, val);
q = q + val;
通常,这是一种不好的做法,可能会导致死锁。如果允许,请使用mpi_gather()
。
【讨论】:
是的,Gather 是解决这个问题的正确方法(第一部分是 Scatter)。 我读到了 scatter 和 gather,但我的教授拒绝使用这些,并说我们应该坚持使用 MPI_Send 和 MPI_Recv 我没有看到任何死锁的风险。这也是MPI_Reduce()
的教科书案例以上是关于数组接收的 MPI 和仅适用于一级的主要内容,如果未能解决你的问题,请参考以下文章
二级联动:map,for循环一级数据,调用接口获取对象数据依次放到数组里(解决由于后端java是多线程,接收到的数据放入(push)数组中有可能会顺序不对)
focus-within 适用于 Android 浏览器,但不适用于 iOS
C 语言二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )