golang计算虚拟核心,而不是物理核心?

时间:2016-06-12 19:35:01

标签: go multiprocessing virtualization hyperthreading

我有一些golang代码我在我的Macbook(具有两个物理内核的Intel Core i5处理器)上进行基准测试。

golang runtime.NumCPU()产生4,因为它计算“虚拟核心”

我对此上下文中的虚拟内核了解不多,但我的基准测试表明,当我使用

配置代码时,多处理速度只有2倍
runtime.GOMAXPROCS(runtime.NumCPU())

如果我使用2而不是4核,我会获得相同的性能。我会发布代码,但我认为这与我的问题基本无关,这些问题是:

1)这是正常的吗?

2)为什么,如果是的话,多个虚拟核心能否像我的macbook这样的机器受益?

更新

如果它很重要,在我的代码中,与你设置runtime.GOMAXPROCS()的任何内容完全并行,没有相互依赖或共享状态的goroutine数量相同。它作为本机编译二进制文件运行。

1 个答案:

答案 0 :(得分:6)

  

1)这是正常的吗?

如果您的意思是虚拟核心出现在runtime.NumCPU()中,那么是的,至少在某种意义上说,用C语言编写的程序以及运行在其他运行时(如JVM)之上的程序将会看到{{3} CPU的。如果您的意思是表现,请参阅下文。

  

2)为什么,如果是的话,多个虚拟核心能否像我的macbook这样的机器受益?

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

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