我见过有人将runtime.GOMAXPROCS设置为runtime.NumCPU()以便在运行时启用并行处理。 Official documentation没有说GOMAXPROCS的上限;我可以将其设置为任意正整数,还是应始终小于eq。到NumCPU值?

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

最佳答案

,最大为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
)

二进制形式的位移是100000000,而1是一个int,在64位系统上,Go使其成为Int64,这意味着的最大值为256 。 (Go中带有int的32位系统为int32,但相同的值为256)

现在,只要将其设置为比内核数更多的值,这全都取决于您的工作负载和正在发生的CPU上下文切换(例如,go程序强制执行多少次锁定,或者在各处使用mutex.Lock()等) 。

记住,如果需要,Golang会抽象掉上下文切换。

基准测试是您的 friend 。如果您的应用程序运行10,000个goroutine,而几乎没有cpu上下文切换(遵循良好的设计模式),则可以将“sucker”提高到256并让它运行。如果您的应用程序因上下文切换/线程而阻塞并创建了大量CPU等待时间,则将其设置为8或4,甚至在mutex锁定继续进行的情况下为它腾出空间。

关于go - 使用GOMAXPROCS进行并行编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36492356/

10-13 08:45