Go 计算虚拟内核,而不是物理内核?

Go counts virtual cores, not physical?

我有一些 Go 代码正在我的 Macbook(具有两个物理内核的英特尔酷睿 i5 处理器)上进行基准测试。

Go 的 runtime.NumCPU() 产生 4,因为它计数 "virtual cores"

我对这方面的虚拟核心了解不多,但我的基准测试似乎表明,当我使用

配置我的代码时,多处理加速仅为 2 倍
runtime.GOMAXPROCS(runtime.NumCPU())

如果我使用 2 个而不是 4 个内核,我将获得相同的性能。我会 post 代码,但我认为这在很大程度上与我的问题无关,这些问题是:

1) 这正常吗?

2) 如果是的话,为什么多个虚拟内核对像我的 macbook 这样的机器有益?

更新:

以防万一,在我的代码中,goroutine 的数量与您设置的数量相同 runtime.GOMAXPROCS() 任务是完全并行的,没有相互依赖关系或共享状态。它 运行 作为本机编译的二进制文件。

1) is this normal?

如果您指的是 runtime.NumCPU() 中出现的虚拟核心,那么是的,至少在用 C 编写的程序以及那些 运行 在其他运行时(如 JVM)之上的程序的意义上将看到 the same number 个 CPU 个。如果您指的是性能,请参见下文。

2) why, if it is, do multiple virtual cores benefit a machine like my macbook?

这件事情很复杂,取决于工作量。其优势最明显的工作负载通常是高度并行的,例如 3D 渲染和某些类型的数据压缩。在其他工作负载中,可能没有好处,HT 对性能的影响可能是负面的(由于 运行 更多线程的通信和上下文切换开销)。阅读关于 hyper-threading 的维基百科文章可以进一步阐明问题。

Here 是一个示例基准,用于比较相同 CPU 使用和不使用 HT 的性能。请注意 HT 并不总是会提高性能,实际上在某些情况下会降低性能。