作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试运行下面使用并行编程的程序。如果我们使用 4 个处理器,我希望它们包含总和 1+2=3、3+4=7、11 和 15。所以我希望求和 vector 按顺序包含 3、7、11 和 15。但是,由于 MPI_Send 的处理器以随机顺序发送,所以我没有求和 vector 来包含 7、15、3、11。我如何修改下面的代码以确保这一点?
#include<iostream>
#include<mpi.h>
using namespace std;
int main(int argc, char *argv[]){
int mynode, totalnodes;
int sum,startval,endval,accum;
MPI_Status status;
int master=3;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &totalnodes); // get totalnodes
MPI_Comm_rank(MPI_COMM_WORLD, &mynode); // get mynode
sum = 0; // zero sum for accumulation
vector <int> sumvector;
startval = 8*mynode/totalnodes+1;
endval = 8*(mynode+1)/totalnodes;
for(int i=startval;i<=endval;i=i+1)
sum=sum+i;
sumvector.push_back(sum);
if(mynode!=master)
{
MPI_Send(&sum,1,MPI_INT,master,1,MPI_COMM_WORLD); //#9, p.92
}
else
{
for(int j=0;j<totalnodes;j=j+1){
if (j!=master)
{
MPI_Recv(&accum,1,MPI_INT,j,1,MPI_COMM_WORLD, &status);
printf("processor %d received from %d\n",mynode, j);
sum = sum + accum;
}
}
}
使用多线程而不是 MPI 是否更好?
最佳答案
我不确定你想做什么,但你当前的代码(不打印从哪个级别收到的数字)等同于以下代码:
for(int i=startval;i<=endval;i=i+1)
sum=sum+i;
sumvector.push_back(sum);
MPI_Reduce(mynode == master ? MPI_IN_PLACE : &sum, &sum, 1, MPI_INT,
master, MPI_COMM_WORLD);
你要找的是这个(结果仅由大师级收集):
for(int i=startval;i<=endval;i=i+1)
sum=sum+i;
sumvector.resize(totalnodes);
MPI_Gather(&sum, 1, MPI_INT, &sumvector[0], 1, MPI_INT,
master, MPI_COMM_WORLD);
或这个(结果收集到所有等级):
for(int i=startval;i<=endval;i=i+1)
sum=sum+i;
sumvector.resize(totalnodes);
MPI_Allgather(&sum, 1, MPI_INT, &sumvector[0], 1, MPI_INT, MPI_COMM_WORLD);
另外,下面的说法是完全错误的:
HOwever, since MPI_Send has the processors sending in random order, I don't sumvector to contain, say, 7, 15, 3, 11.
MPI 点对点通信需要两件事才能成功:必须有一个发送者执行MPI_Send
和一个接收器 执行匹配的 MPI_Recv
。消息接收顺序可以通过简单地在循环中调用 MPI_Recv
来强制执行,并增加源级别,就像您在代码中显示的那样。
关于c++ - 如何让 MPI_Send 让处理器按顺序发送而不是随机发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29637654/
我是一名优秀的程序员,十分优秀!