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.S.ここに私のホストファイルは
blade11:1
blade12:1
blade13:1
blade14:1
blade15:1
blade16:1
blade17:1
blade18:2
blade19:1
であり、私はそれはあなたがあなたのクラスタ環境が均質であり、通常の実行ファイルには、アドレス空間のランダム化がでていないという意味で幸運ですC++ 11