Многоядерный в 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
время намного превышает прошедшее (не всегда - я знаю, но практическое правило), вы, вероятно, используете более одного ядра.