PVM流程之间丢失的消息?

时间:2010-11-10 13:49:39

标签: linux parallel-processing pvm

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

1 个答案:

答案 0 :(得分:0)

不是一个真正的答案,但有两件事情在一起发生变化,问题似乎已经消退:

  1. 我在奴隶二进制文件的末尾添加了pvm_exit(),这显然是最好的。

  2. 群集上PVM的配置发生了变化......某种程度上......我没有任何细节,但是之前的一些节点无法参与PVM操作,现在可以。其他事情也可能有所改变。

  3. 我怀疑第二次发生变化的事情也解决了我的问题。