2013-09-15 3 views
0

Я хочу, чтобы сумма вектор целого с использованием 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 
+1

Примечание стороны: Вы считали использование функций разброса и сбора? – Shahbaz

+0

№ У меня нет, на самом деле я новичок в MPI. Дело в том, что связь работает, но значения, переданные между ними, не совсем корректны. Иногда в позиции 0 отображается такое значение, как 1038193891829 – Philip

+0

Я не просмотрел ваш код, но, скорее всего, вы указали неверные индексы. Двойной проверить их! Во всяком случае, разброс и сбор будут экономить вам цикл за каждый и ручной расчет индексов. – Shahbaz

ответ

1

Эта часть кода выглядит некорректно

for(int i=0; i<delta ;i++){ 
    resp[delta] = bufa[i] + bufb[i]; 
} 

Вы перезапись ту же позицию массива в цикле, то есть другие позиции могут иметь значения для мусора.

+0

точно .... Я нашел его вчера вечером. Это именно то, что вы сказали. Спасибо – Philip

Смежные вопросы