2013-04-03 2 views
1

Я использую R 2.14.0 64 бит в Linux. Я пошел дальше и использовал пример, описанный here. Затем я запускаю пример:multicore on 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) 
} }) 

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

[email protected]: ~/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 

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

[email protected]: ~/R$ ps -p 7988 -L -o pid,tid,psr,pcpu 
    PID TID PSR %CPU 
7988 7988 0 19.9 
[email protected]: ~/R$ ps -p 7991 -L -o pid,tid,psr,pcpu 
    PID TID PSR %CPU 
7991 7991 0 19.9 

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

+0

Что с использованием 1 ядро? Оригинальная сессия R? Ищите дополнительные экземпляры 'rsession' вместо этого. На первой странице связанного документа «... многоядерная функциональность запускает своих работников с использованием fork без последующего exec ...». 'fork' создает новый процесс, а не новый поток в существующем процессе. –

+0

Это возможный дубликат http://stackoverflow.com/questions/12924698/parallel-processing-in-r-limited – cbeleites

+0

@cbeleites: Я согласен. Фактически, я отметил это как дублирующее несколько дней назад. –

ответ

4

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

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

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

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

$ taskset 0xffff R 
4

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

+1

'top' также показывает использование каждого процессора. Нажмите клавишу «1». –

+1

@MatthewLundberg Nice. Я нахожу, что 'htop' немного приятнее. – nograpes

+0

попробовал это, но, к сожалению, используется только одно ядро. Я использовал top -> 1 для проверки, а также ps. Я знаю, что могу использовать снег и т. Д., Но тогда он сделает копии данных, что очень дорого в моем случае – ignorant

 Смежные вопросы

  • Нет связанных вопросов^_^