gpt4 book ai didi

linux - PVM 进程之间丢失消息?

转载 作者:太空宇宙 更新时间:2023-11-04 04:30:10 24 4
gpt4 key购买 nike

我正在尝试使用 PVM 并行化大学作业的算法。我已经对算法进行了排序,但并行化仅几乎有效 - 该过程间歇性无缘无故地卡住了。我看不到任何模式,使用相同参数的运行可能会运行 10 次,然后就会陷入下一次努力......

pvm 函数(在主进程或任何子进程中)都没有返回任何错误代码,子进程似乎已成功完成,没有错误到达控制台。看起来主人确实没有收到 children 的每一次通信 - 但只是偶尔运行。

但奇怪的是,我不认为这只是跳过一条消息 - 我还没有从子级中丢失结果,然后成功发送完整信号(也就是说,我还没有运行完成并返回意外结果) - 就好像子级刚刚断开连接,并且来自某个点的所有消息都停止到达。

将结果进行批处理并发送更少但更大的消息似乎可以提高可靠性,至少感觉它的粘连频率降低了 - 我没有确凿的数据来支持这一点...

PVM 会丢失通过 pvm_send 及其 friend 发送的消息,这是正常的、常见的还是预期的?请注意,如果所有进程在单个主机或多个主机上运行,​​则会出现此错误。

我做错了什么吗?我可以做些什么来帮助防止这种情况发生吗?

更新

我在一个非常简单的测试用例上重现了该错误,代码如下,它只生成四个子级,向每个子级发送一个数字,每个子级将其收到的数字乘以五并将其发回。它几乎一直有效,但有时我们会卡住,只打印出三个数字 - 缺少一个 child 的结果(并且说 child 将完成)。

大师:

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. 我在从属二进制文件的末尾添加了 pvm_exit() 调用,这显然是最好的做法。

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

我怀疑第二秒内发生的一些变化也解决了我的问题。

关于linux - PVM 进程之间丢失消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4145128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com