我需要运行一个非常时间的成本计划。该程序由多线程组成。但是当我在我的服务器上运行它(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使用率进行并行计算的演示。
答案 0 :(得分:0)
您的程序很可能受到切换线程成本的限制 - 它的工作量很少。在线程上开始工作的调用是最好的数千个周期的10个案例。通过比较计算20的斐波那契是微不足道的。
请记住斐波那契序列变得非常大,非常快。到达450时,你将超过整数,浮点数和双数。(我相信这个数字约为4.9E93.6位整数在2E19左右用完,并且在此之前将整数分辨率提高一倍。