В R существует ли опасность связи между циклами foreach (doSNOW) при использовании назначений для хранения промежуточного вывода?

Я хочу создать функцию, которая использует присваивания для хранения промежуточного вывода (p). Этот промежуточный вывод используется в операторах ниже. Я хочу, чтобы все было распараллелено с помощью doSNOW и foreach, и я НЕ хочу, чтобы этот промежуточный вывод передавался между итерациями цикла foreach. Я не хочу хранить промежуточный вывод в списке (например, p[[i]]), потому что тогда мне придется изменить огромное количество кода.

  • Вопрос 1: есть ли опасность, что другая итерация цикла foreach будет использовать промежуточный вывод (p)?
  • Вопрос 2. Если да, то когда это может быть опасно и как это предотвратить?

Вот пример того, что я имею в виду:

install.packages('foreach')
library('foreach')

install.packages('doSNOW')
library('doSNOW')

NbrCores <- 4
cl<-makeCluster(NbrCores) 
registerDoSNOW(cl)

test <- function(value){
   foreach(i=1:500) %dopar% {
      #some statement based on parameter 'value'
      p <- value
      #some statement that uses p
      v <- p
      #other statements
  }
}

test(value=1)

person user1134616    schedule 19.09.2012    source источник
comment
Обычно запрос противоположный, чтобы установить какую-то связь, что сложно, потому что обычно применяется изоляция результатов.   -  person IRTFM    schedule 19.09.2012
comment
@DWin это действительно часто запрос. Просто быть чистым; Я не хочу вообще никакого общения.   -  person user1134616    schedule 19.09.2012
comment
Я не думаю, что есть какая-то опасность. Процесс процессора не должен совместно использовать память, и R в любом случае не изменяет переменные на месте. Если вам нужны другие более обоснованные мнения, правильное место, чтобы задать вопрос, — это список рассылки R High Performance Computing SIG.   -  person IRTFM    schedule 19.09.2012


Ответы (1)


Я полагаю, что каждый из узлов, используемых в параллельных вычислениях, работает в своем собственном процессе R. Следовательно, нет риска того, что переменные из одного узла повлияют на результаты в другом. В общем, есть возможность общения между процессами. Однако foreach перебирает только заданную последовательность, независимо выполняя каждый элемент последовательности в одном из узлов.

person Paul Hiemstra    schedule 19.09.2012