0

我使用以下 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
4

1 回答 1

1

如果工作单元非常小,通常会使用自定义分区器。当遇到这个问题时,您最好切换到 Task 而不是 Async,因为它通常更适合更小但更多的工作,而 Async 更适合延迟通常更长的 IO 类型操作。

例如,您将在并行线程中按顺序批量计算。产量将根据工作单元的大小以及总项目的数量而有所不同。

您提到的任何方法都没有缩放限制。我并行化了 Black Scholes 计算,并设法在使用 Async.Parallel 的 8 核机器上获得了大约 6.8 倍。虽然不是一个完美的机制,但我在传递给 Async.Parallel 的初始序列中使用了简单的工作分工。

您确定您拥有真正的四核机器还是具有超线程的两核机器?

于 2012-10-10T01:25:41.053 回答