如何在Windows Server 2008上实现100%的CPU使用率

时间:2014-01-02 05:41:57

标签: multithreading f# parallel-processing cpu-usage

我需要运行一个非常时间的成本计划。该程序由多线程组成。但是当我在我的服务器上运行它(Windows Server 2008,cpu-E5 2680)时,它与我的PC具有相同的性能,只是速度提升很少。

所以我做了一个用于测试的Fib函数,我希望使用所有内核同时运行这个Fib函数,并且CPU使用率接近100%。

let rec fib n =
    if n> 450 then 10
    else fib (n+1) + fib (n+2)

let intial (x:BackgroundWorker) =
    x.DoWork.Add(fun e ->
    ignore(fib 1)
    )

    x.RunWorkerCompleted.Add(fun e ->())
    x
let arr = [|for i = 0 to 7 do yield new BackgroundWorker()|]  
let _ = arr |> Array.map intial
while true do
    let res =arr |> Array.map (fun e ->
                if e.IsBusy then
                    ()
                else
                    e.RunWorkerAsync())
    ()

当我只设置一个线程时,一个核心将达到100%的使用率。这确实有意义。但是当尝试增加线程数量时。它表明当线程数增加时CPU使用率会降低。例如,当我使用8个线程时,将有8个CPU工作,使用率约为50%,另一个似乎是“While”部分的线程。其他人似乎没有工作。

那么这里有什么问题?我真的需要一个可以用高CPU使用率进行并行计算的演示。

1 个答案:

答案 0 :(得分:0)

您的程序很可能受到切换线程成本的限制 - 它的工作量很少。在线程上开始工作的调用是最好的数千个周期的10个案例。通过比较计算20的斐波那契是微不足道的。

请记住斐波那契序列变得非常大,非常快。到达450时,你将超过整数,浮点数和双数。(我相信这个数字约为4.9E93.6位整数在2E19左右用完,并且在此之前将整数分辨率提高一倍。