Выполнять цикл foreach параллельно или последовательно с заданным условием

Я часто получаю несколько вложенных циклов foreach , а иногда при написании общих функций (например, для пакета) нет уровня, на котором очевидным образом можно распараллелить. Есть ли какой-нибудь способ выполнить то, что описывается в макете ниже?

foreach(i = 1:I) %if(I < J) `do` else `dopar`% {
    foreach(j = 1:J) %if(I >= J) `do` else `dopar`% {
        # Do stuff
    }
}

Кроме того, есть ли способ определить, зарегистрирован ли параллельный сервер, чтобы я мог избежать ненужных предупреждающих сообщений? Это было бы полезно как при проверке пакетов перед отправкой CRAN, так и для того, чтобы не беспокоить пользователей, использующих R на одноядерных компьютерах.

foreach(i=1:I) %if(is.parallel.backend.registered()) `dopar` else `do`% {
    # Do stuff
}

Спасибо за ваше время.

Изменить: Большое спасибо за все отзывы о ядрах. и рабочие, и вы правы в том, что лучший способ справиться с приведенным выше примером - это переосмыслить всю настройку. Я бы предпочел, чтобы идея triu была приведена ниже, но, по сути, это то же самое. И, конечно же, это можно было бы сделать с помощью параллельного приложения , как предлагал Джорис.

ij <- expand.grid(i=1:I, j=1:J)
foreach(i=ij$I, j=ij$J) %dopar% {
    myFuction(i, j)
}

Однако, пытаясь упростить ситуацию, которая породила эту тему, я упустил некоторые важные детали. Представьте, что у меня есть две функции анализировать и batch.analyse , и лучший уровень для распараллеливания может отличаться в зависимости от значений n.replicates и ] n.time.points .

analyse <- function(x, y, n.replicates=1000){
    foreach(r = 1:n.replicates) %do% {
        # Do stuff with x and y
    }
}
batch.analyse <- function(x, y, n.replicates=10, n.time.points=1000){
    foreach(tp = 1:time.points) %do% {
        my.y <- my.func(y, tp)
        analyse(x, my.y, n.replicates)
    }
}

Если n.time.points> n.replicates , имеет смысл распараллелить в batch.analyse , но в противном случае имеет смысл распараллелить в analysis . Есть идеи, как с этим справиться? Можно ли как-нибудь обнаружить в analysis , если распараллеливание уже произошло?

12
задан Steve Weston 27 January 2017 в 01:01
поделиться