有时候我写一些我希望能够完全饱和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缓存所花费的时间的限制,但这不是问题吗?有很多数据要移动,只是一个简单的迭代计算,不是吗?