Чтобы запустить мое программное обеспечение с 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()
Зулан прав, привязки 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
Других решений пока нет …