Невозможно скомпилировать функцию, которая возвращает объект типа MPI :: Comm

Чтобы запустить мое программное обеспечение с MPI, мне нужно создать простой метод, который будет возвращать MPI::COMM_WORLD,

Итак, в моем классе у нас есть:

#include <mpi.h>
class Parallel{
public:

MPI::Comm getCommunicator(){
return MPI::COMM_WORLD;
}
protected:

int iproc;
};

int main(int argc, char *argv[]){

Parallel* parallel;
MPI::Init(argc, argv);
int my_rank;
my_rank = parallel->getCommunicator().Get_rank();
MPI::Finalize();
return 0;
}

Как я должен реализовать getCommunicator() метод в порядке, он возвращает MPI::COMM_WORLD? Когда я пытаюсь скомпилировать выше, я получаю следующую ошибку:

invalid abstract return type for member function 'MPI::Comm Parallel ::getCommunicator()

2

Решение

Зулан прав, привязки C ++ удалены из MPI 3, поэтому новый код не должен быть написан с их использованием.

Причина, по которой они были удалены, состоит в том, что они не были особенно хорошо продуманы или поддержаны, и они определенно не очень идиоматичны, поэтому есть много странных случаев, с которыми вы сталкиваетесь, если используете их. Повысьте :: MPI гораздо лучше, но, к сожалению, только MPI 1.

Если в целях поддержки существующего кода это необходимо, проблема описана Вот — по крайней мере, в OpenMPI MPI :: Comm определен как чистый виртуальный класс, поэтому вы не можете вернуть объект этого типа, так как нет способа его создания; Вы можете вернуть только подтип. (Я предполагаю, что это было сделано таким образом, чтобы внутри- и межкоммуникаторы могли быть подтипами).

Классический способ справиться с этой ситуацией — вернуть ссылку на объект, а не на сам объект, и позволить компилятору иметь дело с апкастингом:

#include <mpi.h>
#include <iostream>

class Parallel{
public:
MPI::Comm &getCommunicator(){
return MPI::COMM_WORLD;
}
protected:
int iproc;
};

int main(int argc, char *argv[]){

Parallel* parallel;
MPI::Init(argc, argv);
int my_rank, size;

my_rank = parallel->getCommunicator().Get_rank();
size = parallel->getCommunicator().Get_size();
std::cout << my_rank << "/" << size << std::endl;
MPI::Finalize();
return 0;
}

дает

$ mpic++ -o foo foo.cpp
$ mpiexec -np 4 ./foo
1/4
2/4
3/4
0/4
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]