如何解决在for循环中接收信息会产生奇怪的错误
我正在尝试使用MPI
库中的for循环将由对象组成的数组的一部分从主节点广播到工作线程。我在Recv
步骤上遇到了问题。总体而言,我愿意提出任何建议,因为我认为有更简单的方法可以解决我的问题。在我的代码中,编译每个单独的MPI_Send
/ MPI_Recv
可以完美地工作,但不能一次全部编译。
if(rank==0){
for(unsigned int r=1; r < com; r++){ //r is the node identifier
for(int org = 0; org < NEAT::pop_size; org++){
...
std::vector<NEAT::Trait*> gen_traits = ...;
struct traits sent_traits[num_traits];
for(int id = 0; id < num_traits; id++){
sent_traits[id].trait_id = gen_traits[id]->trait_id;
...and other stuff
}
MPI_Isend(&num_traits,1,MPI_INT,r,org,parallel_2,&reqs_2[org]);
MPI_Isend(&sent_traits,mpi_trait,parallel_3,&reqs_3[org]);
使用相应的MPI_Recv(参见下文)进行编译。奇怪的部分如下:一旦我将节点向量的Recv
包括在内,程序就会崩溃。
struct nodes sent_nodes[num_nodes];
for(int id = 0; id < num_nodes; id++){
sent_nodes[id].node_id = gen_nodes[id]->node_id;
if(gen_nodes[id]->nodetrait==0){
sent_nodes[id].trait_id = 0;
...
}
MPI_Isend(&num_nodes,org+1,parallel_4,&reqs_4[org]);
MPI_Isend(&sent_nodes,mpi_node,parallel_5,&reqs_5[org]);
}
}
}
MPI_Barrier;
if(rank!=0){
for(int org = 0; org < num_orgs ; org++){
/*this first part is ok*/
traits rcvd_traits[num_rcvd_traits];
MPI_Recv(&num_rcvd_traits,&status);
MPI_Recv(&rcvd_traits,&status);
std::vector<NEAT::Trait*> gen_traits;
for(int id = 0; id < num_rcvd_traits; id++){
traits p_trait = rcvd_traits[id];
NEAT::Trait* build_trait = new NEAT::Trait(p_trait.trait_id,....
}
/*INCLUDING THIS ADDITIONAL PART LEADS TO A CRASH*/
int num_rcvd_nodes;
nodes rcvd_nodes[num_rcvd_nodes];
MPI_Recv(&num_rcvd_nodes,&status);
MPI_Recv(&rcvd_nodes,&status);
std::vector<NEAT::NNode*> gen_nodes;
for(int id = 0; id < num_rcvd_nodes; id++){
nodes p_node = rcvd_nodes[id];
NEAT::NNode* build_node = new NEAT::NNode(p_node.trait_id,p_node.type,p_node.gen_node_label,p_node.ftype,gen_traits);
gen_nodes.push_back(build_node);
}
}
std::cout << "finished " << std::endl;
}
MPI_Finalize();
我得到了错误:
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 124551 RUNNING AT joachim-X399-AORUS-PRO
= EXIT CODE: 139
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
This typically refers to a problem with your application.
我从这个玩具示例中得到启发:
int rank,com,num_orgs;
MPI_Init(NULL,NULL);
MPI_Status status;
MPI_Comm parallel_0 = MPI_COMM_WORLD;
MPI_Comm_rank(parallel_0,&rank);
MPI_Comm_size(parallel_0,&com);
MPI_Request reqs[4000];
if(rank==0){
for(int r=1; r < com; r++){
for(int q=0; q < 100; q++){
MPI_Send(&r,q,parallel_0);//,&reqs[r*(q+1)]);
}
}
}
if(rank!=0){
for(int q=0; q < 100; q++){
int rcvd;
MPI_Recv(&rcvd,MPI_COMM_WORLD,&status);
}
}
MPI_Finalize();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。