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

Linux PVM进程之间的消息丢失?,linux,parallel-processing,pvm,Linux,Parallel Processing,Pvm,我正在尝试使用PVM对一个大学作业并行化一个算法。我已经对算法进行了排序,但并行化几乎只能起作用——过程会间歇性地陷入停滞,没有明显的原因。我看不到任何模式,使用相同参数的运行可能会运行10次,然后在下一次工作中卡住 所有pvm函数(在主进程或任何子进程中)均未返回任何错误代码,子进程似乎已成功完成,没有错误到达控制台。看起来主人并没有收到孩子们的每一条信息,只是偶尔跑一跑而已 但奇怪的是,我不认为这只是跳过一条消息——我还没有从一个孩子那里得到一个结果,然后成功地发送了一个完整的信号(也就是说

我正在尝试使用PVM对一个大学作业并行化一个算法。我已经对算法进行了排序,但并行化几乎只能起作用——过程会间歇性地陷入停滞,没有明显的原因。我看不到任何模式,使用相同参数的运行可能会运行10次,然后在下一次工作中卡住

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

但奇怪的是,我不认为这只是跳过一条消息——我还没有从一个孩子那里得到一个结果,然后成功地发送了一个完整的信号(也就是说,我还没有完成跑步并返回一个意外的结果)——这就好像孩子刚刚断开了连接,来自某一点的所有消息都将停止到达

将结果分批发送,发送更少但更大的消息,似乎可以提高可靠性,至少感觉不那么频繁-我没有硬性数字来支持这一点

PVM会丢失通过
PVM\u send
和它的朋友发送的消息是正常的、常见的还是预期的?
请注意,如果所有进程都在一台主机或多台主机上运行,则会发生错误

我做错什么了吗?我能做些什么来防止这种情况

更新 我在一个非常简单的测试用例(下面的代码)中重现了这个错误,它只产生了四个孩子,每个孩子向每个孩子发送一个数字,每个孩子将收到的数字乘以五,然后将其发回。它几乎一直在工作,但偶尔我们只打印出三个数字就僵住了——一个孩子的结果不见了(并且说孩子已经完成了)

大师:
这不是一个真正的答案,但两件事一起改变了,问题似乎已经平息:

  • 我添加了
    pvm_exit()
    对从属二进制文件末尾的调用,这显然是最好的做法

  • 群集上的PVM配置已更改。。。以某种方式我没有任何细节,但一些节点以前无法参与PVM操作,现在可以。其他事情也可能发生了变化

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

    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 );
    }