Безопасно ли передавать указатели функций через MPI как способ сообщить другому узлу о вызове функции? Кто-то может сказать, что передача каких-либо указателей через MPI бессмысленна, но я написал код для его проверки.Отправлять указатель функции через MPI
//test.cpp
#include <cstdio>
#include <iostream>
#include <mpi.h>
#include <cstring>
using namespace std;
int f1(int a){return a + 1;}
int f2(int a){return a + 2;}
int f3(int a){return a + 3;}
using F=int (*)(int);
int main(int argc, char *argv[]){
MPI_Init(&argc, &argv);
int rank, size;
MPI_Status state;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
//test
char data[10];
if(0 == rank){
*(reinterpret_cast<F*>(data))=&f2;
for(int i = 1 ; i < size ; ++i)
MPI_Send(data, 8, MPI_CHAR, i, 0, MPI_COMM_WORLD);
}else{
MPI_Recv(data, 8, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &state);
F* fp = reinterpret_cast<F*>(data);
int ans = (**fp)(10);
cout << ans << endl;
}
MPI_Finalize();
return 0;
}
Вот результат:
12
12
12
12
12
12
12
12
12
Я побежал через MVAPICH, и он работает хорошо. Но я просто не понимаю, почему, поскольку отдельные адресные пространства означают, что значение указателя БЕСПЛАТНО в любом процессе, отличном от того, который сгенерировал его.
P.S. вот мой hostfile
blade11:1
blade12:1
blade13:1
blade14:1
blade15:1
blade16:1
blade17:1
blade18:2
blade19:1
и я побежал mpiexec -n 10 -f hostfile ./test
, и он был скомпилирован с помощью C++ 11