[英]MPI communication running multiple executables
我正在實現一個應運行主從算法的程序,並且主從作業將由執行參數確定。 例如:
mpirun -oversubscribe -tag-output -np 1 BioNetFit2 -a load -c parabolaA_272002678.sconf : -oversubscribe -tag-output -np 4 BioNetFit2 -t particle -p 0 -a run -c parabolaA_272002678.sconf
在這種情況下,主服務器將運行以下部分: ./BioNetFit2 -a load -c parabolaA_272002678.sconf
從站將執行此部分: ./BioNetFit2 -t particle -p 0 -a run -c parabolaA_272002678.sconf
這就是我初始化通信世界的方式:
cout << "Detected BNF2mpi in Pheromones init()" << endl;
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
cout << "Defined mpi environment" << endl;
// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
cout << "My rank is " << world_rank << "and I have just started." << endl;
我的問題是,主服務器發送一條消息,而從服務器則從未收到它,反之亦然。
所有源代碼都可以在這里找到: https : //github.com/raqueldias/testing_rep這是一個大型程序,它是由另一個人首先在boost-MPI中實現的,我的工作是從boost轉換分布式消息傳遞功能。 -MPI到MPI。
我的第一個非常基本的問題是:如果我按這樣的兩個部分運行程序,則這些進程默認情況下是否能夠正常通信,還是必須指定任何其他配置才能使其通信?
事實證明,進程掛起的問題與mpirun執行中的多個程序或多個實例的執行無關。
我誤解了MPI_Iprobe的工作方式。 這是我之前實現的方式:
while (1) {
//std::cout << "rcv loop" << std::endl;
serializedMessage.resize(1000);
usleep(10000);
MPI_Status status;
int flag = 0;
while(!flag){
MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
}
if (flag) {
//receive code here
}
} ...
這使進程掛起。 使程序正常工作的正確實現是:
while (1) {
//std::cout << "rcv loop" << std::endl;
serializedMessage.resize(1000);
usleep(10000);
MPI_Status status;
int flag = 0;
MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
if (flag==1) {
//do something here
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.