我正在尝试使用PVM并行化算法来进行大学分配。我已经对算法进行了排序,但只有几乎的并行化工作 - 进程间歇性地被卡住,没有明显的原因。我可以看到没有模式,具有相同参数的运行可能会工作10次然后只是陷入下一步的努力......
pvm
函数(在主进程或任何子进程中)都没有返回任何错误代码,子进程似乎成功完成,没有错误到达控制台。它确实看起来像主人没有收到孩子们的每一次交流 - 但只是偶尔跑步。
奇怪的是,我不认为这只是跳过一条消息 - 我还没有从孩子身上找不到结果,然后成功发送了一个完整的信号(也就是说我没有跑达到完成并返回意外结果) - 就像孩子刚刚断开连接一样,来自某个点的所有消息都停止了。
批量处理结果并发送更少但更大的消息似乎以提高可靠性,至少感觉它不那么频繁 - 我没有硬数据支持这个...
PVM是否会丢失通过pvm_send
及其朋友发送的邮件是正常的,通用的还是预期的?请注意,如果所有进程都在单个主机或多个主机上运行,则会发生错误。
我做错了吗?我有什么办法可以帮助防止这种情况发生吗?
我在一个非常简单的测试用例中重现了错误,下面的代码只产生了四个孩子,每个孩子都会发送一个数字,每个孩子将它收到的数字乘以5并将其发回。它一直几乎,但偶尔我们会冻结只打印出三个数字 - 一个孩子的结果丢失(并说孩子已经完成)。
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 );
}
答案 0 :(得分:0)
不是一个真正的答案,但有两件事情在一起发生变化,问题似乎已经消退:
我在奴隶二进制文件的末尾添加了pvm_exit()
,这显然是最好的。
群集上PVM的配置发生了变化......某种程度上......我没有任何细节,但是之前的一些节点无法参与PVM操作,现在可以。其他事情也可能有所改变。
我怀疑第二次发生变化的事情也解决了我的问题。