首页 > 解决方案 > 在 MPI 中重载运算符 ()

问题描述

希望你在这些时候做得很好。

我正在尝试用 C/C++ 编写一个并行求解器,并在进程 (p) 上分布一个数组。

试图重载运算符'()';为了从各个进程返回分布式数组的本地值,我有一个函数如下:

**double&** operator()(int r, int c)
{
           int rank = MPI::COMM_WORLD.Get_rank();
           int size = MPI::COMM_WORLD.Get_size();
           int globalIndex = r * mcols() + c;
           if (globalIndex >= lo && globalIndex <= (lo + bloc))
                        **return localData [ globalIndex % lo];**
}

问题出现在突出显示的部分,我希望只有一个进程(具有值的进程)返回它,但是所有进程都尝试返回一些值。我最终得到一个 mpi 运行时错误,其中进程有一个没有返回值的函数(当条件失败时)。

(1) 有没有一种方法可以让我有选择地选择一个特定的进程来执行一个函数 (2) 或者有没有一种方法可以让我退出一个函数而不返回一个值。(3) 这是一个语义问题,有没有办法处理这种情况

标签: c++returnoverloadingmpi

解决方案


您可以返回指针,而不是引用。

double* operator()(int r, int c)
{
           int rank = MPI::COMM_WORLD.Get_rank();
           int size = MPI::COMM_WORLD.Get_size();
           int globalIndex = r * mcols() + c;
           if (globalIndex >= lo && globalIndex <= (lo + bloc))
                        return &localData [ globalIndex % lo];
           return nullptr;
}

推荐阅读