2012-04-15 3 views
5

par는 다음과 같이 선언한다. par를 사용하려면 동일한 표현식을 여러 번 사용하는 것과 같이 속임수를 사용해야합니다. 그 목적은 평행 A와 B를 실행하는 경우하스켈 : 왜`파 '가 그랬는가?</p> <pre><code>par :: a -> b -> b </code></pre> <p>공지 사항, 하나는 버려되는 인수 :

, 그것은 다음과 같이 정의되어 있지 않은 이유는 (평가되지 않은) 식의 튜플 촬영과 같은 식을 반환

par :: (a, b) -> (a, b) 

?: - 그들이 동시에 잠재적으로 백그라운드 스레드에서 구체화됩니다.

후자 모델이 전자보다 단순 해 보입니다. 왜 디자인이 그렇게 선택 되었습니까?

+2

에 게으른 계산을 돌려 병렬 효과 을 평가하기 위해 잠재적으로 프로 Fi를 테이블 것으로 게으른 계산 주석을위한 메커니즘으로 생각되었다. 파로 전달한 쌍은 평가되지 않을 수 있습니다. 누가 언제 평가합니까? – augustss

답변

8

이전에, 당신은 쉽게 후자 오히려 성가신 것 두 개 이상의 계산,

c1 `par` c2 `par` c3 `par` c4 `pseq` something c1 c2 c3 c4 

을 촉발 할 수 있습니다.

이 그런 식으로 설계 한 이유에 관해서는
evalTuple2 :: Strategy a -> Strategy b -> Strategy (a, b) 

, 이 '높은 수준은 다음과 같습니다

+0

후자는 최대 8 개의 args에 대해 과부하가 걸릴 수 있으며 목록 버전도 있습니다. – usr

+0

주목할 것은, 인수 1이 버려지므로, 예제에서 c4만이 생존한다는 것을 의미합니다 (추가 트릭없이). – usr

+0

어떻게 오버로드하겠습니까? 'class par a where'와 최대 8-tuples의 인스턴스? 응. –

7

당신이 제언 tupled 버전은 유형, Control.Parallel.Strategies에 parTuple2으로 찾을 수 있습니다 '그들이 퀵 병렬 Real World Haskell에 나와있는 장 (24), 같은 : 우리가 필요하지 않은 모든 것들에 대한 우리의 코드에

이러한 변화가 두드러진다를 그렇다.

  • 사용할 코어 수.
  • 서로 통신하기 위해 어떤 스레드가 수행합니까?
  • 사용 가능한 코어간에 작업을 나누는 방법.
  • 스레드간에 공유되는 데이터와 비공개 데이터입니다.
  • 모든 참가자가 완료 될 때를 결정하는 방법. A Monad for Deterministic Parallelism, 말로우 뉴턴과 페이튼 존스 쓰기에서

: 그것은 게으름 평가와 미래 간의 오버랩에 대문자 때문에

파 연산자 매력적인 언어 설계이다. 지연 평가를 구현하려면 표현은 아직 평가되지 않았지만 값은 나중에 이 될 수 있습니다. 마찬가지로 미래는 계산이 이루어져서 값이 병렬로 평가되고 기다릴 수 있습니다. 은 따라서, 파가 내가 생각하는 버전이 더 어렵다고 미래