首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PVM进程之间丢失的消息?

PVM进程之间丢失的消息?
EN

Stack Overflow用户
提问于 2010-11-10 13:49:38
回答 1查看 196关注 0票数 0

我正在尝试将一个使用PVM的算法并行化为一个大学作业。我已经对算法进行了排序,但是并行化几乎只起作用--这个过程断断续续地停滞不前,没有明显的原因。我看不出任何模式,相同参数的运行可能工作10次,然后被困在下一次的努力中.

没有一个pvm函数(在主进程或任何子进程中)返回任何错误代码,子函数似乎成功完成,没有错误到达控制台。看起来,主人并没有接收到孩子们的每一次交流,只是偶尔跑步而已。

不过,奇怪的是,我不认为它只是在跳过一条信息--我还没有从一个孩子那里得到一个结果,然后成功地发送了一个完整的信号(也就是说,我还没有完成运行到达并返回一个意想不到的结果)--就好像孩子只是被断开了连接一样,来自某个点的所有信息都停止到达。

分批处理结果,发送更少的,但更大的信息,似乎提高了可靠性,至少它似乎更少坚持-我没有硬数字支持这一点.

PVM是否正常、常见或预期将丢失通过pvm_send 及其朋友发送的消息?请注意,如果所有进程都在一台或多台主机上运行,则发生错误。

我做错了什么吗?我能做些什么来防止这件事吗?

更新

我在一个非常简单的测试用例上复制了这个错误,下面的代码,它只生成四个孩子,每个孩子向每个孩子发送一个数字,每个孩子将接收到的数字乘以5,然后把它发回。它几乎一直工作,但偶尔我们会冻结,只有三个数字打印出来-与一个孩子的结果丢失(并说孩子将完成)。

师父:

代码语言:javascript
复制
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();
}

儿童:

代码语言:javascript
复制
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 );
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-23 13:28:56

这并不是真正的答案,但有两件事已经改变了,问题似乎已经解决了:

  1. I在从二进制文件的末尾添加了一个pvm_exit()调用,这显然是最好的方法。不知怎么..。我没有任何细节,但以前有几个节点无法参与PVM操作,现在可以了。其他事情也可能发生了变化。

我怀疑在第二次改变中也发生了一些事情来解决我的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4145128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档