首页 文章

使用并行包将具有不同参数的函数调用发送到R中的不同处理器

提问于
浏览
5

我试图使用R中的并行包向四个不同的处理器发送四个不同的函数调用,但我真的迷失了如何分配不同的内核来做不同的工作 . 我已经阅读了R中并行包,doParallel,Rmpi和foreach的文档 . 我看过很多帖子使用mclapply来调用具有相同参数的不同函数 . 我想用不同的参数调用相同的函数 .

这是我想要完成的伪代码:

BEGIN parallel (core)
if(core == 1)
   foo(5, 4, 1/2, 3, "a")
if(core == 2)
   foo(5, 3, 1/3, 1, "b")
if(core == 3)
   foo(5, 4, 1/4, 1, "c")
if(core == 4)
   foo(5, 2, 1/5, 0, "d")
END parallel

这似乎是并行计算的完美应用,因为这四个独立的函数调用可以独立地解决我正在处理的问题 . 我不知道如何在R中这样做 .

2 回答

  • 4

    试试这个:

    步骤0:设置群集和用户数据

    library(parallel)
    library(doParallel)
    library(foreach)
    
    cl <- makeCluster(4)          # Assuming 4 node cluster
    registerDoParallel(cl) 
    
    foo <- function(...) paste(...,collapse="-") # A dummy function:
    
    (parDf <- data.frame(x1=5,x2=c(4,3,4,2),x3=1/(2:5),x4=3:0,x5=letters[1:4])) # Dummy parameters
    parDf$x5 <- as.character(parDf$x5)
    

    第1步:查找每个节点的进程ID:

    nodeNames <- foreach(i = 1:length(cl), .combine=c) %dopar% {
      Sys.getpid()
    }
    

    第2步:使用进程ID选择一组特定的参数:

    foreach(i = 1:10, .combine=c) %dopar% {
      paste(Sys.getpid(),foo(parDf[which(Sys.getpid()==nodeNames),]))
    }
    

    希望这可以帮助!!

  • 2

    您可以使用并行包中的clusterApply函数:

    library(parallel)
    cl <- makeCluster(4)
    clusterExport(cl, "foo")
    cores <- seq_along(cl)
    r <- clusterApply(cl[cores], cores, function(core) {
      if (core == 1) {
        foo(5, 4, 1/2, 3, "a")
      } else if (core == 2) {
        foo(5, 3, 1/3, 1, "b")
      } else if (core == 3) {
        foo(5, 4, 1/4, 1, "c")
      } else if (core == 4) {
        foo(5, 2, 1/5, 0, "d")
      }
    })
    

    这与您的伪代码非常相似,并演示了如何使用clusterApply将特定任务定向到特定群集工作程序 . 请注意,通过更改 cores 的值,您可以在您选择的任何群集工作程序上执行 .

    如果“核心ID”不是很重要,则可以使用foreach包迭代每个参数的向量,从而将不同的参数传递给函数:

    library(doParallel)
    registerDoParallel(cl)
    r2 <- foreach(a1=c(5,5,5,5), a2=c(4,3,4,2), a3=c(1/2,1/3,1/4,1/5),
                  a4=c(3,1,1,0), a5=c("a","b","c","d")) %dopar% {
      foo(a1, a2, a3, a4, a5)
    }
    

相关问题