在F#中与Map进行多线程冲突

时间:2014-01-06 02:47:54

标签: multithreading map f# parallel-processing block

let len = 25000000
let map = Map.ofArray[|for i =1 to len do yield (i,i+1)|]
let maparr = [|map;map;map;map|]
let f1 i =   
    for i1 =1 to len do
        let l1 = maparr.[i-1].Item(i1)
        ()

let index = [|1..4|]
let _ = index |> Array.Parallel.map f1
printf "done" 

我发现上面的代码只有一个核心正在全速运行。但我除了是所有四个线程正在与高水平的CPU使用一起工作。所以看起来与Map的多线程冲突,我是对的吗?如果没有,怎样才能达到我的初步目标?提前谢谢

1 个答案:

答案 0 :(得分:1)

所以我认为你正在绊倒一个启发式,当只有少量任务时库就会假设,只使用一个线程就会最快。

此代码最大化了我计算机上的所有线程:

let len = 1000000
let map = Map.ofArray[|for i =1 to len do yield (i,i+1)|]
let maparr = [|map;map;map;map|]
let f1 (m:Map<_,_>) =
    let mutable sum = 0
    for i1 =1 to len do
        let l1 = m.Item(i1)
        for i = 1 to 10000 do
            sum <- sum + 1
    printfn "%i" sum

let index = [|1..40|]
printfn "starting"
index |> Array.map (fun t -> maparr.[(t-1)/10]) |> Array.Parallel.iter f1
printf "done"

重要变化:

  1. 显着降低了len。在您的代码中,几乎所有时间都花在创建矩阵上。
  2. 实际上是在循环中工作。在您的代码中,循环可能优化为无操作。
  3. 执行更多任务。这欺骗了调度程序使用更多线程,一切都很好