Функция detectCores()
пакета parallel
, включенного в R 2.14.0, делает то, что вам нужно, если у вас действительно несколько ядер:
R> parallel::detectCores()
[1] 8
R>
Кроме того, mcparallel
само по себе не превращает умножение матриц в параллельную операцию (поскольку это «сложная» проблема, см. Библиотеки ScaLAPACK). Но вы можете попробовать что-то простое, например:
R> X <- 1:1e3
R> rbenchmark::benchmark(serial=sapply(X, function(x) log(sqrt(x))),
+> parallel=mclapply(X, function(x) log(sqrt(x))),
+> replications=500)
test replications elapsed relative user.self sys.self user.child sys.child
2 parallel 500 12.018 10.96 0.000 10.59 0.952 15.07
1 serial 500 1.097 1.00 1.208 0.00 0.000 0.00
R>
Таким образом, для 500 повторений простой операции (sqrt(log(x))
) на коротких векторах параллельное усиление. Но жизнь никогда не бывает такой простой: на больших векторах разница исчезает:
R> X <- 1:1e5
R> rbenchmark::benchmark(serial=sapply(X, function(x) log(sqrt(x))),
+> parallel=mclapply(X, function(x) log(sqrt(x))),
+> replications=10)
test replications elapsed relative user.self sys.self user.child sys.child
2 parallel 10 2.030 1.00 0.476 0.272 1.952 1.112
1 serial 10 2.821 1.39 2.228 0.592 0.000 0.000
R>
Печальная новость заключается в том, что параллельные вычисления сложны и намного сложнее, чем просто вставить выражение в mcparallel
или parallel
.