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를 통해 그것을 실행, 그리고 그것을 잘 작동합니다. 하지만 지금은 별개의 주소 공간은 포인터 값이을 생성 한 프로세스가 아닌 다른 프로세스에서 USELESS라는 것을 의미하기 때문에 필자는 그 이유가 없습니다.
P. 여기 내 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)