Использование двух вложенных параллельных циклов foreach, где foreach является частью функции - PullRequest
0 голосов
/ 10 июля 2020

В R я пытаюсь запустить два вложенных параллельных цикла foreach. Первый foreach l oop встроен в функцию f, которая выполняет несколько задач параллельно. Результаты объединяются функцией. Функция f здесь только для иллюстрации; реальная функция, с которой я работаю, более сложна, но в итоге также возвращает скаляр или вектор.

Впоследствии мне нужно запускать f много раз. f запускает x параллельных процессов, и я хочу запустить f еще раз y параллельно. Я считаю, что это создает всего x*y процессов на машине. Однако способ, которым я реализую эти идеи, кажется несовместимым с foreach, так как я получаю ошибку unserialize(socklist[[n]]) : error reading from connection.

Как правильно реализовать этот процесс?

В качестве примечания: если мы используем %do% для последовательной обработки во внешнем l oop, мы получим правильный результат, но это вычисление не будет выполняться параллельно.

library(doParallel)

# function f contains a random parallel processing task whose results are summed
# if we run f in the global environment we get a result

f = function(x){
  cl2 = makePSOCKcluster(x)
  clusterSetRNGStream(cl2)
  registerDoParallel(cl2)
  r = foreach(j = 1:x, .combine=rbind) %dopar% {
    sample(1:j,1)
  }
  stopCluster(cl2)
  closeAllConnections()
  sum(r)
}

# Now I want to run f y=5 times
# I would expect each of the 5 workers would create x own workers

y=5
cl1 = makePSOCKcluster(y)
clusterSetRNGStream(cl1)
registerDoParallel(cl1)
foreach(j = 1:y, .combine = rbind,
        .export = c('makePSOCKcluster', 
                    'clusterSetRNGStream',
                    'registerDoParallel', 
                    'stopCluster',
                    'closeAllConnections',
                    '%dopar%',
                    'foreach')
) %dopar% { f(j) } # use %do% for sequential processing gives the correct result
stopCluster(cl1)
closeAllConnections()
...