Linux PVM进程之间的消息丢失?
我正在尝试使用PVM对一个大学作业并行化一个算法。我已经对算法进行了排序,但并行化几乎只能起作用——过程会间歇性地陷入停滞,没有明显的原因。我看不到任何模式,使用相同参数的运行可能会运行10次,然后在下一次工作中卡住 所有Linux PVM进程之间的消息丢失?,linux,parallel-processing,pvm,Linux,Parallel Processing,Pvm,我正在尝试使用PVM对一个大学作业并行化一个算法。我已经对算法进行了排序,但并行化几乎只能起作用——过程会间歇性地陷入停滞,没有明显的原因。我看不到任何模式,使用相同参数的运行可能会运行10次,然后在下一次工作中卡住 所有pvm函数(在主进程或任何子进程中)均未返回任何错误代码,子进程似乎已成功完成,没有错误到达控制台。看起来主人并没有收到孩子们的每一条信息,只是偶尔跑一跑而已 但奇怪的是,我不认为这只是跳过一条消息——我还没有从一个孩子那里得到一个结果,然后成功地发送了一个完整的信号(也就是说
pvm
函数(在主进程或任何子进程中)均未返回任何错误代码,子进程似乎已成功完成,没有错误到达控制台。看起来主人并没有收到孩子们的每一条信息,只是偶尔跑一跑而已
但奇怪的是,我不认为这只是跳过一条消息——我还没有从一个孩子那里得到一个结果,然后成功地发送了一个完整的信号(也就是说,我还没有完成跑步并返回一个意外的结果)——这就好像孩子刚刚断开了连接,来自某一点的所有消息都将停止到达
将结果分批发送,发送更少但更大的消息,似乎可以提高可靠性,至少感觉不那么频繁-我没有硬性数字来支持这一点
PVM会丢失通过PVM\u send
和它的朋友发送的消息是正常的、常见的还是预期的?请注意,如果所有进程都在一台主机或多台主机上运行,则会发生错误
我做错什么了吗?我能做些什么来防止这种情况
更新
我在一个非常简单的测试用例(下面的代码)中重现了这个错误,它只产生了四个孩子,每个孩子向每个孩子发送一个数字,每个孩子将收到的数字乘以五,然后将其发回。它几乎一直在工作,但偶尔我们只打印出三个数字就僵住了——一个孩子的结果不见了(并且说孩子已经完成了)
大师:
这不是一个真正的答案,但两件事一起改变了,问题似乎已经平息:
pvm_exit()
对从属二进制文件末尾的调用,这显然是最好的做法int main()
{
pvm_start_pvmd( 0 , NULL , 0 );
int taskIDs[global::taskCount];
pvm_spawn( "/path/to/pvmtest/child" , NULL , 0 , NULL , global::taskCount , taskIDs );
int numbers[constant::taskCount] = { 5 , 10 , 15 , 20 };
for( int i=0 ; i<constant::taskCount ; ++i )
{
pvm_initsend( 0 );
pvm_pkint( &numbers[i] , 1 , 1 );
pvm_send( taskIDs[i] , 0 );
}
int received;
for( int i=0 ; i<global::taskCount ; ++i )
{
pvm_recv( -1 , -1 );
pvm_upkint( &received , 1 , 1 );
std::cout << recieved << std::endl;
}
pvm_halt();
}
int main()
{
int number;
pvm_recv( -1 , -1 );
pvm_upkint( &number , 1 , 1 );
number *= 10;
pvm_initsend( 0 );
pvm_pkint( &number , 1 , 1 );
pvm_send( pvm_parent() , 0 );
}