2

私は Haskell で書かれた計画アルゴリズムを持っています。これは、与えられた時間内に一連の可能な計画を評価する任務を負っています。評価プロセスは、任意の時間実行して、ますます正確な結果を生成することができます。これを行うための自然で最も効率的な方法は、各評価タスクに独自の軽量 Haskell スレッドを与え、指定された時間スリープした後にメインスレッドに結果を収集させることです。

しかし実際には、常に 1 つまたは 2 つのスレッドが、使用可能な時間全体にわたって CPU 不足になります。実行を制御するためのセマフォなどを使用した私自身の実験では、特定のスレッドの実行を強制的に停止することはできないように見えるため、これを修正するのは驚くほど難しいことが示されています (Control.Concurrent から「yield」を使用することを含む)。

任意の数の Haskell スレッド (OS スレッドではない) がそれぞれ (かなり短い) 壁時計時間のスパンでほぼ均等な量の CPU 時間を確実に受け取るようにする、よく知られた方法はありますか? それができない場合、すべてのコアが使用されるように、同じ反復を実行する多数のスレッドが所定の数のコアで公平に「交代」することを保証する良い方法はありますか?

4

1 に答える 1

3

私の知る限り、Haskell スレッドはすべて、アクティブに作業を行おうとしている限り、ほぼ同じ量の CPU パワーを受け取るはずです。起こらない唯一の理由は、ブロッキング I/O 呼び出しを開始した場合、または各スレッドが数ミリ秒程度しか実行されない場合です。

おそらく、あなたが目にしている問題は、実際には各スレッドがほんの一瞬だけ実行され、その結果として未評価の式が生成され、メインスレッドがそれ自体を評価するということでしょうか? その場合、メイン スレッドがすべての CPU 時間を取得しているように見えます。

于 2013-08-03T06:57:37.153 に答える