在F#中达到100%CPU使用率的最简单方法是什么?

时间:2018-08-05 11:56:28

标签: performance f# cpu-usage

有时候我写一些我希望能够完全饱和CPU的代码。 例如,要计算Mandelbrot集,您可以使用如下代码:

    type MandelbrotPoint =
        |Escaped of int
        |NotEscaped

    let getIterationCount maxIters (c:Complex) =
        let rec innerFunction iters (z:Complex) =
            match z.Magnitude, iters with
            |m, i when m > 2.0 -> Escaped i
            |_, i when i > maxIters -> NotEscaped
            |_ -> innerFunction (iters + 1) (z * z + c)
        innerFunction 0 c

    let getIterationCounts (topLeft:Complex) pixelWidth pixelHeight realWidth =
        let xGap = realWidth / ((pixelWidth - 1) |> float)

        [|for iY in 0 .. (pixelHeight - 1) do
                for iX in 0 .. (pixelWidth - 1) do
                    yield Complex(topLeft.Real + xGap * (float iX), topLeft.Imaginary - xGap * (float iY))
        |]
        |> Array.Parallel.map (getIterationCount 1000)

天真的,我希望它能以接近100%的速度运行直到完成,但它会反弹约25%至60%。

我得到的是,计算经常受到数据移入和移出CPU缓存所花费的时间的限制,但这不是问题吗?有很多数据要移动,只是一个简单的迭代计算,不是吗?

1 个答案:

答案 0 :(得分:1)

在我的4核8线程CPU上,以下朴素的代码片段通过FSI进程的CPU饱和度确实接近100%:

let consume (x: int) =
    while true do
        let  _ = x*x
        ()

[|0..7|] |> Array.Parallel.iter consume

enter image description here