代码之家  ›  专栏  ›  技术社区  ›  DMA57361

在pvm进程之间丢失消息?

  •  0
  • DMA57361  · 技术社区  · 15 年前

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

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

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

    成批处理结果并发送较少但较大的消息 似乎 为了提高可靠性,至少感觉它不太经常坚持-我没有硬数字来支持这一点…

    pvm是否会丢失通过 pvm_send 是朋友吗? 请注意,如果所有进程都在单个主机或多个主机上运行,则会发生错误。

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

    更新

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

    主控形状:

    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 回复  |  直到 15 年前
        1
  •  0
  •   DMA57361    15 年前

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

    1. 我添加了 pvm_exit() 对从属二进制文件结尾的调用,显然最好这样做。

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

    我怀疑第二次换衣服的时候也发生了什么事情来解决我的问题。