Rmpi发送/接收挂起?

Rmpi发送/接收挂起?,r,parallel-processing,mpi,mcmc,R,Parallel Processing,Mpi,Mcmc,我正在为人口MCMC编写代码。我会尽量提供我认为有帮助的信息,所以请耐心等待 我使用的是缓和分布,我希望执行交换移动,即建议交换两条链的值的移动 我所做的(交换发生在主人身上) 这是我最初写的 让每个链在指定的迭代次数n内变异 在每一次第n次迭代中,我都会将从属对象的结果发送给主对象,然后尝试在链之间交换参数 然后将更新的值发送回从属服务器并重复该过程 我想要实现的(在奴隶之间直接交换) 这很好,但我想清理我的代码,并删除主从之间不必要的通信。也就是说,让奴隶直接在他们之间交流 所以假设我生

我正在为人口MCMC编写代码。我会尽量提供我认为有帮助的信息,所以请耐心等待

我使用的是缓和分布,我希望执行交换移动,即建议交换两条链的值的移动

我所做的(交换发生在主人身上) 这是我最初写的

  • 让每个链在指定的迭代次数n内变异

  • 在每一次第n次迭代中,我都会将从属对象的结果发送给主对象,然后尝试在链之间交换参数

  • 然后将更新的值发送回从属服务器并重复该过程

我想要实现的(在奴隶之间直接交换) 这很好,但我想清理我的代码,并删除主从之间不必要的通信。也就是说,让奴隶直接在他们之间交流

所以假设我生了10个奴隶

  • 在迭代n中,我想让slave1-slave2,slave3-slave4,…,slave9-slave10在它们之间进行通信
  • 在迭代2*n中,我想让slave2-slave3,slave4-slave5,…slave8-slave9在它们之间进行通信
以此类推,让样本通过温度阶梯

问题 这就是我面临的问题。
我想我正在设法将一个值从一个从机发送到另一个从机(我的打印语句“Successfully sent”被打印在正在发送的从机的日志文件中),但这似乎没有被接收(我的“Successfully received”语句没有被打印在伙伴从机的日志中)

而程序只是挂起。我想可能是我造成了僵局,但我不确定我做错了什么

你能给我个建议吗?我使用了这个并行回火R代码作为指导

请看下面我的代码

非常感谢

索非亚


这似乎很奇怪。据我所知,send和receive命令是锁定的,因此在没有receive-To-work的情况下,send-To-work对我来说有点奇怪。你试过指南上的代码了吗?如果你愿意,我可以把整个R代码发给你,看看它在你的系统上是否有效。如果指南中的代码有效,那么您可以放心地说,MPI设置没有问题

您可以尝试使用receive命令,而不是使用ind.partner。您可以使用mpi.any.source()(我认为是正确的),它将接受任何标记的消息。若这解决了您的死锁,那个么标签可能会有问题(但从外观上看,我觉得并没有任何问题)


您可以尝试的另一件事是删除receive命令上的“source=”和“tag=”。我注意到,在我的代码中,当我对send命令执行时,没有任何代码。也许这也给我带来了麻烦,但我记不清了。让我知道进展如何,我希望一切顺利

是否所有接收从机都在其日志文件中包含消息“接收logL.partner的标记是:”并且没有一个说“成功接收”?
noChains
是否设置为您生成的从属数量?这段代码是否在您通过mpi.remote.exec执行的函数中?谢谢Steve。是消息“接收标签…”打印在所有接收从机的日志中,但没有一个具有“成功接收”的消息。很抱歉,我没有在我最初的帖子中澄清其他2点,但是noChains确实是我产生的奴隶数量。是的,这段代码包含在我使用mpi.remote.exece执行的一个更大的函数中。您是否使用mpirun执行R脚本?如果你这样做会有什么不同吗?不,我不知道有什么不同。让我检查一下,然后再报告。谢谢只需确保在执行生成worker的脚本时使用“-n1”选项。我之所以建议这样做,是因为使用mpirun有时效果更好,即使是在一台机器上运行。为了在多台机器上执行,这是必要的。你好,林登,谢谢你的回复!mpi.any.source()&mpi.any.tag()不会更改任何内容。删除参数名称并只保留接收的值也不会更改某些内容。很抱歉,我最初没有提到它,但是的,我在您的指南中尝试了该代码,它似乎工作正常。然而,今天早些时候,当我将您的工作代码合并到我的代码中时(仅对注释掉所有θ相关行进行了修改),我发现了相同的问题:我可以发送但不能接收。。。现在我更困惑了(但至少我可以排除有问题的MPI设置)。
ind <- mpi.comm.rank()
oddFlag<-0   ### object to flag code suitable for odd/even numbered slaves.

for  (i in  1:TotalIter)  {
##### normal MCMC move (single chain mutation) -  logL.current

 if ( i%%exchangeInterval == 0 ){   ### every nth (right now 5th) iteration, attempt an exchange  

message("\n\nAttempt an exchange move")
oddFlag<-oddFlag+1     
exchange<-0
logL.partner<-0

  if (ind%%2 == oddFlag%%2) {  ###when oddFlag even , the following code concerns even-numbered slaves. When odd number, it concerns odd-numbered slaves.                                                  
  ind.partner<-ind+1

  if (0<ind.partner && ind.partner<(noChains+1)){
    message("This is the slave: ", ind, " and its partner is: ", ind.partner)
    message("The tag for receiving logL.partner is: ", ind.partner)          
    logL.partner<-mpi.recv.Robj(source=ind.partner,tag=ind.partner)  #### receive the logL of partner                    
    message("Succesfully received")
    message("This is the logL.partner: ", logL.partner)
    exchanges.attempted<-exchanges.attempted+1

    if (runif(1)< min(1, exp((logL.partner - estimatorSelf)*(temper[ind] - temper[ind.partner] )))) {    ############# exp((chain2 - chain1)*(T1 - T2))                                          
      message("I exchanged the values")
      exchange<-1
      print(exchange)
      exchanges.accepted<-exchanges.accepted+1
    }
    mpi.send.Robj(obj=exchange,dest=ind.partner,tag=15*ind)
  }

  if (exchange==1){
### exchange parameters  with mpi.send.Robj/mpi.recv.Robj functions
  }

} else {  ##### ###when oddFlag even , the following code concerns odd-numbered slaves. For oddFlag odd, it concerns even-numbered slaves.                              
  ind.partner<-ind-1

  if (0<ind.partner && ind.partner<(noChains+1)){
    message("This is the slave: ", ind, " and its partner is: ", ind.partner)
    message("The tag for sending logL.current is: ", ind)
    mpi.send.Robj(obj=logL.current,dest=ind.partner,tag=ind)  ### send logL to partner
    message("Succesfully sent")

    exchange<-mpi.recv.Robj(source=ind.partner, tag=15*ind.partner)
    message("I received the exchange message")
  }

  if (exchange==1){
 ### exchange parameters send/receive functions
   }
  }
 }
}