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并行计算上述示例的正确方法是什么?
答案 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详细介绍,但是很难看到该函数的代码。