Подтвердить что ты не робот

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

У меня четырехъядерный ноутбук под управлением Windows XP, но, глядя на Task Manager R, только когда-либо кажется, что он использует один процессор за раз. Как я могу заставить R использовать все четыре процессора и ускорить мои программы R?

4b9b3361

Ответ 1

У меня есть базовая система, которую я использую, когда я распараллеливаю свои программы на петлях "for". Этот метод прост, если вы поймете, что нужно сделать. Он работает только для локальных вычислений, но это похоже на то, что вам нужно.

Вам понадобятся эти библиотеки:

library("parallel")
library("foreach")
library("doParallel")

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

cl <- makeCluster(detectCores() - 1)
registerDoParallel(cl, cores = detectCores() - 1)

Затем вызовите цикл for с командой "foreach" вместе с оператором% dopar%. Я всегда использую оболочку "try", чтобы гарантировать, что любые итерации, в которых выполняются операции, будут отброшены и не будут нарушать хорошие данные. Вам нужно будет указать параметр ".combine" и передать все необходимые пакеты в цикл. Заметим, что "i" определяется знаком равенства, а не "in" -оператором!

data = foreach(i = 1:length(filenames), .packages = c("ncdf","chron","stats"),
               .combine = rbind) %dopar% {
  try({
       # your operations; line 1...
       # your operations; line 2...
       # your output
     })
}

Как только вы закончите, очистите:

stopCluster(cl)

Ответ 3

Начиная с версии 2.15, R теперь имеет встроенную поддержку многоядерных вычислений. Просто загрузите параллельный пакет

library("parallel")

и проверьте соответствующую виньетку

vignette("parallel")

Ответ 4

Я слышал, что REVolution R поддерживает лучшую многопоточность, тогда типичная CRAN-версия R и REvolution также поддерживает 64-битное R в окнах, Я подумываю о покупке копии, но я нашел, что их цена непрозрачна. На своем веб-сайте нет прайс-листа. Очень странно.

Ответ 5

Я считаю, что пакет multicore работает на XP. Он дает некоторые базовые возможности многопроцессорности, особенно благодаря предлагаемой замене на lapply() и простой способ оценить выражение в новом потоке (mcparallel()).

Ответ 6

В Windows я считаю, что лучший способ сделать это, вероятно, будет с foreach и снегом, как сказал Дэвид Смит.

Однако системы на основе Unix/Linux могут вычислять, используя несколько процессов с пакетом multicore. Он обеспечивает высокоуровневую функцию "mclapply", которая выполняет проверку списка в нескольких ядрах. Преимущество пакета "multicore" заключается в том, что каждый процессор получает частную копию глобальной среды, которую он может изменять. Первоначально эта копия является просто указателем на глобальную среду, что делает обмен переменной чрезвычайно быстрым, если глобальная среда рассматривается как доступная только для чтения.

Rmpi ​​требует, чтобы данные были явно переданы между R-процессами вместо работы с методом "многоядерного" закрытия.

- Дэн

Ответ 7

Если вы выполняете много операций с матрицами и используете Windows, вы можете бесплатно установить revolutionanalytics.com/revolution-r-open, и этот Intel MKL, которые позволяют выполнять многопоточные операции с матрицами. В Windows, если вы берете файлы libiomp5md.dll, Rblas.dll и Rlapack.dll из этой установки и перезаписываете их в любой R-версии, которую вы хотите использовать, вы будете иметь многопоточные матричные операции (как правило, вы получаете ускорение 10-20 x для матричных операций). Или вы можете использовать Atlas Rblas.dll из prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64, который также работает на 64-битном R и почти так же быстро, как и MKL. Я нашел это единственное, что можно было сделать, чтобы резко увеличить производительность R в системах Windows. Не уверен, почему они не являются стандартными на самом деле при установке R Windows.

В Windows многопоточность, к сожалению, не поддерживается в R (если вы не используете OpenMP через Rcpp) и доступный Распараллеливание на основе SOCKET в системах Windows, например через параллельный пакет, очень неэффективен. На POSIX-системах все лучше, так как вы можете использовать forking там. (package multicore есть, я считаю, самый эффективный). Вы также можете попробовать использовать пакет Rdsm для многопоточности в модели с общей памятью. У меня есть версия на моем github, которая имеет unflagged -unix только флаг и должна работать также и в Windows (ранее Windows не поддерживалась как зависимость bigmemory предположительно не работал в Windows, но теперь, похоже, он делает):

library(devtools)
devtools::install_github('tomwenseleers/Rdsm')
library(Rdsm)