[memo] Linux で CPU の数を調べる

## はじめに

Linux 環境上で、CPU の数を調べたいことがあったのでメモ。

https://access.redhat.com/ja/solutions/2159401

## 物理 CPU の数

マシンによっては、物理的に複数の CPU を積んでいるものがある。

```shell-session
fgrep 'physical id' /proc/cpuinfo | sort -u | wc -l
```

## CPU コア数

最近の CPU では、物理的に 1 つの CPU 上に、複数のコアがあるものがある。

```shell-session
fgrep 'cpu cores' /proc/cpuinfo | sort -u | sed 's/.*: //'
```

## 論理プロセッサー数

最近の CPU では、ハイパースレッディングなどの機能を使って、1 つのコアで複数の処理をすることができる。

そのため、論理プロセッサー数は、物理 CPU 数×コア数よりも大きいことがある。

```shell-session
fgrep 'processor' /proc/cpuinfo | wc -l
```

## 簡易的なコマンド

物理的な CPU がすべて同じコア数で、ハイパースレッディングも同様とすると以下のような感じ？

```shell:cpucore.sh
#!/bin/bash

P_CPU=$( fgrep 'physical id' /proc/cpuinfo | sort -u | wc -l )
CORES=$( fgrep 'cpu cores' /proc/cpuinfo | sort -u | sed 's/.*: //' )
L_PRC=$( fgrep 'processor' /proc/cpuinfo | wc -l )
H_TRD=$(( L_PRC /  P_CPU / CORES ))

echo -n "${L_PRC} processer" ; [ "${L_PRC}" -ne 1 ] && echo -n "s"
echo -n " = ${P_CPU} socket" ; [ "${P_CPU}" -ne 1 ] && echo -n "s"
echo -n " x ${CORES} core"   ; [ "${CORES}" -ne 1 ] && echo -n "s"
echo -n " x ${H_TRD} thread" ; [ "${H_TRD}" -ne 1 ] && echo -n "s"
echo
```

```shell-session
$ cpucore.sh
8 processers = 1 socket x 4 cores x 2 threads
```

# lscpu コマンド

ちなみに、あとで知ったのですが `lscpu` というコマンドもあるようです。

```
$ lscpu
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):                          8
On-line CPU(s) list:             0-7
Thread(s) per core:              2
Core(s) per socket:              4
Socket(s):                       1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           142
Model name:                      Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
Stepping:                        10
CPU MHz:                         1799.998
BogoMIPS:                        3599.99
Virtualization:                  VT-x
Hypervisor vendor:               Microsoft
Virtualization type:             full
L1d cache:                       128 KiB
L1i cache:                       128 KiB
L2 cache:                        1 MiB
L3 cache:                        6 MiB
（以下略）
```

以下のあたりが同じ情報になると思います

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

# Windows で CPU の数を調べる

以下で上記と同じようにCPU数を調べることができるみたい。

https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-processor

C++やC#はもちろん、PowerShellやVBなどでも取得できそう。

とりあえずVBSの場合（あまり自信はないけど）

```vb:cpucore.vbs
Option Explicit

Dim locator, resultSet, processor
Dim nSocket, nCore, nThread, totalThread
Dim msg

nSocket = 0
totalThread = 0

Set locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set resultSet = locator.ConnectServer.ExecQuery("SELECT * FROM Win32_Processor")
nSocket = resultSet.count
For Each processor In resultSet
  nCore = processor.NumberOfCores
  nThread= processor.NumberOfLogicalProcessors / processor.NumberOfCores
  totalThread= totalThread + processor.NumberOfLogicalProcessors
Next

msg = totalThread& " processer"
If 1 < totalThread Then
  msg = msg & "s"
End If

msg = msg & " = " & nSocket & " socket"
If 1 < nSocket Then
  msg = msg & "s"
End If

msg = msg & " x " & nCore & " core"
If 1 < nCore Then
  msg = msg & "s"
End If

msg = msg & " x " & nThread& " thread"
If 1 < nThread Then
  msg = msg & "s"
End If

WScript.Echo msg

```