2012-05-16 4 views
4

Doubles의 콜렉션 (간단히하기 위해 목록이라고 함)을 포함하는 데이터 구조에 대해이 순차적 절차를 고려하십시오. 한 나는 느낌처럼 들어 :동시성을 통한 시뮬레이션 성능 향상

  1. 선택 두 개의 서로 다른 목록을 구조에서 임의
  2. 에서 그 목록을 기반으로 통계를 계산
  3. 그 통계를 기반으로 동전을 플립
  4. 아마도 수정 동전 던지기의 결과에 근거한 목록 중 하나

목표는 결국 무언가에 수렴을 달성하는 것이므로 '해결책'은 반복 횟수가 선형입니다. 이 절차의 구현은 SO 여기 here에 의문을 제기하고에서 볼 수있는 것은 직관적 인 시각화 :

sequential vis

은이 절차를 더 잘 수행 할 수 있다는 것 - 즉, 융합이 빠르게 얻을 수있는 -에 의해 별도의 OS 스레드에서 동시에 실행되는 여러 노동자를 사용, 예 :

concurrent vis

나는이의 완벽-실현 구현에 솔루션을 달성 할 수있을 것 같아요 O (N/P) 시간, P은 사용 가능한 컴퓨팅 리소스의 수입니다. 하스켈 동시성에 최대 읽기

는 같은 조건을 내 머리 회전을 떠난 MVar, TVar, 분명한 것 같습니다 것은이 절차의 동시 구현이 the one I linked above 매우 다를 것입니다 등 TChan, acid-state. 그러나 프로 시저 자체는 근본적으로 인 메모리 데이터베이스에 관한 꽤 길들인 알고리즘 인 것으로 보이는데, 이는 누군가가 전에 우연히 만났던 문제라고 생각합니다.

나는 내가 & 수정 (임의 유휴 요소 즉,) 괜찮은 랜덤 액세스를 지원 변경 가능, 동시 데이터 구조의 어떤 종류를 사용해야 할 것 같은데요. 성능 향상을 위해 필요한 모든 것을 함께 모으려고 할 때 약간의 손실이 발생합니다 (예 : STM이 모호한 것처럼 보임).

목표가 순차적 구현보다 성능이 향상되는 경우 이러한 유형의 작업에 적합한 데이터 구조, 동시성 개념 등은 무엇입니까?

+0

'MVars'보다 덜 고통스러운 'STM'을 사용하여 감았습니다. 일부 코드의 스냅 샷은 http://hpaste.org/69045입니다. 매우 많은 수의 반복을 사용하지 않는다면 순차 구현을 이길 수는 없지만 구현하기가 얼마나 쉬운 지 놀라게되었습니다. – jtobin

답변

4

간단하게 : 경량, 슈퍼 싼 스레드

  • forkIO.
  • MVar, 빠른 스레드 안전 공유 메모리.
  • 하고 적절한 순서 유형
  • 좋은 stats 패키지
  • 및 빠른 난수 소스 (예를 들어, (아마 vector는 어쩌면 만약 당신이 단지 앞에 추가 나열)mersenne -random-pure64)

나중에 애호가들을 시도해 볼 수 있습니다. 원시 성능을 위해 먼저 잠금을 해제하십시오 (예 : 버퍼 당 하나). 코드를 컴파일하고 스레드 런타임 (ghc -O2)을 사용하십시오. 그러면 좋은 시작을해야합니다.

RWH에는 동시 Haskell의 cover the basics에 대한 소개 장이 있습니다.

+0

푸시 주셔서 감사합니다. 필자가 사용할 수있는 모든 '애호가'가 있다는 것을 인정하면서, 나는 동시성의 기본을 어떻게 생각하는지 피하는 것이었다. 나는 만족스러운 구현을 할 때이 질문을 업데이트 할 것이다. – jtobin