0

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

1 回答 1

1

您的这部分代码看起来不正确

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

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

于 2013-09-17T15:22:37.230 回答