并行代码 CPU 使用问题
Parallel Code CPU utilization issue
open System
open System.Diagnostics
open System.Threading.Tasks
open System.Collections
let computation input =
input|> Array.map (fun x-> sqrt(float x))|> ignore
let computation1 (input:int[]) =
input|> Array.map (fun x-> Convert.ToString(x,2)) |> ignore
let abc p =
for i in 1..50000 do
[|for i in 1..100000 -> i|]
|> computation
Parallel.For(0,100,fun x->abc 0) |>ignore
你好,
在上面的程序中,如果我 运行 在“abc()”中使用“computation()”的应用程序,我会看到 CPU 利用率为 70-80%.
但是在“abc()”中使用“computation1()”的相同代码,我只看到 20% CPU 利用率,我看到许多(一半的内核)内核处于空闲状态。
有人知道这种行为吗?
我的 CPU 规格:
Intel Xeon CPU @3.40Hz 启用超线程
核心总数:2 CPUs,每个 8 个核心 = 16
HT 的总内核数 = 2*16 = 32
使用探查器应该很容易找出答案,但在这种情况下答案很明显:
Convert.ToString
会大大限制您的性能,使其受内存限制并且(可能更重要),heap/GC-bound。
computation
几乎是纯粹的 CPU-作品。 computation1
为您执行的每一步都使用堆 - 这意味着频繁的内存访问(事实上,它甚至不能很好地使用 CPU 缓存,尽管 GC 压缩抵消了很多),并且频繁在堆上分配和收集字符串。堆和 GC 的性能相当高,但每秒 millions/billions 的字符串确实在推动它。大多数时候,你的代码被挂起是因为 GC 是 运行.
open System
open System.Diagnostics
open System.Threading.Tasks
open System.Collections
let computation input =
input|> Array.map (fun x-> sqrt(float x))|> ignore
let computation1 (input:int[]) =
input|> Array.map (fun x-> Convert.ToString(x,2)) |> ignore
let abc p =
for i in 1..50000 do
[|for i in 1..100000 -> i|]
|> computation
Parallel.For(0,100,fun x->abc 0) |>ignore
你好, 在上面的程序中,如果我 运行 在“abc()”中使用“computation()”的应用程序,我会看到 CPU 利用率为 70-80%.
但是在“abc()”中使用“computation1()”的相同代码,我只看到 20% CPU 利用率,我看到许多(一半的内核)内核处于空闲状态。
有人知道这种行为吗?
我的 CPU 规格: Intel Xeon CPU @3.40Hz 启用超线程 核心总数:2 CPUs,每个 8 个核心 = 16 HT 的总内核数 = 2*16 = 32
使用探查器应该很容易找出答案,但在这种情况下答案很明显:
Convert.ToString
会大大限制您的性能,使其受内存限制并且(可能更重要),heap/GC-bound。
computation
几乎是纯粹的 CPU-作品。 computation1
为您执行的每一步都使用堆 - 这意味着频繁的内存访问(事实上,它甚至不能很好地使用 CPU 缓存,尽管 GC 压缩抵消了很多),并且频繁在堆上分配和收集字符串。堆和 GC 的性能相当高,但每秒 millions/billions 的字符串确实在推动它。大多数时候,你的代码被挂起是因为 GC 是 运行.