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

dom*_*ato 4 virtualization multiprocessing go hyperthreading

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

golang runtime.NumCPU()收益4,因为它算"虚拟核心"

在这种情况下,我对虚拟内核了解不多,但我的基准测试似乎表明,当我使用配置代码时,多处理速度只有2倍

runtime.GOMAXPROCS(runtime.NumCPU())
Run Code Online (Sandbox Code Playgroud)

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

1)这是正常的吗?

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

更新:

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

nwk*_*nwk 6

1)这是正常的吗?

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

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

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

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

  • 拥有这些虚拟内核的关键在于,当一个任务停止时(等待主内存或像浮点除法那样缓慢的事情),CPU可以尝试潜入另一个任务.它是否有帮助在一定程度上取决于你的代码是否有那么长的停顿(比如,添加一个很长的数字流可能不会)以及另一个线程是否确实使用了互补的CPU资源(例如所有线程上的所有浮点分区的加载)可能会受到核心的物理分隔,HT或否的限制. (2认同)
  • 作为其超级工作负载依赖性的另一个例子,有一个数据库工作负载的基准测试,它平均增加24%,但根据查询更少或更多:http://sqlblog.com/blogs/joe_chang/archive/ 2013/04/08 /超线程,performance.aspx (2认同)