私は、Strategiesを使って並列Haskellプログラムを書いています。それは何をやろうとしているのではなく、どのHaskell Execution Context(HEC)関数が実行されているかを調べたいと思います。Haskellでの関数の現在のHECを確認する
デバッグ出力で使用できるgetHEC呼び出しなどがありますか?
私は、Strategiesを使って並列Haskellプログラムを書いています。それは何をやろうとしているのではなく、どのHaskell Execution Context(HEC)関数が実行されているかを調べたいと思います。Haskellでの関数の現在のHECを確認する
デバッグ出力で使用できるgetHEC呼び出しなどがありますか?
Control.Concurrent
からthreadCapability
を呼び出すと、Haskellスレッドが実行されている機能(CPUコア)を確認できます。
あなたが+RTS -N
であなたのプログラムを実行している場合、1 OSレベルのスレッド(HEC)が存在しますが、コアごとに生み出され、そのthreadCapability
によって返された能力数は、あなたのforkIO
緑のスレッドが実行されているスレッドいるOSを教えてくれます。しかし、+RTS -Nn
というOSスレッドの数を明示的に指定している場合、n
はシステムのコア数以外の整数ですが、これはあまり有用ではないでしょう。
ThreadScopeは、並列プログラムの実行をデバッグして視覚化するのに便利です。
これは私が欲しかったものです。ありがとうございました! – Jonatan
もう1つ言及しておきたいことは:OSはスレッドを別のコアに再スケジューリングすることが自由であるため、同じHaskellスレッドで2回呼び出される 'threadCapability'は異なる値を返す可能性が少なく、呼び出しの間に経過します。 'forkIO'ではなく' forkOn'でスレッドを生成することで、特定のコアにスレッドをロックすると、デバッグの目的でこれを避けることができます。 – bitbucket