如何使用Rmpi远程执行myfun和散乱的向量

时间:2017-11-01 19:01:44

标签: r parallel-processing mpi

myfun是一个用户定义的函数,例如, myfun =函数(X){X ^ 3}。 现在我想通过使用3个从属并行运行myfun为一个向量,比如说t = 1:10。我的代码如下所示,

mpi.spawn.Rslaves(nslaves=3)
source("myfun.R")
mpi.bcast.cmd(myfun) #broadcast myfun to slaves
x=1:10
grp=ceiling(seq_along(x)/3)
grp[10]=3
sx=split(x,grp)
mpi.scatter.Robj2slave(sx) #scatter x into 3 groups to slaves
y=mpi.remote.exec(cmd=myfun,sx) #this does not work!
print(y)
mpi.close.Rslaves()
mpi.quit()

问题是,Rmpi不能正确地执行散乱的sx上的myfun。在手册中,关于命令mpi.remote.exec,它说

  

...用作cmd(函数命令)的参数来传递它们   (主)值到R从站,即,如果'myfun(x)'将在R上执行   使用'x'作为主变量的奴隶,使用mpi.remote.exec(cmd = myfun,x)。

因为' x'是一个主变量,这是否意味着它不可能为从属上的分散x执行myfun?如果没有,通过使用Rmpi并行计算上述示例的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

在myfun内部,使用

i <- mpi.comm.rank()

选择sx的一个分量

myfun<-
function(x)
{
     i <- mpi.comm.rank()
     x[[i]]^3
}

答案 1 :(得分:0)

我认为您的问题在于使用

mpi.bcast.cmd(myfun) #broadcast myfun to slaves

我认为应该是

mpi.bcast.Robj2slave(myfun)

请注意{{3}}中的描述。

您的myfun可能还有第二个问题,由@zmirlig详细介绍,但是很难看到该函数的代码。