2017-12-29 31 views
1

각각 8 개의 물리적 코어가 포함 된 두 개의 CPU가있는 단일 Linux 컴퓨터에서 R 스크립트를 실행하려고합니다. R 코드는 detectCores()을 통해 자동으로 코어 수를 확인하고이 수를 1 줄이고 makePSOCKcluster 명령에 구현합니다. 성능 매개 변수에 따르면 R은 CPU와 하이퍼 스레 드 중 하나만 사용합니다. 두 번째 CPU에 작업 부하가 분산되지 않습니다.R : makePSOCKcluster hyperthreads CPU 코어의 50 %

detectCores(logical = FALSE)으로 지정하는 경우 첫 번째 CPU의 부담은 작지만 두 번째 CPU는 여전히 비활성 상태입니다.

어떻게 수정합니까? 전체 인프라가 단일 시스템에 있으므로이 경우에는 Rmpi이 필요하지 않습니다.

FYI : R 스크립트는 패키지에 의존하는 foreach 루프로 구성됩니다.

+0

**'lstopo' **에서보고 한 바와 같이 실제 하드웨어 NUMA 발견 프로세스의 결과물을 게시 하시겠습니까? – user3666197

답변

0

makeCluster()을 사용하고 작업 \ 작업자 목록으로 클러스터 유형 및 길이를 정의하십시오.
그것은 나를 위해 작동하고 다른 코어 \ 프로세스에서 각 작업을 실행합니다.
foreach을 사용하는 것뿐만 아니라 각 작업을 별도로 재정의하는 것이 좋습니다 (가능한 경우). 여기

내가 목록에서 순서에 따라 각 코어의 모든 결과의 목록을 것입니다,
밖으로의 결과를 사용하고 무엇의 예입니다.

tasks = list(task1,taks2, ...) 
cl = makeCluster(length(Tasks), type = "PSOCK") 
clusterEvalQ(cl,c(library(dplyr),library(httr))) 
clusterExport(cl, list("varname1", "varname2"),envir=environment()) 
out <- clusterApply(
     cl, 
     Tasks, 
     function(f) f() 
    ) 
+0

중첩 된'foreach' 루프를 8000 개 이상의 인터럽트와 함께 사용합니다. 각각의 인터럽트는 래스터 파일을 생성합니다. 따라서 근로자보다 많은 업무가 있습니다. 각 래스터 파일은 서로 다른 모양 파일과 더 큰 래스터 파일을 사용합니다. 그것은 루프에서 모델링하기는 쉽지만 위에 언급 된 설계에서는 실현 가능하지 않은 것처럼 보입니다. – Christian

1

해결책은 제 경우에는 snow에 의존하지 않아야합니다. 대신 mpirun으로 R 스크립트를 실행하고이 명령이 외부 R에서 병렬 환경을 관리하게하십시오. doSNOW은 그에 따라 doMPI으로 바꿔야합니다.

이렇게 설정하면 두 CPU가 모두 적절하게 활용됩니다.