R параллельная обработка с вложенными циклами - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь увеличить скорость выполнения кода ниже, но я не уверен, следует ли распараллеливать только самый внешний цикл или внешний цикл и внутренние циклы. Я работаю над Ubuntu с двумя процессорами, и я не знаю, сколько потоков будет создан каждым процессором для выполнения этой задачи, и не вызовет ли объединение многих потоков каких-либо осложнений, которые я должен знать и контролировать с помощью блокировок. Чтобы вы посоветовали?

ibrary(foreach)
library(doParallel)

nc = detectCores()
cl = makeCluster(nc, typr = “FORK”)
registerDoParallel(cl)

pts <- list(chunkSize=2)

    foreach (H in 0:HexC, .combine = “c”) %:%{
        foreach (HN in 0:HNcC,  .Combine = “c”) %dopar%{
            foreach (F in 0:FucC, .Combine = “c” ) %dopar%{
                foreach (SA in 0:SAC, .Combine = “c”) %dopar%
                    foreach (SO3 in 0:SO3C,{
                        NAmax<- sum(SA+SO3)
                        foreach (NAD in 0:NAmax, .combine = “c”) %dopar%{
                            Na_Cnt<- c(Na_Cnt, NAD)
                            SO3_Cnt<- c(SO3_Cnt, SO3)
                            SA_Cnt<- c(SA_Cnt, SA)
                            Fuc_Cnt<- c(Fuc_Cnt, F)
                            HexNAc_Cnt<- c(HexNAc_Cnt, HN)
                            Hex_Cnt<- c(Hex_Cnt, H)

                            Na_Mass<- c(Na_Mass, NAD*NaAdductMass)
                            SO3_Mass<- c(SO3_Mass, SO3*dels["SO3"])
                            SA_Mass<- c(SA_Mass, SA*dels["SA"])
                            Fuc_Mass<- c(Fuc_Mass, F*dels["Fuc"])
                            HexNAc_Mass<- c(HexNAc_Mass, HN*dels["HexNAc"])
                            Hex_Mass<- c(Hex_Mass, H*dels["Hex"])
                        }
                    }
                }
            }
        }
    }

stopImplicitCluster()
stopCluster(cl)

1 Ответ

0 голосов
/ 07 мая 2018

Есть несколько проблем с вашим кодом.Вы код вычисляете выходную переменную на основе значения этой переменной в предыдущей итерации, например:

Na_Mass<- c(Na_Mass, NAD*NaAdductMass)

Вместо этого вам нужно сделать что-то вроде этого:

Na_Mass <- foreach (NAD in 0:NAmax, .combine = “c”) %dopar%{
   return(NAD*NaAdductMas)

}

Для болеепримеры см. в документации doParallel пакетов: https://cran.r -project.org / web / packages / doParallel / vignettes / gettingstartedParallel.pdf

Что касается количества ядер процессора в вашей программебудет равен HNcC * FucC * SAC * NAmax, что, вероятно, очень большое число, и если на вашем компьютере всего 2 процессора, вы рискуете его сжечь.И в то же время каждый параллельный процесс в R не будет иметь достаточно ресурсов ЦП и будет работать значительно медленнее.Я бы распараллелил не более одного цикла.

Еще одно замечание: Этот подход для вычисления Na_cnt и других объектов в вашем цикле ОЧЕНЬ медленный с распараллеливанием или без него :

Na_Cnt<- c(Na_Cnt, NAD)

Вместо этого вы должны векторизовать :

Na_Cnt <- 0:NAmax

Аналогично:

  SO3_Cnt<- rep( SO3, NAMax+1)
  SA_Cnt<- rep( SA, NAMax+1)
  Fuc_Cnt <- rep(F, NAMax+1)
  HexNAc_Cnt <- rep( HN, NAMax+1)
  Hex_Cnt <- rep(H,NAMax+1 )

Аналогично всем остальным операторам вашего внутреннего цикла,Это будет значительно быстрее, и вам не понадобится распараллеливание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...