Всегда ли сеансы R используют одно ядро ​​ЦП, если специально не указано иное? - PullRequest
1 голос
/ 14 июля 2020

В случаях, когда требуются тяжелые вычисления, я использовал пакет doParallel для распределения работы по нескольким ядрам. Случайный пример:

  if (detectCores()-1 > 1) {
    cl <- makeCluster(detectCores()-1)
    registerDoParallel(cl)

    tdm <- DocumentTermMatrix(corpus, control = list(dictionary = Terms(tdm), removePunctuation = TRUE, stopwords = TRUE, stemming = TRUE, removeNumbers = TRUE)) 

    stopCluster(cl)
  }

Но огромное большинство (вероятно, 99,5%) кода R, который я пишу, не заключено в дополнительный код которые явно распределяют работу по> 1 ядру.

Справедливо ли предположить, что этот код работает на 1 одном ядре? Или для ответа на это потребовалось бы вникать в каждую используемую библиотеку и ее функции (например, tidyverse, data.table и c)?

Примечание: кроме некоторых экспериментов по времени, я мало знаю о как R и оборудование взаимодействуют, поэтому, если мое понимание ошибочно (например, неправильные предположения), пожалуйста, укажите.

Предпосылки

Причина, по которой это представляет большой интерес, - помочь выбрать меньшее количество ядер на более высокая тактовая частота по сравнению с большим количеством ядер при более низкой тактовой частоте; al la последний MacBook. Было бы прискорбно платить больше за «лучшие» процессоры только для того, чтобы большинство повседневных задач R выполнялись медленнее из-за более низкой тактовой частоты (при условии, что они выполняются только на одном ядре).

введите описание изображения здесь

1 Ответ

4 голосов
/ 15 июля 2020

Копирование и вставка из обсуждения Slack, которое мы только что обсуждали в другом месте:

  • Это несколько неправильно / это зависит / может быть слишком узкое представление.

  • Для начала, сам R даже использует немного OpenMP (на платформах, где это возможно).

  • Затем вы можете выбрать BLAS, который выполняет всю вашу матричную математику параллельно.

  • Далее идет клиентский код, который может быть многопоточным, что часто бывает; package data.table - это отличный и известный пример.

  • И, возможно (по крайней мере для меня), также важно: если я установил options("Ncpu"=6) на моем шестиядерном компьютере я получаю install.packages() для параллельной установки шести пакетов.

  • То же самое для make -j ...

I скажите немного больше о R и параллельных вычислениях (на разных уровнях) в этом препринте arXiv теперь в этой (платной) статье WIRE .

Теперь, наконец, вы говорите macOS. У этого есть множество других трудностей с OpenMP, для которых вы должны внимательно изучить список r-sig-ma c и, возможно, другие репозитории (опять же, data.table покрывает это). Я не использую macOS, поэтому не могу ничего сказать, кроме этого, я вижу много людей, у которых есть проблемы.

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

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