2013-04-12 2 views
11

ST-Monad에서 두 개의 계산을 병렬로 실행하는 방법을 찾고 있습니다. STUArray를 사용하여 다소 큰 배열을 만들고 있는데 병렬로 처리하고 싶습니다. 그것은 순수한 코드와 IO 모나드와 두 번째 거래를 다루는으로하스켈의 병렬 모나드지도? parMapM과 같은 것?

지금까지 내가 찾은 thisthis Q & A는 여기에 유래에, 그러나 첫 번째는, 내 경우에는 적용되지 않습니다 -하지만 난에서 오전 국가 스레드.

또한 monad-parallel 패키지를 찾았지만, ST에 대해서는 'MonadParallel'의 인스턴스가 있어야합니다. 또한 monad-par 패키지는 순수한 연산 또는 IO 모나드 만 지원합니다.

ST 내부에서 병렬 모나드 계산을 수행 할 수있는 방법이 있습니까?

+1

병렬로 큰 배열을 작성하는 것이 ST가 아닌 순수한 코드에서 가장 잘 수행되는 것처럼 들립니다. 각 셀에 넣으려는 항목과 ST를 사용하려는 이유에 대한 정보를 조금 더 제공 할 수 있다고 생각하지 않습니까? 문제가 생길 수 있습니다. 예를 들어, 각 셀에 대한 ST 모나드에서 별도의 동작을 실행하는 경우 IO가 IO와 달리 병렬로 만들어지지 않을 수 있습니다. ST는 실제로 스레드 간의 통신을위한 프리미티브를 제공하지 않습니다. – DarkOtter

답변

7

우선, 질문 중 두 단어로 병렬 및 배열 - repa을 살펴 보시기 바랍니다. 또한이 프로젝트와 함께 some great people involved이 있으니, 하스켈로드에서 다음으로 큰 이정표가 될 것이므로, Data Parallel Haskell을 확인해야합니다.

귀하의 특정 질문에 관해서는 IO 모나드 (이미 monad-parallelasync with mapConcurrently으로 명명 됨)와 정확히 묻는대로 할 수있는 라이브러리가 있습니다. stToIO을 사용하여 IO (으)로 탈출을 시도하셨습니까? 이 ST의 인스턴스가 MonadBaseControl, 작업 할 표준 버전을 확장되는 lifted-async 라이브러리, 또한, 그래서 당신은 아마 mapConcurrently의 그 버전을 사용하거나 적어도 자신을 구현하는 데 영감을 사용할 수 있습니다

.

3

ST 모나드를 안전하게 병렬 처리 할 수 ​​있는지, 심지어 모나드의 계산이 이전 계산 결과 인 상태에 따라 다르므로 보통 모나드를 이해하는 것이 맞는지 확실하지 않습니다.

그러나 목록에서 배열을 만들고 목록을 쉽게 만들 수 있습니다. parallel 패키지의 parMap과 같은 형식으로 입력하십시오.

배열 데이터를 만드는 방법에 대해 더 자세히 설명하면 더 나은 답변을 얻을 수 있습니다.

+0

당신은 확실히 그것을 병렬 처리 할 수 ​​있습니다. 프로그래머가 비 결정론을 처리 할 수 ​​있습니다. –