使用MPI c的整数和向量

时间:2013-09-15 21:55:12

标签: c++ mpi

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

1 个答案:

答案 0 :(得分:1)

这部分代码看起来不正确

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

您在循环中覆盖数组的相同位置,这意味着其他位置可能具有垃圾值。