使用并行编程时调用函数

时间:2018-03-14 20:18:11

标签: c++ c function mpi

我只是有一个关于在C ++程序中使用MPI的相当简单的问题。实际上,让我们举个例子:

#include <iostream>
#include <sstream>
#include <cblas.h>
#include <cmath>

using namespace std;

#include <mpi.h>

void multiply(double* x,double* y,int tai,double dot){
    for(int i=0; i<tai;i=i+1){
        dot=dot+x[i]*y[i];
    }
}

int main(int argc, char* argv[]) {
    const int n=32;
    int rank;
    int size;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    int tai=n/size;
    double* x=new double[tai];
    double* y=new double[tai];
    srand(time(0)+rank);

    for(int i=0;i<tai;i=i+1){
        x[i]=(double)rand()/RAND_MAX*10;
        y[i]=(double)rand()/RAND_MAX*10;
    }
    double dot=0;
    multiply(x,y,tai,dot);
    double ddot;
    MPI_Reduce(&dot, &ddot, 1, MPI_DOUBLE, MPI_SUM,0, MPI_COMM_WORLD);
    if(rank==0){
        cout<<"product:"<<ddot<<endl;
    }
    MPI_Finalize();
    return 0;
}

然后,我调用我的函数&#34;乘以&#34;在我的程序中乘以两个向量但不幸的是它返回&#34; dot&#34;的初始值。 (基本上是0)。

我想知道在进行并行编程时是否有任何关于调用函数的特殊内容。

PS:我知道整个程序正在运行,因为它直接将我的2个向量乘以&#34; main&#34;功能

2 个答案:

答案 0 :(得分:2)

dot的初始值未更改是因为它是按值传递的。传递给dot时会生成multiply的副本,这是修改后的版本。如果您希望multiply修改dot变量,并将更改保留在multiply函数之外,请通过引用传递dot

void multiply(double* x, double* y, int tai, double& dot);

您使用MPI的事实对此行为没有影响。

答案 1 :(得分:0)

除了提供的代码有问题之外,你的问题的答案是否定的,每个处理元素都将通过调用它的函数,但也许你不希望每个处理元素都做整个点积而你' d最好使用scatterv和gatherv来分割程序;或者每个处理元素都有自己独特的向量,这些向量可以在以后减少或添加,你也可以。请务必使用MPI类型。