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 并不总是会提高性能,实际上在某些情况下会降低性能。
我有一些 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 并不总是会提高性能,实际上在某些情况下会降低性能。