2012-04-11 8 views
5

私は、Strategiesを使って並列Haskellプログラムを書いています。それは何をやろうとしているのではなく、どのHaskell Execution Context(HEC)関数が実行されているかを調べたいと思います。Haskellでの関数の現在のHECを確認する

デバッグ出力で使用できるgetHEC呼び出しなどがありますか?

答えて

4

Control.ConcurrentからthreadCapabilityを呼び出すと、Haskellスレッドが実行されている機能(CPUコア)を確認できます。

あなたが+RTS -Nであなたのプログラムを実行している場合、1 OSレベルのスレッド(HEC)が存在しますが、コアごとに生み出され、そのthreadCapabilityによって返された能力数は、あなたのforkIO緑のスレッドが実行されているスレッドいるOSを教えてくれます。しかし、+RTS -NnというOSスレッドの数を明示的に指定している場合、nはシステムのコア数以外の整数ですが、これはあまり有用ではないでしょう。

ThreadScopeは、並列プログラムの実行をデバッグして視覚化するのに便利です。

+0

これは私が欲しかったものです。ありがとうございました! – Jonatan

+1

もう1つ言及しておきたいことは:OSはスレッドを別のコアに再スケジューリングすることが自由であるため、同じHaskellスレッドで2回呼び出される 'threadCapability'は異なる値を返す可能性が少なく、呼び出しの間に経過します。 'forkIO'ではなく' forkOn'でスレッドを生成することで、特定のコアにスレッドをロックすると、デバッグの目的でこれを避けることができます。 – bitbucket

関連する問題