2013-08-02 3 views
2

하스켈에서 작성한 계획 알고리즘은 주어진 시간 내에 가능한 계획 세트를 평가하는 작업으로, 평가 프로세스는 임의의 금액으로 실행될 수 있습니다 점점 더 정확한 결과를 얻을 수있는 시간을 갖게됩니다. 자연스럽고 가장 효율적인 방법은 각 평가 작업에 가벼운 Haskell 스레드를 제공하고 지정된 시간 동안 잠자기 후에 주 스레드가 결과를 수집하도록하는 것입니다.하스켈에서 스레드 간의 CPU 시간 분포를 보장합니다.

실제로는 항상 하나 또는 두 개의 스레드가 사용 가능한 전체 시간 동안 CPU 부족 상태가됩니다. 실행을 제어하기위한 세마포어/실험에 대한 내 자신의 실험은 주어진 스레드가 강제로 실행을 멈추게 할 수 없으므로이를 수정하는 것이 놀랍도록 어려웠습니다 (Control.Concurrent에서 "yield"사용 포함).

얼마나 많은 수의 Haskell 쓰레드 (OS 쓰레드가 아닌)가 각각 벽 시계 시간 (대략 짧은 시간)에 걸쳐 거의 균등 한 CPU 시간을 갖도록하는 좋은 방법이 있습니까? 그렇게하지 않으면 모든 코어가 사용되는 것과 같이 주어진 수의 코어에서 똑같은 반복을 실행하는 많은 스레드가 공정하게 "교대로 돌아갈"것을 보장하는 좋은 방법입니까?

+0

스레드를 중앙 스케줄링 스레드로 자주 체크인 할 수 있습니까? 예를 들어, 1000 회 반복마다 그런가요? –

+2

협력 스레드 구현 [여기] (http://www.haskellforall.com/2013/06/from-zero-to-cooperative-threads-in-33.html)을 살펴보십시오. 이'Thread's들 중 많은 것들을 동시에 평가할 수도 있습니다. – cdk

+1

스레드간에 공유 된 값이 평가되는지 확인하십시오 ([NF] (http://hackage.haskell.org/packages/archive/deepseq/latest/doc/html/Control-DeepSeq.html#t:NFData), 예를 들어). 각 스레드가 얼마나 많은 CPU 시간을 사용하는지 정확하게 측정합니까? –

답변

3

AFAIK, 하스켈 스레드는 모두 이어야합니다. 모두은 모두 적극적으로 작업을 수행하는 동안 대략 동일한 양의 CPU 성능을 수신해야합니다. 유일한 이유는 입출력 호출을 차단하기 시작하거나 각 스레드가 수 밀리 초 동안 만 실행되는 경우입니다.

아마도 실제로 볼 수있는 문제는 각 스레드가 분할 된 초 동안 만 실행되어 그 결과로 평가되지 않은 표현을 생성한다는 것입니다. 그러면 메인 스레드가 자체 평가합니다. 이 경우 주 스레드가 모든 CPU 시간을 확보하고있는 것처럼 보입니다.