R:加速Code,多核

时间:2014-09-02 16:36:35

标签: r parallel-processing multicore

我的R代码性能有问题。 我的代码很慢。我必须循环遍历3000个元素的向量。在每个循环中,我调用许多函数。 我首先尝试并行化,但它不起作用。在每一步中,我都需要前面的步骤结果。 现在我有了一个想法:我将矢量分成3个1000个元素。并自己计算每件作品。在第1部分和第2部分的第一个元素上,我会遇到问题,但我可以处理它。 我想通过一个单独的CPU核心来计算3个中的每一个。 实际上我可以制作3个.R文件并启动3个R-Sessions(= 3个Cores)并计算它。 但我想在一个档案中这样做。我想定义一下,我的第一个循环将由Core 1计算,而其他循环将由其他核心计算。

有可能吗? 谢谢。

这是一个简单的例子。它描述了我的问题。

#Situation now  
vec3000 <- rnorm(3000)
result3000 <- rep(NA, length(vec3000))
for (i in 1 : 3000){
    if (i == 1){
        result3000[i] <- vec3000[i]
    }else{
        result3000[i] <- result3000[i - 1] + vec3000[i]
    }
}

#New Situation
vec1000_1 <- vec3000[1:1000]
vec1000_2 <- vec3000[1001:2000]
vec1000_3 <- vec3000[2001:3000]
result1000_1 <- rep(NA, 1000)
result1000_2 <- rep(NA, 1000)
result1000_3 <- rep(NA, 1000)

#Calculated by Core 1
for (i in 1 : 1000){
    if (i == 1){
        result1000_1[i] <- vec1000_1[i]
    }else{
        result1000_1[i] <- result1000_1[i - 1] + vec1000_1[i]
    }
}

#Calculated by Core 2
for (i in 1 : 1000){
    if (i == 1){
        result1000_2[i] <- vec1000_2[i]
    }else{
        result1000_2[i] <- result1000_2[i - 1] + vec1000_2[i]
    }
}   

#Calculated by Core 3
for (i in 1 : 1000){
    if (i == 1){
        result1000_3[i] <- vec1000_3[i]
    }else{
        result1000_3[i] <- result1000_3[i - 1] + vec1000_3[i]
    }
}

1 个答案:

答案 0 :(得分:0)

以下是使用foreach包并行操作向量块的示例:

library(doParallel)
library(itertools)
nworkers <- 3
cl <- makePSOCKcluster(nworkers)
registerDoParallel(cl)
vec3000 <- rnorm(3000) # dummy input

# This computes "resvecs" which is a list of "nworkers" vectors
resvecs <- foreach(vec=isplitVector(vec3000, chunks=nworkers)) %dopar% {
    result <- double(length=length(vec))
    for (i in seq_along(result)) {
        if (i == 1) {
            result[i] <- vec[i]
        } else {
            result[i] <- result[i - 1] + vec[i]
        }
    }
    result
}

这使用itertools包中的“isplitVector”函数将“vec3000”拆分为三个块以使用三个核心。您可以更改“nworkers”的值以控制使用的核心数。

请注意,我使用了doParallel后端,因此该示例适用于Windows,Mac OS X和Linux。