Многоядерный в Linux не использует несколько процессоров

Я использую R 2.14.0 64 бит на Linux. Я пошел дальше и использовал пример, описанный здесь. Я тогда запускаю пример -

library(doMC)
registerDoMC()
system.time({
r <- foreach(icount(trials), .combine=cbind) %dopar% {
  ind <- sample(100, 100, replace=TRUE)
  result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
  coefficients(result1)
} })

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

ignorant@mybox: ~/R$ ps -p 5369 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
 5369  5369   0  0.1
 5369  5371   1  0.0
 5369  5372   2  0.0
 5369  5373   3  0.0
 5369  5374   4  0.0
 5369  5375   5  0.0
 5369  5376   6  0.0
 5369  5377   7  0.0

Но в этом случае я вижу -

ignorant@mybox: ~/R$ ps -p 7988 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
 7988  7988   0 19.9
ignorant@mybox: ~/R$ ps -p 7991 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
 7991  7991   0 19.9

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

2 ответа

Решение

Вы можете попробовать выполнить ваш скрипт с помощью команды:

$ taskset 0xffff R --slave -f parglm.R

Если это решит проблему, то у вас может быть версия R, созданная с использованием OpenBLAS или GotoBlas2, которая устанавливает привязку к процессору, так что вы можете использовать только одно ядро, что является известной проблемой.

Если вы хотите запустить пример в интерактивном режиме, запустите R с:

$ taskset 0xffff R

Во-первых, вы можете посмотреть на htop, который, вероятно, доступен для вашего распространения. Вы можете ясно увидеть использование для каждого процессора.

Во-вторых, вы пытались установить количество ядер на машине напрямую?

Запустите это с htop открыть:

library(doMC)
registerDoMC(cores=12) # Try setting this appropriately.
system.time({
  r <- foreach(1:1000, .combine=cbind) %dopar% {
    mean(rnorm(100000))
  } })
# I get:
#    user  system elapsed 
#  12.789   1.136   1.860 

Если user время намного превышает прошедшее (не всегда - я знаю, но практическое правило), вы, вероятно, используете более одного ядра.

Другие вопросы по тегам