【问题标题】:Calling functions when using parallel programming [closed]使用并行编程时调用函数[关闭]
【发布时间】:2018-03-14 20:18:11
【问题描述】:

我有一个关于在 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”来相乘两个向量,但不幸的是它返回了“dot”的初始值(基本上是 0)。

我只是想知道我们在做并行编程的时候调用函数有没有什么特别的地方。

PS:我知道整个程序正在运行,因为当我在“主”函数中直接将我的 2 个向量相乘时,它会给我带来很好的结果

【问题讨论】:

  • multiply 没有返回任何东西(它的返回类型是void 并且它似乎没有输出参数)。你能显示一个minimal reproducible example 以便我们看看你是怎么称呼它的吗?
  • 一致的缩进让代码更容易理解。
  • 感谢您的回答。我刚刚编辑了我的问题,以展示我如何使用它的简单示例。
  • 请,请,请,使用适当的缩进。
  • 这不是用 C 写的。

标签: c++ c function mpi


【解决方案1】:

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

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

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

【讨论】:

  • 确实,它现在正在工作。非常感谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2021-02-25
    • 2013-09-06
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多