58

필자는 동시성과 병렬성에 관한 장 "Real World Haskell"을 읽었습니다.하스켈 경량 쓰레드 오버 헤드와 멀티 코어에서의 사용

하스켈 스레드, 이것은 그들 중 많은 (같은 1000)을 생성하는 것이 하나의 "진짜"OS 스레드 내부 정말 그냥 여러 개의 "가상"스레드를 의미합니까 때문에
  • 는이 없습니다 다음과 같이 내 질문은 성능에 큰 영향을 미칩니 까? 즉, forkIO으로 하스켈 스레드를 생성 할 때 발생하는 오버 헤드는 (거의) 무시할 만하다고 말할 수 있습니까? 가능한 경우 교훈적인 예를 가져와주십시오.

  • 경량 스레드의 개념은 멀티 코어 아키텍처의 이점을 사용하지 못하게합니까? 이해할 수 있듯이 두 Haskell 쓰레드는 운영 체제의 관점에서 볼 때 실제로 하나의 단일 쓰레드이기 때문에 2 개의 개별 코어에서 동시에 실행하는 것은 불가능합니다. 또는 하스켈 런타임은 여러 CPU를 사용할 수 있도록하기 위해 몇 가지 똑똑한 기술을 사용합니까?

+1

도 참조 http://stackoverflow.com/questions/3063652/whats-the-status-of-multicore-programming-in-haskell –

+0

또한 HTTP ://stackoverflow.com/questions/1920805/python-ruby-haskell-do-they-provide-true-multithreading/1925211#1925211 –

답변

82

GHC의 런타임은 수십억 개의 스파크, 수천 개의 경량 스레드를 지원하는 실행 환경을 제공하며 여러 하드웨어 코어에 분산 될 수 있습니다. -threaded으로 컴파일하고 +RTS -N4 플래그를 사용하여 원하는 코어 수를 설정하십시오.

sparks/threads/workers/cores

특히 :

이가 (1000 등)들을 많이 만들면 성능에 급격한 영향을 미치지 것을 의미합니까?

물론, creating 1,000,000 of them이 가능합니다. 1000은 너무 싸기 때문에 나타나지도 않습니다. GHC is very, very good 인 "스레드 링"과 같은 스레드 생성 벤치 마크에서 확인할 수 있습니다.

경량 스레드의 개념은 멀티 코어 아키텍처의 장점을 사용하지 못하게합니까?

전혀. GHC has been running on multicores부터 2004 년까지멀티 코어 런타임의 현재 상태는 tracked here.

입니다. 어떻게 동작합니까? 이 아키텍처를 읽을 수있는 가장 좋은 장소는 신문에 "Runtime Support for Multicore Haskell"입니다 :

GHC 런타임 시스템이 지원하는 운영 체제 스레드의 소수, 각각의 물리적 CPU에 대한 약 한 위에 그 다중화하여 경량 스레드 수백만 . ...

하스켈 스레드는 운영 체제 집합 인 스레드 (우리는 작업자 스레드라고 함)에 의해 실행됩니다. 우리는 물리적 CPU 당 약 한 작업자 스레드를 유지하지만, 정확히 어떤 스레드 는 순간 순간부터 다를 수 있습니다 노동자 ... 작업자 스레드가 변경 될 수 있기 때문에

, 우리는 각각 정확히 하나의 하스켈 실행 컨텍스트 (HEC) 유지 CPU. , via threadscope. 현대 건설은 OS 작업자 스레드 당신은 당신의 스레드가 생성되는 모니터링 할 수 있습니다

스레드 하스켈을 실행하기 위해 필요한 모든 데이터를 포함하는 데이터 구조입니다, 그들은 실행하는 경우. 여기서, 예를 들어. 이진 나무 벤치 마크를 실행 :

threadscope

+0

포괄적 인 답변과 특히 멀티 코어 하스켈에 대한 논문을 참조 해 주신 것에 대해 감사드립니다. –

14
  • 워프 웹 서버는 광범위하게 really good performance를 얻기 위해 이러한 경량 스레드를 사용합니다. 다른 하스켈 웹 서버들도 경쟁을 연기합니다. 이것은 "하프켈이 좋다"는 것보다 "워프가 좋다"라는 것입니다.

  • 하스켈은 여러 시스템 스레드에 경량 스레드를 배포 할 수있는 다중 스레드 런타임을 제공합니다. 최대 4 코어까지 매우 잘 작동합니다. 과거에는 성능 문제가 있지만 적극적으로 다루어지고 있습니다.

+3

언급 한> 4 코어에 대한 성능 문제와 관련하여 참고 자료가 있습니까? –

+0

게시 된 문서 없음, 아니요. 나는 개인적인 경험을 통해이 문제를 알고 있으며 Johan이 그들이 그것에 대해 연구하고 있다고 언급 한 것을 믿는다. 너무 막연해서 미안해. –

+1

나는 약간 회의적이다. 예 : Simon의 최근 논문에서의 속도 향상 : http://i.imgur.com/rWb7l.png - 이것으로부터 .pdf http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel/ monad-par.pdf - 동시 수집 및 데이터 병렬 논문에서 유사한 결과가보고됩니다 (일부 문제는 32 또는 48 코어 표시까지 확대). –

4

1000 프로세스를 생성하는 것은 상대적으로 가볍습니다. 그것을하는 것에 대해 걱정하지 마십시오. 성능 측면에서 벤치마킹 만하면됩니다.

앞서 지적한 것처럼 다중 코어는 정상적으로 작동합니다. 몇몇 Haskell 쓰레드는 다른 OS 쓰레드에서 스케쥴링되어 동시에 실행될 수있다.