使用GOMAXPROCS进行并行编程

时间:2016-04-08 05:43:02

标签: go parallel-processing

我看到有人将runtime.GOMAXPROCS设置为runtime.NumCPU()以启用 并行 处理。 Official documentation没有说明GOMAXPROCS的上限;我可以将它设置为任意正整数,或者它应该始终小于eq。到NumCPU值?

我尝试将其设置为大于 逻辑 核心#的数字,我的代码工作得很好

2 个答案:

答案 0 :(得分:3)

由于运行时与您的操作系统交互,因此大多数情况下您不需要混淆GOMAXPROCSGOMAXPROCS过去默认为1,但使用Go 1.5,它现在默认为NumCPU()

将其设置为高于NumCPU只会使调度程序更多(不必要)处理OS线程。

答案 1 :(得分:2)

最大值为256 ;但请注意,如果将其设置得更高,则不会出错。

https://golang.org/src/runtime/debug.go?s=534:560#L7

12  // GOMAXPROCS sets the maximum number of CPUs that can be executing
13  // simultaneously and returns the previous setting.  If n < 1, it does not
14  // change the current setting.
15  // The number of logical CPUs on the local machine can be queried with NumCPU.
16  // This call will go away when the scheduler improves.
17  func GOMAXPROCS(n int) int {
18      if n > _MaxGomaxprocs {
19          n = _MaxGomaxprocs
20      }
21      lock(&sched.lock)
22      ret := int(gomaxprocs)
23      unlock(&sched.lock)
24      if n <= 0 || n == ret {
25          return ret
26      }
27  
28      stopTheWorld("GOMAXPROCS")
29  
30      // newprocs will be processed by startTheWorld
31      newprocs = int32(n)
32  
33      startTheWorld()
34      return ret
35  }

Line 19将总数设置为_MaxGomaxprocs

哪个是......

https://golang.org/src/runtime/runtime2.go?h=_MaxGomaxprocs#L407

const (
    // The max value of GOMAXPROCS.
    // There are no fundamental restrictions on the value.
    _MaxGomaxprocs = 1 << 8
)

二进制形式的bitshift是100000000,1是int,在64位系统上Go使得为Int64,这意味着最大值为256 。 (在Go中具有int的32位系统将是int32,但是相同的值为256)

现在,只要将其设置为超过核心数量 - 这一切都取决于您正在发生的工作负载和CPU上下文切换(例如,您的程序强制发生了多少锁,或者您使用{{ 1}}无处不在等)。

请记住,如果需要发生,Golang会抽象出上下文切换。

基准测试是你的朋友。如果您的应用程序运行10,000个goroutine,几乎没有cpu上下文切换(遵循良好的设计模式),那么是将该吸盘碰到256并让它骑。如果你的应用程序窒息并通过上下文切换/线程创建了大量的CPU等待时间,那么将其设置为8或4,甚至可以让所有mutex.Lock()锁定进行调整。