параллельное вычисление функции с помощью doSMP в Windows - PullRequest
1 голос
/ 03 августа 2010

Я пытаюсь сделать многоядерную функцию (в Windows), которая в какой-то момент вызывает другую функцию рабочей лошадки (функция внутри функции).Вот минимальный рабочий пример.Вам понадобятся пакеты doSMP и revoIPC (чтобы получить их, см. Сообщение Тала здесь ).

func1 <- function(x) {sqrt(x)}
func2 <- function(y) {
    func1(y)
}

library(doSMP)
wrk <- startWorkers(workerCount = 4) #I have 4 cores, so adjust to your specs
registerDoSMP(wrk)

obj.result <- foreach(i = 1:10000) %dopar% func2(i)

Вышеприведенная процедура не будет работать, но если я вложу func1 в func2 примерно так

func2 <- function(y) {
func1 <- function(x) {sqrt(x)}
    func1(y)
}

процесс проходит гладко (насколько я могу судить).

Как я могу вызывать функции извне с помощью %dopar%?

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Похоже, что проблема определения объема .

Ваш func1 известен в рабочей области вызова, но не в вычислительных узлах. Есть решения для этого, например пакет foreach содержит целые виньетки, озаглавленные Петли вложенности по каждому элементу .

0 голосов
/ 10 марта 2011

В функции foreach есть аргумент для передачи, если у вас есть пакеты для загрузки, чтобы выполнить функцию fun2

Как правило, в вашем примере, если fun1 является частью пакета PACKAGE1, выполните

obj.result <- foreach(i = 1:10000, .packages="PACKAGE1") %dopar% func2(i)

вместо

obj.result <- foreach(i = 1:10000) %dopar% func2(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...