0

次の PLINQ 実装の並列マップ関数を使用します。

let parmap f (xs:list<_>) = xs.AsParallel().Select(fun x -> f x) |> Seq.toList

2 コアを超えることができない 4 コアでスピードアップを改善したいと考えています。並列パフォーマンスを改善するためにカスタム パーティショニングを実行できることがわかりました。しかし、私は主に C# の例を見てきましたが、F# で動作させる方法がわかりません。以下は何も変更しませんが、TPL で使用されるデフォルトのパーティション分割だと思いますか? ここで、さまざまな (静的、動的など) パーティション分割オプションを使用するにはどうすればよいですか?

let pmap_plinqlst_parts f (xs:list<_>) = 
    let parts = Partitioner.Create(xs)
    parts.AsParallel().Select(fun x -> f x) |> Seq.toList
4

1 に答える 1

1

通常、作業単位が非常に小さい場合は、カスタム パーティショナーが使用されます。この問題に直面した場合、Async ではなく Task に切り替えたほうがよい場合があります。これは、Async は通常、レイテンシがより長くなる IO タイプの操作により適しているため、より小規模でより多くの量の作業に適しているためです。

たとえば、並列スレッド間で計算を順番にバッチ処理します。歩留まりは、作業単位のサイズとアイテムの総数によって異なります。

あなたが言及した方法のいずれにおいても、スケーリングに制限はありません。Black Scholes の計算を並列化し、Async.Parallel を使用して 8 コア マシンで約 6.8 倍を達成しました。完璧なメカニズムではありませんが、Async.Parallel に渡される初期シーケンス間で単純な作業分割を使用しました。

真の 4 コア マシンまたはハイパー スレッディングを備えた 2 コア マシンをお持ちですか?

于 2012-10-10T01:25:41.053 に答える