У меня один процессор с 4 физическими ядрами, и каждое ядро ​​имеет 2 потока. Но почему runtime.NumCPU () возвращает 4, а не 8? - PullRequest
0 голосов
/ 21 октября 2019

У меня один процессор с 4 физическими ядрами, и каждое ядро ​​имеет 2 потока. Но почему runtime.NumCPU () возвращает 4, а не 8?

Данные моего процессора:

Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
Address sizes:       39 bits physical, 48 bits virtual
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               78
Model name:          Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz

Когда я запускаю следующий код: fmt.Println(runtime.NumCPU())

, он выводит4.

Каждый аппаратный поток будет представлен программе Go как виртуальное ядро, поэтому на выходе должно быть 8, не так ли?

Но почему на выходе 4?

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Данные вашего процессора: CPU(s): 4. Это довольно очевидно.

Но для добавления математики:

Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1


Num CPU(s) = Num Socket(s) * Core(s) per socket * Thread(s) per core
           = 1             * 2                  * 2
           = 4

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

1 голос
/ 21 октября 2019

Ваш ЦП имеет два физических ядра, а не 4. Из листа информации о продукции Intel для процессора Intel® Core ™ i5-6200U :

# ядер 2

Количество потоков 4

Таким образом, значение NumCPU() для 4 является правильным.

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