Rmpi发送/接收挂?

时间:2013-11-06 19:30:43

标签: r parallel-processing mpi mcmc

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

我正在使用冥想分布,我想进行交换动作,即建议交换两个链的值的动作。

我做了什么(交换发生在主人身上)

我最初是通过

写的
  • 让每个链变异指定的迭代次数n。

  • 在每第n次迭代中,我都会发送奴隶'结果给主人,并尝试在链之间交换参数。

  • 然后将更新的值发送回从属设备并重复此过程。

我想要实现的目标(在奴隶之间直接交换)

这工作正常,但我想清理我的代码并删除主服务器和从服务器之间不必要的通信。也就是说,让奴隶直接在他们之间进行交流。

假设我正在产生10个奴隶,

  • 在迭代n,我想让slave1-slave2,slave3-slave4,....,slave9-slave10在它们之间进行通信
  • 在迭代2 * n,我想让slave2-slave3,slave4-slave5,... slave8-slave9在它们之间进行通信

依此类推,让我让样品穿过温度梯。

问题

这就是我遇到问题的地方 我想我正在设法从一个奴隶发送一个值到另一个(我的打印声明"成功发送"被打印在发送的奴隶的日志文件中)但这似乎不是收到(我的"成功收到"声明不会打印在伙伴奴隶的日志中)。

程序刚刚挂起。我想也许我已经造成了僵局,但我不确定我做错了什么?

你能告诉我吗?我用这个Parallel Tempering R代码作为指导 http://www.lindonslog.com/mathematics/parallel-tempering-r-rmpi/

请参阅下面的代码

非常感谢!

索菲亚

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

1 个答案:

答案 0 :(得分:0)

这似乎很奇怪。据我所知,发送和接收命令是锁定的,所以发送工作没有接收工作打击我有点奇怪。你试过指南上的代码了吗?如果您愿意,我可以向您发送整个R代码,以查看它是否适用于您的系统。如果指南上的代码有效,那么您可以放心地说它不是MPI设置的问题。

您可能尝试的一件事是使用receive命令而不是使用ind.partner,您可以使用mpi.any.source()(我认为是正确的),它将接受任何标记的消息。如果这可以解决你的僵局,那么标签可能会出现问题(但是通过眼睛看来我似乎没有任何问题)。

您可能尝试的另一件事是删除接收命令中的“source =”和“tag =”。我在我的代码中注意到,当我执行send命令时,我没有任何内容。也许这让我有太多问题,但我不记得了。让我知道它是怎么回事,我希望一切顺利。