打开MPI的MPI_reduce不合并数组和
我是新开MPI的。我制作了一个小程序,通过将数组分割成与进程数相等的片段来计算数组的和。我的程序中的问题是,每个进程都在计算它在数组中所占份额的正确和,但是单独计算的和并不是由MPI_reduce函数求和的。我尽了最大的努力去解决这个问题,也参考了OpenMPI手册,但是仍然有一些我可能遗漏的东西。我将非常感谢任何形式的指导。下面是我制作的程序:打开MPI的MPI_reduce不合并数组和,mpi,Mpi,我是新开MPI的。我制作了一个小程序,通过将数组分割成与进程数相等的片段来计算数组的和。我的程序中的问题是,每个进程都在计算它在数组中所占份额的正确和,但是单独计算的和并不是由MPI_reduce函数求和的。我尽了最大的努力去解决这个问题,也参考了OpenMPI手册,但是仍然有一些我可能遗漏的东西。我将非常感谢任何形式的指导。下面是我制作的程序: #include "mpi.h" #include <stdio.h> int main(int argc, char *argv[])
#include "mpi.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
int n, rank, nrofProcs, i;
int sum, ans;
// 0,1,2, 3,4,5, 6,7,8, 9
int myarr[] = {1,5,9, 2,8,3, 7,4,6, 10};
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nrofProcs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
n = 10;
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
sum = 0.0;
int remaining = n % nrofProcs;
int lower =rank*(n/nrofProcs);
int upper = (lower+(n/nrofProcs))-1;
for (i = lower; i <= upper; i++)
{
sum = sum + myarr[i];
}
if(rank==nrofProcs-1)
{
while(i<=remaining)
{
sum = sum + myarr[i];
i++;
}
}
/* (PROBLEM IS HERE, IT IS NOT COMBINING "sums") */
MPI_Reduce(&sum, &ans, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
// if (rank == 0)
printf( "rank: %d, Sum ans: %d\n", rank, sum);
/* shut down MPI */
MPI_Finalize();
return 0;
}
Output:
rank: 2, Sum ans: 17
rank: 1, Sum ans: 13
rank: 0, Sum ans: 15
输出应该是rank:0,Sum ans:55对不起,我犯了一些错误,在对程序运行并行调试后更正了这些错误。在这里,我共享代码来拆分M个进程上长度为N的数组,其中N和M可以有任何值:
/*
An MPI program split an array of length N on M processes, where N and M can have any value
*/
#include <math.h>
#include "mpi.h"
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char *argv[])
{
int n, rank, nrofProcs, i;
int sum, ans;
// 0,1,2, 3,4,5, 6,7,8, 9, 10
int myarr[] = {1,5,9, 2,8,3, 7,4,6,11,10};
vector<int> myvec (myarr, myarr + sizeof(myarr) / sizeof(int) );
n = myvec.size(); // number of items in array
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nrofProcs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
sum = 0.0;
int remaining = n % nrofProcs;
int lower =rank*(n/nrofProcs);
int upper = (lower+(n/nrofProcs))-1;
for (i = lower; i <= upper; i++)
{
sum = sum + myvec[i];
}
if(rank==nrofProcs-1)
{
int ctr=0;
while(ctr<remaining)
{
sum = sum + myvec[i];
ctr++;
i++;
}
}
/* combine everyone's calculations */
MPI_Reduce(&sum, &ans, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
if (rank == 0)
cout << "rank: " <<rank << " Sum ans: " << ans<< endl;
/* shut down MPI */
MPI_Finalize();
return 0;
}
如果这是你的问题的正确答案,你应该把它标记为“已回答”或撤回该问题。是的,这是正确答案。只要stackoverflow.com允许,我会将其标记为答案。最初是两天,但现在它表明我可以在明天之前将其标记为答案。谢谢你的关心。