2010-06-10 3 views
58

Haskell에서 다중 스레드 응용 프로그램을 만드는 것이 표준 Haskell 응용 프로그램을 사용하고 -threaded 플래그로 컴파일하는 것만 큼 쉽다는 이야기를 들었습니다. 그러나 다른 경우에는 par 명령을 실제 소스 코드 내에서 사용하는 방법을 설명했습니다.하스켈 멀티 스레딩은 얼마나 어렵습니까?

하스켈 멀티 스레딩의 상태는 어떻습니까? 프로그램에 소개하는 것이 얼마나 쉬운가요? 이 다른 명령과 용도를 다루는 좋은 멀티 스레딩 자습서가 있습니까?

+0

나는 Simon Marlow가 작성한 Haskell *의 병렬 및 동시 프로그래밍이 일반적으로이 주제에 대한 최고의 소개로 간주됩니다. –

답변

61

하스켈 멀티 스레딩의 상태는 무엇입니까 Concurrency category에서 Software Transactional Memory (STM) 및 많은 다른 사람을 참조?

성숙한. 구현은 약 15 년이며 트랜잭션 메모리는 5 년입니다. GHC는 널리 사용되는 컴파일러로 대규모 오픈 소스 지원 및 상업용 백업을 제공합니다.

프로그램에 얼마나 쉽게 도입 할 수 있습니까?

이것은 알고리즘에 따라 다릅니다. 때로는 병렬 처리를 위해 par을 한 행 사용할 수 있습니다. 때때로 새로운 알고리즘이 개발되어야합니다. 일반적으로 Haskell에서 안전한 병렬 처리와 동시성을 일반적인 언어보다 쉽게 ​​도입 할 수 있으며 성능이 좋습니다.

다른 명령과 사용법에 대한 좋은 멀티 스레딩 자습서가 있습니까?

하스켈에는 3 가지 주요 병렬 및 동시 프로그래밍 모델이 있습니다.DPH 라이브러리

이를 통해 forkIO/MVars 및 소프트웨어 트랜잭션 메모리

  • 데이터 병렬 처리를 통해 par
  • 명시 적 동시성과 병렬 처리를 통해

    • 암시 병렬 주요 것들입니다. 모든 경우에 -threaded로 컴파일하여 멀티 코어 런타임을 사용하지만 특정 문제를 병렬 처리하는 것이 얼마나 쉬운지는 사용하는 알고리즘과 해당 목록에서 채택한 병렬 프로그래밍 모델에 따라 다릅니다.

      여기는 an introduction to the main parallel programming models in Haskell,이며 어떻게 속도 향상을 달성 할 수 있습니까?

      나는 Chapter 24 of Real World Haskell이 좋은 자습서라고 생각합니다.

  • 16

    동시성 용어도 있습니다. 코드에서 변경하여 하스켈 RTS는 일부 내부 프로세스를 사용하려고하지만 응용 프로그램에서 사용하는 당신이 b의 caculation에 너무 게으른하지 될 하스켈을 강제 par b (f a b)에 의해 이루어집니다 힌트를 제공해야없이

    f에 결과가 필요하지 않은 경우

    모든 인수 (예 : a+b)가 필요하지 않은 이유 중 하나는 동기화 (일정 계산 및 결과 기다리기)가 약간의 오버 헤드를 발생시키고, 곱셈을 병렬로 계산할 수 있기 때문에 (2*3)+(3*4)에 틱합니다. 또한 캐시 히트 (cache-hits) 또는 단일 프로세서에서 수행 할 때 수행되는 최적화 또는 최적화 (예 : 한 프로세서에서 다른 프로세서로 결과 전달)가 느슨한 경우가 있습니다.

    물론 코드 par을 사용하는 것은보기 싫지만 목록이나 일부 다른 데이터 구조를 간단한 하위 요소로 접을 때 오버 헤드/계산을 확실히하기 위해 해당 가벼운 요소의 일부 청크를 계산할 수 있습니다. 정말 작다. 이 문제를 해결하려면 parallel을 참조하십시오.

    DPH (Data Parallel Haskell)도 있습니다.

    프로그램이 IO Monad에 관한 것보다 많은 변경이 필요합니다. , forkIO

    관련 문제