0

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

1 回答 1

0

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

  1. pvm_exit()在从属二进制文件的末尾添加了一个调用,这显然是最好的做法。

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

我怀疑第二次更改中的某些内容也恰好解决了我的问题。

于 2010-11-23T13:28:56.240 回答