c++ - 使用并行编程时调用函数

标签 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;
}

然后,我在程序中调用函数“multiply”来将两个 vector 相乘,但不幸的是它返回“dot”的初始值(基本上为 0)。

我只是想知道,当我们进行并行编程时,调用函数有什么特别的地方吗?

PS:我知道整个程序正在运行,因为当我在“主”函数中直接乘以 2 个 vector 时,它给了我很好的结果

最佳答案

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

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

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

关于c++ - 使用并行编程时调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49286960/

相关文章:

c++ - 将定义转换为 BOOST_PP_TUPLE 或 BOOST_PP_SEQ

c++ - 制作 typedef 友元函数的构造函数/赋值运算符

C 程序在函数中获取无效转换

c - fread 不读取整个文件

javascript - typescript - 在 ionic 中以随机间隔调用函数

function - 在 Common Lisp 中,是否有一个函数可以从给定的字符串中返回一个符号?

c++ - 如何找到当前输入语言

c++ - 私有(private) typedef 的公共(public)使用是否可移植?

c - 如何删除一个数组结构体,并且最后一个索引不能被其他索引替换?

c - 函数 C 不会打印