我想使用 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