Я хочу, чтобы сумма вектор целого с использованием MPI.Сумма вектор целого с использованием MPI c
Предположим, что у меня есть вектор a с 20 элементами и вектор b с 20 элементами, и я хочу их суммировать в векторе 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
Примечание стороны: Вы считали использование функций разброса и сбора? – Shahbaz
№ У меня нет, на самом деле я новичок в MPI. Дело в том, что связь работает, но значения, переданные между ними, не совсем корректны. Иногда в позиции 0 отображается такое значение, как 1038193891829 – Philip
Я не просмотрел ваш код, но, скорее всего, вы указали неверные индексы. Двойной проверить их! Во всяком случае, разброс и сбор будут экономить вам цикл за каждый и ручной расчет индексов. – Shahbaz