我想用MPI求和整数向量。
让我们假设我有一个带有20个元素的向量a和一个带有20个元素的向量b,我想在向量c中对它们求和。
等级0会将向量a和b的一部分发送到另一个等级,这将计算总和,然后返回另一个向量为等级0的向量,依此类推。
关键是,在排名(进程)之间传递的值不起作用。我应该使用指针吗?我该怎么办?
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
using namespace std;
int main(int argc, char *argv[])
{
int num;
int mpi_myrank, mpi_size, mpi_tag, mpi_from = 0;
MPI::Status mpi_status;
MPI::Init(argc, argv);
mpi_myrank = MPI::COMM_WORLD.Get_rank();
mpi_size = MPI::COMM_WORLD.Get_size();
int a[20];
int b[20];
int c[20];
int delta = 5; // seria n / size = 5
int size=4;
int *buffer;
buffer = (int*) malloc(delta*sizeof(int));
for(int i = 0 ; i<20;i++){
a[i] = i;
b[i] = i;
}
if (mpi_myrank == 0) {
mpi_tag = 100;
for(int i=1 ; i<size ; i++){
for(int j=0 ; j<delta ; j++){
buffer[j] = a[(delta*i) +j];
MPI::COMM_WORLD.Send(&buffer,delta, MPI::INT, i, mpi_tag);
}
for(int j=0 ; j<delta ; j++){
buffer[j] = b[(delta*i) +j];
MPI::COMM_WORLD.Send(&buffer,delta, MPI::INT, i, mpi_tag);
}
}
for(int j=0; j<delta;j++ ){
c[j] = a[j] + b[j];
}
for(int i=1; i<size;i++) {
MPI::COMM_WORLD.Recv(&buffer, delta, MPI::INT, i, mpi_tag, mpi_status);
for(int j=0 ; j<delta;j++){
c[(delta*i) + j] = buffer[j];
}
}
for(int i=0 ; i<20 ; i++){
cout << "posicao " << i << " igual a " << c[i] << endl;
}
}
else {
mpi_tag = 100;
//int *bufa;
//bufa = (int*) malloc(delta*sizeof(int));
//int *bufb;
//bufb = (int*) malloc(delta*sizeof(int));
int bufa[delta];
int bufb[delta];
int resp[delta];
MPI::COMM_WORLD.Recv(&bufa, delta, MPI::INT, 0, mpi_tag, mpi_status);
MPI::COMM_WORLD.Recv(&bufb, delta, MPI::INT, 0, mpi_tag, mpi_status);
for(int i=0; i<delta ;i++){
resp[delta] = bufa[i] + bufb[i];
}
MPI::COMM_WORLD.Send(&resp,delta, MPI::INT, 0, mpi_tag);
} // fim else
MPI::Finalize();
return 0;
} // fim main
答案 0 :(得分:1)
这部分代码看起来不正确
for(int i=0; i<delta ;i++){
resp[delta] = bufa[i] + bufb[i];
}
您在循环中覆盖数组的相同位置,这意味着其他位置可能具有垃圾值。