2010-08-23 2 views
4

R을 실행하기 위해 사무실에서 펜티엄 4 HT 기계를 사용 중이며 일부 코드에는 plyr 패키지가 필요합니다.이 패키지는 일반적으로 스크립트가 6-7 분 동안 기다려야합니다. 실행을 끝내고 내 프로세서가 절반 만 사용되는 것을 보았습니다.펜티엄 4 HT 기계에서 R의 멀티 코어 사용

멀티 코어 프로세서를 더 잘 활용하기 위해 R에서 멀티 코어 패키지를 사용하는 것에 대해 들어 보았습니다. 제 경우는이 용도에 적합합니까?

감사합니다.

+0

당신은 해결책을 수락 한, 나는 궁금 : 어떻게 당신이 이것을 구현하는 건가요? – Vince

+0

내가 잘못 이해했기 때문에 받아들이 기 때문에 여기에 구현할 수있는 것이 있다고 생각한다. – lokheart

답변

6

멀티 캐스팅을 수행 할 패키지가 많이 있습니다. doMPI, doSNOW, doMCdoSMP을 참조하십시오. 그것들은 병렬 처리를 실행하는 다른 프로그램 (예 : MPI/OpenMPI, 멀티 코어 패키지 ...)의 프런트 엔드입니다. Windows에서는 doSMP에 대한 좋은 경험을했지만 Linux doMC는 유망 해 보였습니다 (창에 대한 지원이 일부 있지만 "포크 (fork)"에뮬레이션에 대한 의문이 생길 수 있음).

그런데 나는 병렬 컴퓨팅의 힘을 사용하는 plyr 함수를 작성해야한다는 Vince의 의견에 동의합니다. %dopar% (foreach 패키지 참조)을 사용하는 plyr (또는 plyr 편집)을 모방하는 사용자 고유의 함수를 작성할 수 있습니다.

두 개의 "CPU 사용 내역"창은 두 개의 코어 또는 멀티 스레딩을 의미 할 수 있습니다. 예를 들어 4 개의 코어가있는 i7-920 프로세서가 있지만 각 코어가 멀티 스레드이므로 8 개의 이력 창이 표시됩니다.

내 어휘 및/또는 논리를 용서하십시오.하지만 이런 종류의 일에 관해서는 빈스의 게시물에있는 물고기가 될 것입니다.

alt text

+0

하드웨어에 대해 알고있는 Upvote ...하지만 당신 물고기를 만들까요? 내 자신의 유추에서 길을 잃었습니다 :-) – Vince

+0

덕분에, 제 생각에는 '멀티 스레딩'케이스이고 제 경우는 멀티 코어 스터디에 대한 "아니오 진행"입니다. – lokheart

+2

@lokheart no; 인텔의 "하이퍼 스레딩"은 두 개의 코어를 하나씩 에뮬레이션하는 것입니다 (첫 번째 코어가 무언가에 의해 차단 될 때 코어가 두 번째 작업을 수행함). 기본적으로 멀티 코어 (가볍지 만 여전히)입니다. 멀티 스레딩은 프로그램이 몇 가지 프로세스로 실행된다는 것을 의미하며, OS는 코어간에 동시에 실행되도록 배포 할 수 있습니다. – mbq

1

어리석은 질문처럼 들리지만 프로세서에 코어가 두 개 이상 있습니까? P4는 이해하지 못했지만 어류가 천체 물리학을 할 때 하드웨어에 관해 많은 지식을 가지고 있습니다.

"프로세스가 절반 만 사용되었습니다"라고 말하면 2 개의 코어를 모니터링하고 하나만 사용 중이거나 단일 코어를 절반 사용하고 있다는 의미입니까? 후자라면 응용 프로그램이 CPU가 아닌 메모리 바운드 (아마도 스왑 공간에 닿아있을 가능성이 높음)이므로 병렬 처리가 도움이되지 않습니다.

plyr 패키지가 multicore 패키지를 사용하는 것처럼 보이지 않으므로 병렬 처리를 위해 plyr 부분을 명시 적으로 다시 써야합니다. 그러나, plyr의 일부가 당황스럽게 평행했다면, 나는 그들이 이미 병렬화되었다고 확신합니다.

그래서 나는 당신의 문제가 CPU 바운드라고 생각하지 않는다. 나는 그것이 메모리 바인딩 (그리고 스왑)이라고 생각한다. 귀하의 메모리를 모니터하고 아마도 상위 메모리 머신으로 이동하십시오.

희망이 도움이됩니다.

편집 :

@Vince 내가 romunov의 대답에 썼던 것처럼, HT 코어는 보다 2 배 빠른 (그러나 2 코어보다 느립니다) 프로세스를 실행하므로 평행이되는 값은 입니다. 또한 메모리 바운딩 프로세스도 코어의 100 %를 차지합니다. (내 강조) 가치

평행하게? 이 방정식에 더 많은 것이 있습니다. 파이썬의 멀티 프로세싱 및 스레딩 모듈을 탐색 할 때 무수히 많은 시간을 보냈습니다. 전체 프로그램을 "쉽게 병렬화 할 수있는"경우에도 재 작성했습니다. 느리게 실행되었습니다. 왜? 새로운 스레드, 프로세스, 다른 프로세스로의 데이터 셔플 링 등을 시작하는 데 고정 된 비용이 소요됩니다. 병렬화, 내 경험에, 절대 여기에 대해 얘기되고있는 마법 총알이되었습니다. 나는이 대답들이 오도 된 것이라고 생각한다.

우선, 우리는 "6-7 분"이 걸리는 작업을 병렬 처리하는 것에 대해 이야기합니다. OP가 자신의 데이터가 커질 것이라는 것을 알지 못한다면, 병렬화는 프로그래밍에 필요한 벽시계 시간도 가치가 없습니다. 병렬 버전을 구현하는 데 걸리는 시간에는 아마도 100 개가 아닌 병렬 실행을 할 수있었습니다. 내 작업 환경에서는 벽시계가 중요합니다. 이러한 계산은 런타임 방정식에 포함되어야합니다 (학습/재미를 위해 수행하지 않는 한)

둘째, 스왑 공간에 도달하면 가장 큰 속도 저하는 CPU가 아니며 디스크 I/영형. plyr 코드를 뒤섞어서 일부 부품을 병렬 처리하는 쉬운 방법이 있더라도 I/O 바인딩 프로세스에서 그렇게하면 메모리를 추가하는 것보다 일이 빠르게 빨라질 것입니다.

예를 들어, 나는이 정확한 동작을 보여주는 변형 패키지의 명령을 한 번 실행했습니다. 멀티 코어 OS X 머신에서 4GB의 메모리를 사용하고 있었고 몇 초 만에 두 코어에서 60-70 %의 CPU를 사용하여 크롤링 (전체 컴퓨터가 크롤링 중이었습니다!)되었고 4GB의 메모리가 모두 사용되었습니다. 나는 한 시간 동안 실험을하고 R을 죽인 다음 내 기억이 3GB로 돌아가는 것을 보았다. 나는 그것을 512GB RAM 서버에 섞어서 (예, 우리는 그렇게 할만 큼 운이 좋다) 7 분 만에 끝냈다. 핵심 사용량이 변경되지 않았습니다.

+0

winxp의 작업 관리자를 사용하여 CPU 프로세스를 모니터하고 두 개의 차트가 CPU 프로세스를 기록하는 것을 볼 수있다. 두 개의 코어가 있습니다. 아마 나는 정말로 바보 같은 질문을하고있을 것이다. 다시 한번 감사드립니다. – lokheart

+0

멀티 코어는 다음과 같아야합니다. http://www.ixbt.com/cpu/images/intel-pentium-xe-955/taskman.gif – Vince

+0

"CPU 사용 내역"에 대해 2 개의 창을 가지고 있지만 커브는 아닙니다. 당신과 같은 극단적 인 사람, 상단에 3 명, 하단에 3 명씩 있습니다. 둘 다 중간에 있습니다. – lokheart

관련 문제