Каков API среды выполнения для предоставления количества логических процессоров? - PullRequest
0 голосов
/ 06 мая 2020

Ниже UNIX команда:

$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1

показывает,

  CPU(s):              4
  Thread(s) per core:  2

, что составляет 4 X 2 = 8 логических процессоров. Поправьте меня.


Ниже еще одна Linux команда:

$ cat /proc/cpuinfo
processor   : 0
....
cpu cores   : 2
.....
processor   : 1
.....
cpu cores   : 2
.....
processor   : 2
.....
cpu cores   : 2
.....
processor   : 3
.....
cpu cores   : 2
.....
$ 

Но программа ниже показывает только 4 логических процессора:

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Println(runtime.GOMAXPROCS(0))   // gives 4
    fmt.Println(runtime.NumCPU())        // gives 4   
}

Вывод:

$ go install github.com/myhub/cs61a
$ bin/cs61a 
4
4
code$ 

Подробнее:

$ go version
go version go1.14.1 linux/amd64
$ uname -a
Linux mohet01-ubuntu 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Документация говорит:

NumCPU возвращает количество логических процессоров, используемых текущим процессом.


Насколько я понимаю,

Go планировщик создает потоки ОС (M), которые будут быть эквивалентным количеству логических процессоров.

Почему runtime api не выдает значение 8?

1 Ответ

2 голосов
/ 07 мая 2020

Согласно всем приведенным выше спискам, у вас есть:

  • два ядра на сокет
  • и один сокет

, что означает, что у вас есть только два ядра процессора. Однако у вас также есть:

  • два потока на ядро ​​

, что означает, что ваши два процессора могут запускать до четырех потоков одновременно (с некоторые потенциальные недостатки , но, по крайней мере, в большинстве случаев это должно предложить значительно большую вычислительную мощность, чем использование всего двух потоков).

Так как это фактический аппаратный предел, тот факт, что Go вычисляет число потоков для использования как 4 кажется правильным. случай: есть только два физических ядра, но каждое поддерживает два потока, поэтому Linux сообщает об этом как о четырех «процессорах».)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...