【发布时间】:2014-06-02 12:48:07
【问题描述】:
所以我正在使用 MPI 开发一个项目,并且我正在尝试创建自己的结构。我遇到的问题是它似乎无法正常工作,因为我从未在工作人员内部收到任何东西,所以我超时了。我尝试使用标准的 MPI_INT,效果很好。但是,当我尝试实现自己的类型时,它不喜欢它......这是我的代码:
#include <iostream>
#include <mpi.h>
#include "main.hpp"
int main(int argc, char *argv[]){
//initialize MPI
MPI_Init(&argc, &argv);
message_to_worker message;
//declare my new type
MPI_Datatype MessageType;
//declare the types the the structure will have
MPI_Datatype type[1] = { MPI_INT };
//the number of results for each type(int[50] will be 50 etc..)
int blocklen[1] = {1};
//this will store the displacement for each var in the structure
MPI_Aint disp[1] = {0};
MPI_Aint var1, var2;
//number of vars
int count = 1;
//define the type
MPI_Type_struct(count, blocklen, disp, type, &MessageType);
MPI_Type_commit(&MessageType);
std::cout << "The displacement is " << disp[0] << std::endl;
int rank;
int world_size;
//give me my current rank(node 1 reiceves 1 , node 2 etc... )
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int counter = 1;
message.N = 5;
//IF MASTER
if (rank == 0) {
int result;
//send messages to the workers
while(counter<world_size){
//send 1 message of type MessageType using my own structure(first parameter)
result = MPI_Ssend(&message, 1, MessageType, counter, 123, MPI_COMM_WORLD);
//make sure the mssage was sent correctly
if (result == MPI_SUCCESS){
std::cout << "I am master and the world size is : " << world_size << std::endl;
std::cout << " I send a message to mky worker thread " << std::endl;
}else{
std::cout << "There was a problem with the sending for worker " << counter << std::endl;
}
counter++;
}
}
//IF WORKER
else if (rank > 0) {
//the worker will wait until it receives a message
int result = MPI_Recv(&message, 1, MessageType, 0, 0, MPI_COMM_WORLD,
MPI_STATUS_IGNORE);
//make sure the message was RECEIVED correctly
if (result == MPI_SUCCESS){
std::cout << "Worker - Rank: " << rank <<" OK! and the value received through the message is " << message.N << std::endl;
}
}
//shutdown MPI
MPI_Finalize();
return 0;
}
【问题讨论】:
-
请将您的解决方案变成答案,等待计时器超时并接受它。
-
一个不请自来的建议:检查 MPI 通信调用的返回值是没有意义的,除非您明确更改了通信器的错误处理程序(您还没有这样做)。默认处理程序会在出错时终止程序,这就是为什么您永远不会看到除
MPI_SUCCESS之外的任何返回码。 -
@HristoIliev,谢谢。我绝对不知道,我很感激你的建议!
标签: c++ mpi distributed-computing