首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >parallel.For函数

parallel.For函数
EN

Code Review用户
提问于 2013-12-01 20:35:56
回答 1查看 106关注 0票数 2

我在尝试增加并行性。下面的函数可以工作。为了测试目的,计算chunckLength是很好的。然而,当我分配更多的核心时,它似乎会明显减慢,这似乎是由于巨大的开销。可视化显示执行过程中的平均核心使用情况。每次运行时,该函数都会被迭代10次,其中包含10000个元素。

我对F#相当陌生(您可能可以从函数结构中看出.),所以任何关于如何优化它以便实现一些加速的建议都会非常有帮助。

代码语言:javascript
复制
let pmap_tpl_parforlb f (xs:list<_>) =
let xs_arr = xs.ToArray()
let chunkLength = xs.Length / numProc
Parallel.For(0,numProc,fun c ->
    let x = c * chunkLength
    let y = (c * chunkLength) + chunkLength
    for x in 0..y-1 do
        xs_arr.[x] <- f (xs_arr.[x])
) |> ignore
EN

回答 1

Code Review用户

发布于 2013-12-08 23:41:21

您是否尝试过不使用显式块大小?Parallel.For在引擎盖下做了一些漂亮的分块(范围分裂)和负载平衡,这通常会给它自己带来很好的性能。

换句话说,首先尝试一个更简单的解决方案,例如:

代码语言:javascript
复制
let mapInPlace (mapping : 'T -> 'T) (array : 'T[]) : unit =
    Parallel.For (0, array.Length, fun i ->
        array.[i] <- mapping array.[i])
    |> ignore

另一点--如果你在10000个元素的列表上迭代,你应该把这些列表转换成一个数组,然后调用你的迭代函数,不管你需要多少次。我怀疑重复执行列表到数组转换会损失相当大的性能。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/36467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档