2

unparallelizedfnc という関数を並列化したい。この関数は、(計算に時間がかかる) 他の 4 つの関数を呼び出し、結果を格納します。最後に、結果が結合されます。私の関数のおもちゃの例を考えてみましょう (もちろん、これらは私が呼び出す 4 つの実際の関数ではなく、デモンストレーションのみを目的としています)。

複数のコアを持つコンピューターで、result1、result2、result3、result4 の計算を並列化するにはどうすればよいですか? Windows、Linux、Mac OSX で動作するようにしたいと考えています。この場合、並列化されたバージョンをベンチマークする必要はありません (オーバーヘッドのために遅くなりますが、私の実際のコードでは速くなります)。

4 つの結果が同じ関数 (ただしデータが異なる) である場合、並列 for ループ (foreach) または並列適用を使用できますが、この場合は関数が異なります。

unparallelizedfnc <- function(x) {

  result1 <- sum(x)
  result2 <- median(x)
  result3 <- min(x)
  result4 <- max(x)

  result <- mean(c(result1,result2,result3, result4))
  result
}


unparallelizedfnc(rnorm(100000))
4

1 に答える 1

6

最初に@Jilberが提案したように関数を修正しました:

unparallelizedfnc <- function(x) {

  result1 <- sum(x)
  result2 <- median(x)
  result3 <- min(x)
  result4 <- max(x)

  result <- mean(c(result1,result2,result3, result4))
  result
}


parallelizedfnc <- function(x) {
  require(parallel)
  funs <- list(sum,median,min,max)
  mean(do.call("c",mclapply(funs,function(fun) fun(x),mc.cores = 4)))
}

set.seed(42)
x <- rnorm(1e8)
identical(unparallelizedfnc(x),parallelizedfnc(x))
#[1] TRUE

library(microbenchmark)
microbenchmark(unparallelizedfnc(x),parallelizedfnc(x),times=3)

# Unit: seconds
#                 expr      min       lq   median       uq      max neval
# unparallelizedfnc(x) 3.155736 3.166381 3.177027 3.195497 3.213967     3
#   parallelizedfnc(x) 5.047008 5.207747 5.368486 5.514221 5.659956     3

などに注意してくださいsum。並列化の恩恵を受けるには速すぎます。並列化のオーバーヘッドにより、関数にはさらに時間がかかります。あなたの実際のユースケースには、最適化されていない機能があると思います。

于 2013-05-20T17:30:53.187 に答える