我正在尝试使用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 );
}

最佳答案

这并不是一个真正的答案,但是两件事已经一起变了,这个问题似乎已经消退了:


我在从二进制文件的末尾添加了pvm_exit()调用,这显然是最好的方法。
集群上PVM的配置发生了变化...某种程度上,我没有任何细节,但是以前有几个节点无法参与PVM操作,现在可以。其他情况也可能发生了变化。


我怀疑第二次更改内发生了某些事情,也解决了我的问题。

关于linux - PVM进程之间丢失消息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4145128/

10-12 23:53