我使用以下PLINQ实现的并行映射函数。
let parmap f (xs:list<_>) = xs.AsParallel().Select(fun x -> f x) |> Seq.toList
我希望提高4个核心的速度,这是我无法达到的2.我发现可以进行自定义分区以提高并行性能。但我主要看过C#示例,不知道如何使用F#。以下不会改变任何东西,但我认为这是TPL使用的默认分区?我如何在这里使用不同的(静态,动态,......)分区选项?
let pmap_plinqlst_parts f (xs:list<_>) =
let parts = Partitioner.Create(xs)
parts.AsParallel().Select(fun x -> f x) |> Seq.toList
答案 0 :(得分:1)
如果工作单位非常小,通常会使用自定义分区程序。当遇到这个问题时,最好切换到Task而不是Async,因为它通常更适合更小但更多的工作量,而Async更适合IO类型操作,其中延迟通常会更长。
例如,您将在并行线程中按顺序批量计算。产量取决于工作单位的大小以及总项目数。
您提到的任何方法的缩放都没有限制。我将Black Scholes计算并行化,并使用Async.Parallel在8核计算机上获得了大约6.8x。虽然不是一个完美的机制,但我在传递给Async.Parallel的初始序列中使用了简单的分工。
您确定您拥有真正的四核机器或具有超线程的双核机器吗?